<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title><![CDATA[Серый форум &mdash; Windows Script Host, HTA (VBScript, JScript)]]></title>
		<link>https://forum.script-coding.com/index.php</link>
		<atom:link href="https://forum.script-coding.com/extern.php?action=feed&amp;fid=5&amp;type=rss" rel="self" type="application/rss+xml" />
		<description><![CDATA[Недавние темы раздела «Серый форум».]]></description>
		<lastBuildDate>Sun, 22 May 2022 11:59:09 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[JScript: способ определения среды WSH]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?id=17140&amp;action=new</link>
			<description><![CDATA[<p>Случайно найдено здесь: <a href="https://stackoverflow.com/a/64654919/3627676">https://stackoverflow.com/a/64654919/3627676</a>:<br /></p><div class="codebox"><pre><code>
if ( /*@cc_on !@*/0 ) {
	WScript.StdOut.WriteLine(&quot;Hello from JScript&quot;);
} else {
	console.log(&#039;Hello from NodeJS&#039;);
}
</code></pre></div><p>Код выше позволяет быстро и просто определить WSH. Может пригодиться, если по каким-то причинам вам необходимо запускать скрипты в разных окружениях (WSH, NodeJS или какой-то другой, например, Rhino).</p><p>Чтобы различать другие окружения (например, NodeJS от Rhino) потребуются дополнительные <a href="https://ru.wikipedia.org/wiki/Утиная_типизация">&quot;утиные&quot; проверки</a>.</p>]]></description>
			<author><![CDATA[null@example.com (Rumata)]]></author>
			<pubDate>Sun, 22 May 2022 11:59:09 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?id=17140&amp;action=new</guid>
		</item>
		<item>
			<title><![CDATA[VBScript: dynwrap.dll & Excel.Application - перебор окон]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?id=13759&amp;action=new</link>
			<description><![CDATA[<p><em>Без гарантий. Используете на свой страх и риск.</em></p><p>Перебор окон в VBScript с помощью объекта <a href="http://www.script-coding.com/dynwrap.html">DynamicWrapper</a>. Функция обратного вызова построена на использовании <a href="http://www.script-coding.com/MSOffice.html">MS Excel как COM-сервера</a> и вызывает целевую функцию из VBScript.</p><p>Lang VBScript<br />Потребуется установленный MS Office со средой VBE<br />Потребуется библиотека <a href="http://www.script-coding.com/dynwrap.html">dynwrap.dll</a> <a href="http://www.script-coding.com/dynwrapNT.zip">[NT версия]</a><br />Тестировалось на Win7</p><div class="codebox"><pre><code>
 &#039;------------------------------------------------------------- 
 &#039; Перебор окон в VBScript с помощью объекта DynamicWrapper.
 &#039; Функция обратного вызова построена на использовании MS 
 &#039; Excel как COM-сервера и вызывает целевую функцию из VBScript.
 &#039;
 &#039; Lang VBScript
 &#039; Потребуется установленный MS Office со средой VBE
 &#039; Потребуется библиотека dynwrap.dll (http://www.script-coding.com/dynwrap.html)
 &#039; Тестировалось на Win7
 &#039;------------------------------------------------------------- 
 Option Explicit

 Dim objExcel, objWorkBook, objModule, oVBComps, oExWrap 
 Dim lAddr

 Set objExcel = CreateObject(&quot;Excel.Application&quot;)
 objExcel.Visible = False
 Set objWorkBook = objExcel.WorkBooks.Add


 &#039; Формирование кода Excel 
 &#039;------------------------------------------------------------- 
 &#039; Set oVBComps = objExcel.VBE.ActiveVBProject.VBComponents
 &#039; равнозначно
 Set oVBComps = objWorkBook.VBProject.VBComponents

 Set objModule = oVBComps.Add(1)

 With objModule.CodeModule
	.InsertLines 1,	&quot;Option Explicit&quot;
	.InsertLines 2,	&quot;Declare Sub MoveMem Lib &quot;&quot;kernel32&quot;&quot; _&quot;
	.InsertLines 3,	&quot;Alias &quot;&quot;RtlMoveMemory&quot;&quot; (ByRef Destination As Long, _&quot;
	.InsertLines 4,	&quot;                        ByRef Source As Long, _&quot;
	.InsertLines 5,	&quot;                        ByVal Length As Long)&quot;
	.InsertLines 6,	&quot;Dim oMe As Object&quot;
	.InsertLines 7, &quot;Function SetContext(ByVal o As Object) As Object&quot;
	.InsertLines 8,&quot;	Set oMe = o&quot;
	.InsertLines 9,	&quot;	Set SetContext = CreateObject(&quot;&quot;DynamicWrapper&quot;&quot;)&quot;
	.InsertLines 10,&quot;End Function&quot;
	.InsertLines 11,&quot;&#039;//Получить адрес функции обратного вызова//&quot;
	.InsertLines 12,&quot;Function GetEnumProcAddress() As Long&quot;
	.InsertLines 13,&quot;	GetEnumProcAddress = 0&quot;
	.InsertLines 14,&quot;	MoveMem GetEnumProcAddress, AddressOf ENUMPROC_CALLER, 4&quot;
	.InsertLines 15,&quot;End Function&quot;
	.InsertLines 16,&quot;&#039;//Функция обратного вызова, которая вызывает целевую функцию из VBScript//&quot;
	.InsertLines 17,&quot;Function ENUMPROC_CALLER(ByVal hwnd As Long, ByVal lParam As Long) As Long&quot;
	.InsertLines 18,&quot;	ENUMPROC_CALLER = oMe.ENUMPROC(hwnd, lParam)	 &quot;
	.InsertLines 19,&quot;End Function&quot;
 End With

 &#039;/Адрес функции обратного вызова/
 lAddr = objExcel.Application.Run(&quot;GetEnumProcAddress&quot;)
 
 &#039;/Регистрация API/
 Set oExWrap = objExcel.Application.Run(&quot;SetContext&quot;, Me)
 oExWrap.Register &quot;USER32.DLL&quot;,&quot;EnumWindows&quot;,&quot;i=ll&quot;,&quot;f=s&quot;,&quot;r=l&quot;

 &#039; Запуск перебора окон
 &#039;-------------------------------------------------------------
 oExWrap.EnumWindows lAddr, 0
 
 &#039; Завершение работы
 &#039;-------------------------------------------------------------
 oVBComps.Remove objModule 

 objExcel.DisplayAlerts = False
 objExcel.Quit()
 WScript.Quit()
 

 &#039; Целевая функция обратного вызова, вызываемая из потока Excel
 &#039;-------------------------------------------------------------
 Public Function ENUMPROC(ByVal hwnd, ByVal lParam)

	Dim sH
	Dim iAnsw

	sH = Hex(hwnd)
	iAnsw = MsgBox(&quot;Дескриптор окна: 0x&quot; &amp; String(8-Len(sH),&quot;0&quot;) &amp; sH, vbOKCancel + vbSystemModal + vbExclamation, &quot;HWND&quot;)
	If iAnsw = vbCancel Then 
		ENUMPROC = 0
	Else
		ENUMPROC = 1
	End If

 End Function
</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (Poltergeyst)]]></author>
			<pubDate>Sun, 03 Jun 2018 14:41:32 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?id=13759&amp;action=new</guid>
		</item>
		<item>
			<title><![CDATA[JScript: Воспроизведение mp3 с помощью команд MCI]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?id=11490&amp;action=new</link>
			<description><![CDATA[<p><em>Без гарантий, используете на свой страх и риск.</em></p><p>Воспроизведение mp3 файла с помощью команд MCI. Чтобы проиграть mp3 файл, нужно перетащить его на значок скрипта. Текущая позиция воспроизведения устанавливается щелчком по индикатору прогресса в окне Internet Explorer.</p><p>Потребуется зарегистрированная библиотека <a href="http://forum.script-coding.com/viewtopic.php?id=8082">scrsvc.dll</a>(желательно использовать последнюю выкладку).</p><p>P.S.: <br />К сожалению, при открытии отдельных mp3 файлов, команда MCI &#039;open&#039; дает сбой, что видимо зависит от компрессора, которым сжимался тот или иной mp3.</p><p>ОС WinXP</p><p><strong>mp3play.js</strong><br /></p><div class="codebox"><pre><code>
 /* 

 Воспроизведение mp3 файла с помощью команд MCI. 
 JScript
 ОС WinXP

 */

 // Проверка аргументов
 //----------------------------------------------------------
 var sFileMp3Long;
 var lStrLen;
 var sFilePlay;

 var args = WScript.Arguments
 if (args.Length)
 { 
	sFileMp3Long = String(args.Item(0));
	lStrLen = sFileMp3Long.length;
	sFilePlay = sFileMp3Long.substring(sFileMp3Long.lastIndexOf(&#039;\\&#039;,lStrLen) + 1,lStrLen);

 }
 else
 {
	WScript.Echo(&#039;Отсутствует входной аргумент - mp3 файл для воспроизведения.&#039;);
	WScript.Quit();
 }

 // Создание объектов
 //----------------------------------------------------------
 var oScrSvc = new ActiveXObject(&#039;ScriptService.Service&#039;);
 var ieObj = WScript.CreateObject(&#039;InternetExplorer.Application&#039;,&#039;IE_&#039;);

 with (ieObj)
 {
 	Offline = true;
	Navigate(&#039;about:blank&#039;);
	while (Busy){WScript.Sleep(50);}
	StatusBar = false;
	ToolBar = false;
	MenuBar = false;
	Left = 0;
	Top = 0;
	Width = 420;
	Height = 50;
	Visible = true;
	while (Busy){WScript.Sleep(50);}
 }

 // Внедрение кода в документ
 //----------------------------------------------------------
 var oDoc = ieObj.Document;

 var s = new String(string_resource1);
 var r = /(function.+\s*{\s*)|(\/\*\s*)|(\s*\*\/)|(\s*})/igm;
 var sInnerCode = s.replace(r,&#039;&#039;);
 oDoc.write(sInnerCode);
 
 // Внедрение скрипта в документ
 //----------------------------------------------------------
 oDoc.myproperty = this;
 var oScr = oDoc.createElement(&#039;SCRIPT&#039;);
 oScr.text = &#039;function pulseinvoke(){document.myproperty.PulseTimer();}\n\rfunction document.onclick(){document.myproperty.SetPosition(event.offsetX);}&#039;
 oDoc.body.appendChild(oScr);
 var oPr = oDoc.getElementById(&#039;progress&#039;);
 
 //----------------------------------------------------------
 var sRetStr1 = AllocStr(32);
 var pRetStr1 = oScrSvc.struct_setval(sRetStr1);
 var lPos, lCur, lLength;

 // Отправка команд воспроизведения файла
 //----------------------------------------------------------
 mcisend(&#039;open&#039;+String.fromCharCode(32) + &#039;&quot;&#039; + sFileMp3Long + &#039;&quot;&#039; + String.fromCharCode(32)+&#039;type MPEGVideo alias mp3play&#039;,false);
 mcisend(&#039;setaudio mp3play volume to 1000&#039;, false);
 mcisend(&#039;set mp3play time format milliseconds&#039;, false);
 mcisend(&#039;set mp3play seek exactly on&#039;, false);
 lLength = Number(mcisend(&#039;status mp3play length&#039;, true));

 oDoc.parentWindow.setInterval(&#039;pulseinvoke()&#039;,100);
 oDoc.title = sFilePlay;

 initplay();
 
 // Цикл удержания
 //----------------------------------------------------------
 while (1)
 {
	WScript.Sleep(500);
 }

 //
 // Запуск воспроизведения
 //
 //----------------------------------------------------
 function initplay()
 {
 	mcisend(&#039;seek mp3play to 400&#039;, false);
	mcisend(&#039;play mp3play&#039;, false);
 } 

 //
 // Установка индикатора воспроизведения
 //
 //----------------------------------------------------------
 function PulseTimer()
 {
	try
	{
		lPos = Number(mcisend(&#039;status mp3play position&#039;, true));
		lCur = Math.round((lPos/lLength)*400);
		oPr.style.width = lCur;
	}
	catch(e){}

	// Перезапуск
	//--------------------------------------------------
	if (lCur==400)
	{
		WScript.Sleep(100);
		initplay();
	}

 }

 //
 // Установка позиции воспроизведения
 //
 //----------------------------------------------------------
 function SetPosition(lX)
 {
	oPr.style.width = Number(lX);
	mcisend(String(&#039;seek mp3play to &#039; + Math.round((lX/400)*lLength)), false);
	mcisend(&#039;play mp3play repeat&#039;, false);
 }

 //
 // Отправка команды MCI
 //
 //----------------------------------------------------------
 function mcisend(sCmd, bf)
 {

	
	//---------------------------------------------------
	if (bf)
	{
		sRetStr = sRetStr1;
		pRetStr = pRetStr1;
	}
	else
	{
		sRetStr	= &#039;&#039;;
		pRetStr = 0;
	}

	//---------------------------------------------------
	with (oScrSvc)
	{
		set_strarg(0, sCmd, true);
		set_vararg(1, pRetStr);
		set_vararg(2, Number(sRetStr.length));
		set_vararg(3, 0);
		lRes = api_call(&#039;WINMM.DLL&#039;,&#039;mciSendStringW&#039;,4, 1);	//1 - индекс повторного вызова(запоминание адреса функции)
	}

	//---------------------------------------------------
	if (lRes!=0)
	{
		WScript.Echo(&#039;Произошла ошибка.\n\rКоманда: &#039;+sCmd);
		ieObj.Quit();
		WScript.Sleep(100);
		
	}
	//---------------------------------------------------
	if (bf){return oScrSvc.pull_string(pRetStr, true);}

	return;
	
 }

 //
 // Выделение строки заданной длины
 //
 //----------------------------------------------------------
 function AllocStr(lStrLen)
 {
	var sStr = &#039;\0&#039;;
	for (i=0;i&lt;lStrLen-1;i++)
	sStr = sStr + &#039;\0&#039;;
	return sStr;
 }
 
 //
 // Завершение работы
 //
 //----------------------------------------------------------
 function IE_OnQuit()
 {
	mcisend(&#039;stop mp3play&#039;, false);
	mcisend(&#039;close mp3play&#039;, false);
	oScrSvc = null;
	ieObj = null;
	WScript.Quit();
 }

 // HTML код
 //----------------------------------------------------------
 function string_resource1()
 {/*
 &lt;HTML&gt;
 &lt;TITLE&gt;&amp;nbsp&lt;/TITLE&gt;
 &lt;HEAD&gt;
 &lt;META HTTP-EQUIV=Content-Type content=&#039;text/html;charset=windows-1251&#039;&gt;
 &lt;/HEAD&gt;
 &lt;BODY SCROLL=&quot;NO&quot;&gt;
	&lt;HR ID=&#039;progress&#039; style=&#039;position: absolute; left: 0px; top:0px; width: 400px; height:20px; background-color: #808000;&#039;&gt;
	&lt;HR ID=&#039;set&#039; style=&#039;position: absolute; left: 0px; top:30px; width: 400px; height:5px; background-color: #c0c0c0;&#039;&gt;
 &lt;/BODY&gt;
 &lt;/HTML&gt;
 */}

</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (Poltergeyst)]]></author>
			<pubDate>Mon, 11 Apr 2016 16:37:45 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?id=11490&amp;action=new</guid>
		</item>
		<item>
			<title><![CDATA[VBScript & COM: Установка обоев на Рабочий стол]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?id=10462&amp;action=new</link>
			<description><![CDATA[<p><em>Без гарантий. Используете на свой страх и риск.</em><br />Скрипт предназначен для установки обоев на Рабочий стол, и основан на вызове функций интерфейса IActiveDesktop средствами COM API. Чтобы установить новые обои, перетащите изображение GIF, JPG или BMP на значок скрипта.</p><p>Потребуется зарегистрированная библиотека <a href="http://forum.script-coding.com/viewtopic.php?id=8082">scrsvc.dll(актуальная версия для этого скрипта 1.2.2)</a>(желательно использовать самую последнюю, свежую выкладку).<br />ОС WinXP/7</p><p><strong>SetWallpaper.vbs</strong><br /></p><div class="codebox"><pre><code>
 
 &#039;Скрипт предназначен для установки обоев на Рабочий стол,
 &#039;и основан на вызове функций интерфейса IActiveDesktop 
 &#039;средствами COM API.

 &#039;Чтобы установить новые обои, перетащите изображение GIF, JPG или BMP
 &#039;на значок скрипта.
 
 &#039;ОС WinXP/7

 Option Explicit
 &#039;---------------------------------------------------------------
 Dim sWallPaperPath
 Dim oArgs
 Dim oScrSvc

 Set oArgs = WScript.Arguments
 If oArgs.Length = 0 Then
	MsgBox &quot;Чтобы установить новые обои, перетащите изображение GIF, JPG или BMP на значок скрипта.&quot;, _
	vbExclamation + vbSystemModal, _
	&quot;Reply&quot;
	QuitMe()
 Else
 	sWallPaperPath = CStr(oArgs.Item(0))	
 End If

 &#039;---------------------------------------------------------------
 Set oScrSvc = CreateObject(&quot;ScriptService.Service&quot;)

 &#039;Интерфейс [IActiveDesktop]
 &#039;---------------------------------------------------------------
 Const CLSID_IActiveDesktop = &quot;{75048700-EF1F-11D0-9888-006097DEACF9}&quot;
 Const UUID_IActiveDesktop = &quot;{F490EB00-1240-11D1-9888-006097DEACF9}&quot;

 &#039;Методы интерфейса IActiveDesktop;
 Const ApplyChanges = 3
 Const GetWallpaper = 4
 Const SetWallpaper = 5
 Const GetWallpaperOptions = 6     
 Const SetWallpaperOptions = 7    
 Const GetPattern = 8          
 Const SetPattern = 9             
 Const GetDesktopItemOptions = 10 
 Const SetDesktopItemOptions = 11  
 Const AddDesktopItem = 12         
 Const AddDesktopItemWithUI = 13   
 Const ModifyDesktopItem = 14      
 Const RemoveDesktopItem = 15   
 Const GetDesktopItemCount = 16    
 Const GetDesktopItem = 17       
 Const GetDesktopItemByID = 18    
 Const GenerateDesktopItemHtml = 19
 Const AddUrl = 20               
 Const GetDesktopItemBySource = 21

 &#039;Параметры установки обоев
 Const WPSTYLE_CENTER = 0
 Const WPSTYLE_TILE = 1
 Const WPSTYLE_STRETCH = 2
 
 Const CLSCTX_INPROC_SERVER = 1
 Const CC_STDCALL = 4
 Const S_OK = 0

 &#039;/Выбор параметров установки/
 &#039;---------------------------------------------------------------
 Dim i
 Dim r
 Dim GUID1, GUID2
 Dim pVarRes
 Dim pWALLPAPEROPT
 Dim VftPtr
 Dim IActiveDesktop, lData, p
 Dim pSetWallpaper, pApplyChanges, pSetWallpaperOptions

 Dim WPSTYLE_CHOICE
 Dim arr(4)
 Dim arr1(4)
 Dim arrRet

 arr(0) = &quot;Центрировать&quot;
 arr(1) = &quot;Замостить&quot;
 arr(2) = &quot;Растянуть&quot;

 arr1(0) = WPSTYLE_CENTER
 arr1(1) = WPSTYLE_TILE
 arr1(2) = WPSTYLE_STRETCH

 arrRet = oScrSvc.multi_dialog(arr)

 If Ubound(arrRet)=-1 Then QuitMe()
 If Ubound(arrRet) &gt; 0 Then
	MsgBox &quot;Допустим выбор только одного параметра.&quot;, vbExclamation + vbSystemModal, &quot;Reply&quot;
	QuitMe()
 End If

 For i=0 To UBound(arr)
	If StrComp(arrRet(0),arr(i)) = 0 Then WPSTYLE_CHOICE = arr1(i)
 Next

 &#039;/Запрос интерфейса IActiveDesktop и вызов его функций/
 &#039;---------------------------------------------------------------
 With oScrSvc

	&#039;Выделение памяти
	&#039;-------------------------------------------------------
 	GUID1 = .struct_setval(String(8,Chr(32)))		&#039;8*2=16 итоговое количество байт
 	GUID2 = .struct_setval(String(8,Chr(32)))		&#039;8*2=16 итоговое количество байт
 	pVarRes = .struct_setval(String(2,Chr(32)))		&#039;2*2=4 итоговое количество байт
	pWALLPAPEROPT = .struct_setval(String(4,Chr(32)))	&#039;4*2=8 итоговое количество байт
	&#039;-------------------------------------------------------
 
		.set_vararg 0, 0
		.api_call &quot;OLE32.DLL&quot;,&quot;CoInitialize&quot;, 1

	&#039;Запрос интерфейса
	&#039;-------------------------------------------------------
	.set_strarg 0, CLSID_IActiveDesktop, True	
	.set_vararg 1, GUID1
	r = .api_call(&quot;OLE32.DLL&quot;,&quot;CLSIDFromString&quot;,2)
	
	.set_strarg 0, UUID_IActiveDesktop, True
	.set_vararg 1, GUID2
	r = .api_call(&quot;OLE32.DLL&quot;,&quot;CLSIDFromString&quot;,2)

	.set_vararg 0, GUID1
	.set_vararg 1, 0
	.set_vararg 2, CLSCTX_INPROC_SERVER
	.set_vararg 3, GUID2
	.set_vararg 4, pVarRes
	r = .api_call(&quot;OLE32.DLL&quot;,&quot;CoCreateInstance&quot;,5)

	&#039;-------------------------------------------------------
	IActiveDesktop = .struct_getval(pVarRes, 0, 4)
	
	&#039;Получение адресов функций из vtable
	&#039;-------------------------------------------------------
	VftPtr = .struct_getval(IActiveDesktop, 0, 4)

	pSetWallpaper = .struct_getval(VftPtr, 4 * SetWallpaper, 4)
	pApplyChanges = .struct_getval(VftPtr, 4 * ApplyChanges, 4)	
	pSetWallpaperOptions = .struct_getval(VftPtr, 4 * SetWallpaperOptions, 4)	

	&#039;Вызов интерфейсных функций, установка обоев рабочего стола
	&#039;-------------------------------------------------------
	&#039;-------------------------------------------------------

	&#039;----------- Выбор обоев
	.set_vararg 0, IActiveDesktop
	.set_vararg 1, .struct_setval(sWallPaperPath)
	.set_vararg 2, 0
	.api_direct_call pSetWallpaper, 3

	&#039;----------- Установка параметров
	.struct_setval pWALLPAPEROPT, 8, 0, 4
	.struct_setval pWALLPAPEROPT, WPSTYLE_CHOICE, 4, 4

	.set_vararg 0, IActiveDesktop
	.set_vararg 1, pWALLPAPEROPT
	.set_vararg 2, 0
	.api_direct_call pSetWallpaperOptions, 3

	&#039;----------- Применение изменений
	.set_vararg 0, IActiveDesktop
	.set_vararg 1, 7
	.api_direct_call pApplyChanges, 2
	&#039;-------------------------------------------------------

		.api_call &quot;OLE32.DLL&quot;,&quot;CoUninitialize&quot;,0


	&#039;-------------------------------------------------------
	WScript.Sleep(50)
	MsgBox &quot;Проверьте правильность установки обоев Рабочего стола.&quot;, vbInformation + vbSystemModal, &quot;Reply&quot;
	QuitMe()

 End With

 &#039;/Проверка ошибки/
 &#039;---------------------------------------------------------------
 Sub CheckResult(x, sSource)
	If x &lt;&gt; S_OK Then
		MsgBox &quot;Сбой выполнения. Источник&quot; &amp; sSource, vbSystemModal + vbExclamation, &quot;Error&quot;
		QuitMe()
	End If
 End Sub

 &#039;/Завершение работы/
 &#039;---------------------------------------------------------------
 Sub QuitMe()
	Set oScrSvc = Nothing
	WScript.Quit()
 End Sub
</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (Poltergeyst)]]></author>
			<pubDate>Sun, 01 Mar 2015 01:50:40 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?id=10462&amp;action=new</guid>
		</item>
		<item>
			<title><![CDATA[VBScript & COM: Очистка истории Проводника]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?id=10461&amp;action=new</link>
			<description><![CDATA[<p><em>Без гарантий. Используете на свой страх и риск.</em><br />Скрипт предназначен для очистки журнала истории Проводника и Internet Explorer, и основан на вызове функций интерфейса IUrlHistoryStg2 средствами COM API.</p><p>Потребуется зарегистрированная библиотека <a href="http://forum.script-coding.com/viewtopic.php?id=8082">scrsvc.dll</a><br />ОС WinXP/7</p><p><strong>ClearHistory.vbs</strong><br /></p><div class="codebox"><pre><code>
 
 &#039;Скрипт предназначен для очистки журнала истории Internet Explorer,
 &#039;и основан на вызове интерфейса IUrlHistoryStg2 средствами COM API.
 &#039;ОС WinXP/7

 Option Explicit 

 Dim iAnsw
 Dim oScrSvc, oShellApp
 Dim r
 Dim sPath
 Dim oWindow
 Dim GUID1, GUID2, pVarRes
 Dim lData
 
 &#039;/Контрольное сообщение/
 &#039;---------------------------------------------------------------
 iAnsw = MsgBox(&quot;Очистить журнал Explorer?&quot;, vbYesNo + vbSystemModal + vbInformation, &quot;Очистка журнала&quot;)
 If iAnsw = vbNo Then QuitMe()
 
 &#039;Интерфейс [IUrlHistoryStg2]
 &#039;---------------------------------------------------------------
 Const CLSID_Url = &quot;{3C374A40-BAE4-11CF-BF7D-00AA006946EE}&quot;
 Const UUID_IUrlHistoryStg2 = &quot;{AFA0DC11-C313-11D0-831A-00C04FD5AE38}&quot;

 &#039;Методы интерфейса IUrlHistoryStg2;
 Const IUrlHistoryStg2_Release = 8
 Const IUrlHistoryStg2_ClearHistory = 36

 Const CLSCTX_INPROC_SERVER = 1
 Const CC_STDCALL = 4
 Const S_OK = 0

 &#039;---------------------------------------------------------------
 Set oScrSvc = CreateObject(&quot;ScriptService.Service&quot;)
 Set oShellApp = CreateObject(&quot;Shell.Application&quot;)

 &#039;---------------------------------------------------------------
 
 sPath = WScript.ScriptFullName
 sPath = Left(sPath,InStrRev(sPath,&quot;\&quot;) - 1)

	&#039;/Навигация, поиск заданного окна Shell Explorer и отображение журнала/
	&#039;-------------------------------------------------------
	oShellApp.Open sPath

	For Each oWindow In oShellApp.Windows
		If InStr(1, LCase(TypeName(oWindow.Document)), &quot;ishellfolderviewdual&quot;) &lt;&gt; 0 Then
			If StrComp(oWindow.Document.Folder.Self.Path, sPath, 1) = 0 Then
				oWindow.Application.ShowBrowserBar &quot;{EFA24E62-B078-11D0-89E4-00C04FC9E26E}&quot;, True
				Exit For
			End If
		End If
	Next            
	WScript.Sleep(500) 	


&#039;/Запрос интерфейса IUrlHistoryStg2 и вызов его функций/
&#039;---------------------------------------------------------------
 With oScrSvc

	&#039;Выделение памяти
	&#039;-------------------------------------------------------
 	GUID1 = .struct_setval(String(8,Chr(32)))	&#039;8*2=16 итоговое количество байт
 	GUID2 = .struct_setval(String(8,Chr(32)))	&#039;8*2=16 итоговое количество байт
 	pVarRes = .struct_setval(String(2,Chr(32)))	&#039;2*2=4 итоговое количество байт
 
	&#039;-------------------------------------------------------
		.set_vararg 0, 0
		.api_call &quot;OLE32.DLL&quot;,&quot;CoInitialize&quot;, 1

	&#039;Запрос интерфейса
	&#039;-------------------------------------------------------
	.set_strarg 0, CLSID_Url, True	
	.set_vararg 1, GUID1
	r = .api_call(&quot;OLE32.DLL&quot;,&quot;CLSIDFromString&quot;,2)
	CheckResult r, &quot;CLSIDFromString&quot;

	.set_strarg 0, UUID_IUrlHistoryStg2, True
	.set_vararg 1, GUID2
	r = .api_call(&quot;OLE32.DLL&quot;,&quot;CLSIDFromString&quot;,2)
	CheckResult r, &quot;CLSIDFromString&quot;

	.set_vararg 0, GUID1
	.set_vararg 1, 0
	.set_vararg 2, CLSCTX_INPROC_SERVER
	.set_vararg 3, GUID2
	.set_vararg 4, pVarRes
	r = .api_call(&quot;OLE32.DLL&quot;,&quot;CoCreateInstance&quot;,5)
	CheckResult r, &quot;CoCreateInstance&quot;

	lData = .struct_getval(pVarRes, 0, 4)

	&#039;Вызов интерфейсных функций, очистка журнала
	&#039;-------------------------------------------------------
	DispCall lData, IUrlHistoryStg2_ClearHistory
	DispCall lData, IUrlHistoryStg2_Release

	&#039;-------------------------------------------------------
		.api_call &quot;OLE32.DLL&quot;,&quot;CoUninitialize&quot;,0
	&#039;-------------------------------------------------------
	WScript.Sleep(50)
	MsgBox &quot;Журнал очищен.&quot;, vbSystemModal + vbInformation, &quot;Очистка журнала&quot;
	QuitMe()
	
 End With

&#039;/Вызов функции интерфейса без аргументов/
&#039;---------------------------------------------------------------
Function DispCall(lClass, iMethod)
 
 Dim res
 res = oScrSvc.struct_setval(String(2,Chr(32)))	&#039;2*2=4 итоговое количество байт
 With oScrSvc
	
 	.set_vararg 0, lClass
	.set_vararg 1, iMethod
	.set_vararg 2, CC_STDCALL
	.set_vararg 3, 0
	.set_vararg 4, 0
	.set_vararg 5, 0
	.set_vararg 6, 0
	.set_vararg 7, res

	r = .api_call(&quot;OLEAUT32.DLL&quot;,&quot;DispCallFunc&quot;,8)
	DispCall = .struct_getval(res, 0, 4)

 End With
 CheckResult r, &quot;DispCallFunc&quot;

End Function

&#039;/Проверка ошибки/
&#039;---------------------------------------------------------------
Sub CheckResult(x, sSource)
	If x &lt;&gt; S_OK Then
		MsgBox &quot;Сбой выполнения. Источник&quot; &amp; sSource, vbSystemModal + vbExclamation, &quot;Error&quot;
		QuitMe()
	End If
End Sub

&#039;/Завершение работы/
&#039;---------------------------------------------------------------
Sub QuitMe()
	Set oShellApp = Nothing
	Set oScrSvc = Nothing
	WScript.Quit()
End Sub
</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (Poltergeyst)]]></author>
			<pubDate>Sun, 01 Mar 2015 01:45:12 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?id=10461&amp;action=new</guid>
		</item>
		<item>
			<title><![CDATA[HTA: Отслеживание USB накопителя]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?id=10181&amp;action=new</link>
			<description><![CDATA[<p><em>Без гарантий. Используете на свой страх и риск.</em></p><p>Скрипт предназначен для слежения за подключением/отключением Flash USB накопителя и основан на интерфейсе WMI. События подключения, останова и физического извлечения накопителя, подтверждаются соответствующими сообщениями. Желательно запускать скрипт при включенном и опознанном накопителе, либо при программно остановленном и удаленном из USB разъема компьютера.</p><p>Lang. HTA + VBScript<br />OC WinXP</p><p><strong>usbwatch.hta</strong><br /></p><div class="codebox"><pre><code>
&lt;HTML&gt;
&lt;TITLE&gt;USB Watch&lt;/TITLE&gt;
&lt;HEAD&gt;
&lt;META HTTP-EQUIV=Content-Type content=&#039;text/html;charset=windows-1251&#039;&gt;
&lt;HTA:APPLICATION
CAPTION=&#039;YES&#039;
CONTEXTMENU=&#039;NO&#039;
INNERBORDER=&#039;NO&#039;        
NAVIGABLE=&#039;NO&#039;        
SELECTION=&#039;NO&#039;        
SHOWINTASKBAR=&#039;YES&#039;    
SINGLEINSTANCE=&#039;YES&#039;    
SYSMENU=&#039;YES&#039;
WINDOWSTATE=&#039;normal&#039; 
/&gt;

&lt;STYLE type=text/css&gt;
BODY {cursor: hand; background-color: #c0c0c0;}

INPUT.headbtn     {
            position: absolute;
            left: 10px; 
            width: 150px; 
            height: 20px; 
            border: 1px;
            border-style: outset;
            background-color: #c0c0c0;
            font-family: MS Sans Serif; 
            font-size: 11px;
            font-weight: bold;
            cursor: hand; 
            
        }

&lt;/STYLE&gt;
&lt;/HEAD&gt;

&lt;BODY SCROLL=&quot;NO&quot;&gt;

    &lt;!---------------------------------------------------------------------------------&gt;
    &lt;OBJECT ID=&quot;ObjSink&quot; 
        STYLE=&quot;position:absolute;top:0;left:0;width:0;height:0&quot;
        CLASSID=&quot;CLSID:75718C9A-F029-11D1-A1AC-00C04FB6C223&quot;&gt;
    &lt;/OBJECT&gt;
    
    &lt;INPUT TYPE=BUTTON ID=&#039;btn1&#039; 
            class=&#039;headbtn&#039; 
            VALUE=&#039;Извлечь&#039; style=&#039;top: 10px;&#039;
            onclick=&#039;UnplugDialog()&#039;&gt;
    &lt;P&gt;
    &lt;INPUT TYPE=BUTTON ID=&#039;btn2&#039;
            class=&#039;headbtn&#039; 
            VALUE=&#039;Выход&#039; style=&#039;top: 40px;&#039;
            onclick=&#039;window.close();&#039;&gt;
    &lt;!---------------------------------------------------------------------------------&gt;
    &lt;SCRIPT LANGUAGE=&quot;VBScript&quot;&gt;

        Public StateFlag
        Public sPrevDrivesStr
        Public objService, objProc

        Set objService = GetObject(&quot;winmgmts:root\cimv2&quot;)
        Set objProc = objService.Get(&quot;Win32_Process&quot;)
        
        lW = window.screen.width
        lH = window.screen.height
            window.moveTo lW - 180, 0
            window.resizeTo 180, 100
        
        StateFlag = False
        GetDriveLetter False    &#039;Определение первоначального состояния съемных накопителей

        &#039;/Выполнить запрос асинхронного отслеживания WMI/
        &#039;---------------------------------------------------------------------------
        objService.ExecNotificationQueryAsync ObjSink, _
        &quot;SELECT * FROM __InstanceOperationEvent WITHIN 1 WHERE TargetInstance ISA &quot;&quot;Win32_USBControllerDevice&quot;&quot;&quot;
        
        &#039;/Получение буквы съемного Flash USB диска/
        &#039;---------------------------------------------------------------------------
        Function GetDriveLetter(flg)
            
            Dim sDrivesStr
            Dim sDev
            Dim sCur1, sCur2
            Dim a,b

            On Error Resume Next

            &#039;/Перебор букв дисков/
            &#039;---------------------------------------------------------------------------------
            sDrivesStr = &quot;&quot;
            Set objRemovableDrives = objService.ExecQuery(&quot;SELECT * FROM Win32_LogicalDisk WHERE DriveType = 2&quot;)
            
            For Each objDrive In objRemovableDrives
                sDrivesStr = sDrivesStr &amp; CStr(objDrive.DeviceId)
            Next

            &#039;/Выяснение буквы добавленного или удаленного диска/
            &#039;-------------------------------------------------------------------
            If flg = True Then

                a = (Len(sDrivesStr) &gt; Len(sPrevDrivesStr)) &#039;Добавление устройства
                b = (Len(sDrivesStr) &lt; Len(sPrevDrivesStr)) &#039;Извлечение устройства
                sCur1 = sDrivesStr
                sCur2 = sPrevDrivesStr

                For Each objDrive In objRemovableDrives

                    sDev = CStr(objDrive.DeviceId)
                    
                    &#039;/Добавление устройства/
                    If a Then
                        If (InStr(sDrivesStr,sDev)&lt;&gt;0) And Not (InStr(sPrevDrivesStr,sDev)&lt;&gt;0) Then GetDriveLetter = sDev: Exit For
                    End If
                    
                    &#039;/Извлечение устройства/
                    If b Then
                        sCur1 = Replace(sCur1, sDev, &quot;&quot;)
                        sCur2 = Replace(sCur2, sDev, &quot;&quot;)
                    End If

                Next    
                If b Then
                    If Len(sCur1) &lt; Len(sCur2) Then GetDriveLetter = sCur2
                End If
            End If
            &#039;-------------------------------------------------------------------
            sPrevDrivesStr = sDrivesStr
            If Err.Number &lt;&gt; 0 Then GetDriveLetter = &quot;&quot;
            Err.Clear
        
        End Function

        &#039;/Обработка событий вставки-извлечения/
        &#039;---------------------------------------------------------------------------
        Sub ObjSink_OnObjectReady(objWbemObject, objContext)    &#039;Подключение
            
            Dim sEventType, sDepend
            Dim a,b,c

             sEventType = CStr(objWbemObject.Path_.Class)
            sDepend = CStr(objWbemObject.TargetInstance.Dependent)

            &#039;/Условия/
            &#039;-------------------------------------------------------------------
            a = (InStr(1, sEventType, &quot;CreationEvent&quot;) &lt;&gt; 0)
            b = (InStr(1, sEventType, &quot;DeletionEvent&quot;) &lt;&gt; 0)
            c = (InStr(1, sDepend, &quot;USBSTOR&quot;) &lt;&gt; 0)
            
            &#039;-------------------------------------------------------------------
            If a And c Then
                StateFlag = False
                MsgBox &quot;Подключен USB накопитель. [&quot; &amp; GetDriveLetter(True) &amp; &quot;]&quot;, vbInformation Or vbSystemModal, &quot;Reply&quot;
                
            End If
            
            If b Then

                If StateFlag Then
                    StateFlag = False
                    If InStr(sDepend,&quot;VID&quot;)&lt;&gt;0 Then    MsgBox &quot;USB устройство отстыковано аппаратно.&quot;, vbInformation Or vbSystemModal, &quot;Reply&quot;
                End If
    
                If c Then
                    StateFlag = True
                    MsgBox &quot;USB накопитель отключен программно или небезопасно отстыкован. [&quot; &amp; GetDriveLetter(True) &amp; &quot;]&quot;, vbInformation Or vbSystemModal, &quot;Reply&quot;
                End If
                    
                
            End If
        End Sub
        
        &#039;/Вызов диалога безопасного извлечения устройства/
        &#039;---------------------------------------------------------------------------
        Sub UnplugDialog()

            On Error Resume Next
            objProc.Create &quot;rundll32.exe shell32,Control_RunDLL hotplug.dll&quot;, null, null, pID

        End Sub
        &#039;---------------------------------------------------------------------------
        Function window_onunload()

            ObjSink.Cancel()
            Set objService = Nothing
            Set objProc = Nothing

        End Function

        &#039;---------------------------------------------------------------------------
        Function window_onload()
        
        End Function

    &lt;/SCRIPT&gt;
    &lt;!---------------------------------------------------------------------------------&gt;
&lt;/BODY&gt;
&lt;/HTML&gt;
</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (Poltergeyst)]]></author>
			<pubDate>Sun, 23 Nov 2014 15:08:35 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?id=10181&amp;action=new</guid>
		</item>
		<item>
			<title><![CDATA[JScript: Инъекция в процесс]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?id=10103&amp;action=new</link>
			<description><![CDATA[<p><em>Без гарантий! Используете на свой страх и риск.</em></p><p>Пример инъекции - выполнение функции ExitProcess в адресном пространстве другого процесса с помощью CreateRemoteThread.</p><p>Потребуется зарегистрированная библиотека <a href="http://forum.script-coding.com/viewtopic.php?id=8082">scrsvc.dll</a><br />ОС WinXP/7</p><div class="codebox"><pre><code>
/*
 Пример инъекции в другой процесс, выполнение функции 
 ExitProcess в адресном пространстве другого процесса с 
 помощью CreateRemoteThread.

 ----------------------------------------------------------------
 Потребуется зарегистрированная библиотека scrsvc.dll
 http://forum.script-coding.com/viewtopic.php?id=8082

 ОС WinXP/7
*/
 
 var oScrSvc = new ActiveXObject(&#039;ScriptService.Service&#039;);
 
 //Изменяемый параметр - полный путь к запускаемому приложению.
 /*---------------------------------------------------------------*/
 sApp = &#039;calc&#039;
 
 
 /*---------------------------------------------------------------*/
 PROCESS_TERMINATE = 1
 PROCESS_CREATE_THREAD = 2
 PROCESS_SET_SESSIONID  = 4
 PROCESS_VM_OPERATION  = 8;
 PROCESS_VM_READ = 0x10;
 PROCESS_VM_WRITE = 0x20;
 PROCESS_DUP_HANDLE = 0x40;
 PROCESS_CREATE_PROCESS = 0x80;
 PROCESS_QUERY_INFORMATION = 0x400;

 PAGE_NOACCESS = 1;
 PAGE_READONLY = 2;
 PAGE_READWRITE = 4;
 PAGE_WRITECOPY = 8;
 PAGE_EXECUTE = 0x10;
 PAGE_EXECUTE_READ = 0x20;
 PAGE_EXECUTE_READWRITE = 0x40;
 PAGE_EXECUTE_WRITECOPY= 0x80;
 PAGE_GUARD = 0x100;
 PAGE_NOCACHE = 0x200;

 MEM_COMMIT = 0x1000;
 MEM_RESERVE = 0x2000;
 MEM_DECOMMIT = 0x4000;
 MEM_RELEASE = 0x8000;
 MEM_FREE = 0x10000;
 MEM_PRIVATE = 0x20000;
 MEM_MAPPED = 0x40000;
 MEM_RESET = 0x80000;
 MEM_TOP_DOWN = 0x100000;

 NORMAL_PRIORITY_CLASS = 0x00000020;

 // Запуск процесса
 /*---------------------------------------------------------------*/
 var oWShell = new ActiveXObject(&#039;WScript.Shell&#039;);
 try
 {
	var oWExec = oWShell.Exec(sApp);
	WScript.Sleep(200);
 }
 catch(e)
 {
	oWShell.PopUp(&#039;Произошла ошибка: &#039;+e.description, -1, &#039;Запуск процесса&#039;, 48);
	oWShell = null;
	oScrSvc = null;
	WScript.Quit()
 }
 var PID = oWExec.ProcessID;
 //oWShell.AppActivate(PID);
 WScript.Sleep(200);

 // Выполнение удаленной функции в адресном пространстве процесса
 /*---------------------------------------------------------------*/
 with (oScrSvc)
 {
	
	// Открытие процесса
	/*--------------------------------------------------------*/
	set_vararg(0, PROCESS_CREATE_THREAD + PROCESS_VM_OPERATION + PROCESS_VM_WRITE);
	set_vararg(1, true);
	set_vararg(2, PID);
	hOpen = api_call(&#039;KERNEL32.DLL&#039;,&#039;OpenProcess&#039;,3);
 
	// Выделение памяти в адресном пространстве созданного процесса
	set_vararg(0, hOpen);
	set_vararg(1, 0);
	set_vararg(2, 4);
	set_vararg(3, MEM_RESERVE + MEM_COMMIT);
	set_vararg(4, PAGE_EXECUTE_READWRITE);
	hMem = api_call(&#039;KERNEL32.DLL&#039;,&#039;VirtualAllocEx&#039;,5);

	// Запись аргумента удаленно вызываемой функции в выделенную память
	sStr = &#039;____&#039;
	vPtr = struct_setval(sStr)
	struct_setval(vPtr, 0, 0, 4); 

	set_vararg(0, hOpen);
	set_vararg(1, hMem);
	set_vararg(2, vPtr);
	set_vararg(3, 4);
	set_vararg(4, 0);
	hRes = api_call(&#039;KERNEL32.DLL&#039;,&#039;WriteProcessMemory&#039;,5);

	// Получение адреса удаленно вызываемой функции
	// (это ExitProcess, расположенная в KERNEL32.DLL)
	/*--------------------------------------------------------*/
	set_strarg(0, &#039;KERNEL32.DLL&#039;, true);
	hModule = api_call(&#039;KERNEL32.DLL&#039;,&#039;GetModuleHandleW&#039;,1);

	set_vararg(0, hModule);
	set_strarg(1, &#039;ExitProcess&#039;, false);	
	hAPIProc = api_call(&#039;KERNEL32.DLL&#039;,&#039;GetProcAddress&#039;,2);


	// Выполнение функции ExitProcess в памяти другого процесса
	/*--------------------------------------------------------*/
	oWShell.PopUp(&#039;Выполнение ExitProcess в памяти другого процесса...&#039;, 5, &#039;ExitProcess&#039;, 64);

	set_vararg(0, hOpen);
	set_vararg(1, 0);
	set_vararg(2, 0);
	set_vararg(3, hAPIProc);
	set_vararg(4, hMem);
	set_vararg(5, 0);
	set_vararg(6, 0);
	hRemoteThread = api_call(&#039;KERNEL32.DLL&#039;,&#039;CreateRemoteThread&#039;,7);

	oWShell.PopUp(&#039;Завершено...&#039;, 5, &#039;ExitProcess&#039;, 64);
	oWShell = null;
	oScrSvc = null;
	WScript.Quit();
	
 }
</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (Poltergeyst)]]></author>
			<pubDate>Mon, 03 Nov 2014 19:50:11 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?id=10103&amp;action=new</guid>
		</item>
		<item>
			<title><![CDATA[VBScript: очистка экрана консоли (аналог CLS/Clear Screen)]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?id=9349&amp;action=new</link>
			<description><![CDATA[<p>Процедура «CLS» демонстрирует очистку экрана консоли — по аналогии с командой «CLS» (Clear Screen) в пакетных файлах:<br /></p><div class="codebox"><pre><code>Option Explicit

WScript.Echo &quot;Первая строка&quot;
WScript.Echo &quot;Вторая строка&quot;
WScript.Echo &quot;Третья строка&quot;
WScript.Sleep 3000

CLS

WScript.Echo &quot;Четвёртая строка&quot;
WScript.Echo &quot;Пятая строка&quot;
WScript.Echo &quot;Шестая строка&quot;
WScript.Sleep 3000

WScript.Quit 0
&#039;=============================================================================

&#039;=============================================================================
Sub CLS()
    Const WshRunning  = 0
    Const WshFinished = 1
    Const WshFailed   = 2
    
    With WScript.CreateObject(&quot;WScript.Shell&quot;).Exec(&quot;mode.com con: lines=0&quot;)
        If .Status &lt;&gt; WshFailed Then
            If .Status = WshRunning Then
                Do Until .Status = WshFinished
                    .StdOut.ReadAll
                    .StdErr.ReadAll
                    
                    WScript.Sleep 100
                Loop
            End If
        End If
    End With
End Sub
&#039;=============================================================================
</code></pre></div><p>Автор идеи — <strong>wisgest</strong>. Отдельное спасибо — <strong>Rumata</strong>.</p>]]></description>
			<author><![CDATA[null@example.com (alexii)]]></author>
			<pubDate>Tue, 11 Mar 2014 07:40:17 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?id=9349&amp;action=new</guid>
		</item>
		<item>
			<title><![CDATA[HTA: отображение анимированной заставки]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?id=8548&amp;action=new</link>
			<description><![CDATA[<div class="fancy_spoiler_switcher"><div class="fancy_spoiler_switcher_header" data-lang-open="открыть спойлер" data-lang-close="скрыть спойлер"><strong>+</strong>&nbsp;открыть спойлер</div><div class="fancy_spoiler"><div class="quotebox"><blockquote><p>нужен скрипт vbs который отображает картинку (Логотип.gif) на экране, на пример как в программе Nero 8 когда программа запускается на экране появляется логотип (Анимация).</p></blockquote></div><div class="quotebox"><blockquote><p>можно ли открыть изображение/анимацию и вывести на середину экрана ?</p></blockquote></div></div></div><div class="codebox"><pre><code>&lt;html id=&quot;appHTA&quot;&gt;
    &lt;head&gt;
        &lt;meta charset=&quot;windows-1251&quot;&gt;
        &lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=windows-1251&quot;&gt;
        &lt;meta http-equiv=&quot;Content-Language&quot; content=&quot;ru&quot;&gt;
        &lt;title&gt;My HTA application&lt;/title&gt;
        &lt;hta:Application
            Id=&quot;oHTA&quot;
            ApplicationName=&quot;My HTA application&quot;
            Border=&quot;none&quot;
            Caption=&quot;no&quot;
            ContextMenu=&quot;no&quot;
            InnerBorder=&quot;no&quot;
            MaximizeButton=&quot;no&quot;
            MinimizeButton=&quot;no&quot;
            Navigable=&quot;no&quot;
            Scroll=&quot;no&quot;
            ScrollFlat=&quot;no&quot;
            Selection=&quot;no&quot;
            ShowInTaskbar=&quot;no&quot;
            SingleInstance=&quot;yes&quot;
            SysMenu=&quot;no&quot;
            Version=&quot;0.1&quot;
            WindowState=&quot;normal&quot;
        /&gt;
        &lt;style type=&quot;text/css&quot;&gt;
            BODY {
                color: WindowText;
                background-color: ButtonFace;
                margin: 0em;
            }
        &lt;/style&gt;
    &lt;html&gt;
    
    &lt;body id=&quot;tagBody&quot;&gt;
        &lt;img id=&quot;Splash&quot; width=&quot;100%&quot; height=&quot;100%&quot;&gt;
    &lt;/body&gt;
    
    &lt;script language=&quot;VBScript&quot;&gt;
        Option Explicit
        
        Dim strImgSource
        Dim objStdPicture
        
        With CreateObject(&quot;Scripting.FileSystemObject&quot;)
            strImgSource = .BuildPath(Replace(.GetParentFolderName(oHTA.commandLine), &quot;&quot;&quot;&quot;, &quot;&quot;), &quot;My file.gif&quot;)
            
            If .FileExists(strImgSource) Then
                Set objStdPicture = LoadPicture(strImgSource)
                Splash.src = &quot;file://&quot; &amp; strImgSource
        
                With window
                    .resizeTo Round(objStdPicture.Width / 26.47), Round(objStdPicture.Height / 26.47)
                    .moveTo (.screen.availWidth - tagBody.offsetWidth) \ 2, (.screen.availHeight - tagBody.offsetHeight) \ 2
                End With
            Else
                MsgBox &quot;Can&#039;t find path [&quot; &amp; strImgSource &amp; &quot;].&quot;, vbOKOnly &amp; vbExclamation
            End If
        End With
        
        setTimeout &quot;close&quot;, 5 * 1000
    &lt;/script&gt;
&lt;/html&gt;</code></pre></div><p>«My file.gif» — файл анимированного изображения, находящийся рядом с *.hta. «5 * 1000» — время на отображение, 5 секунд.</p>]]></description>
			<author><![CDATA[null@example.com (alexii)]]></author>
			<pubDate>Thu, 08 Aug 2013 19:22:11 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?id=8548&amp;action=new</guid>
		</item>
		<item>
			<title><![CDATA[HTA: OstroSoft Winsock Component]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?id=8410&amp;action=new</link>
			<description><![CDATA[<p>&quot;<a href="http://www.ostrosoft.com/oswinsck.asp">OstroSoft Winsock Component</a>&quot; - ActiveX для работы с Winsock.<br />Отечественный, бесплатный для использования в некоммерческих приложениях. Небольшого размера. Корректно работает с JavaScript.<br /><a href="http://www.ostrosoft.com/download/oswinsck.zip">По ссылке скачивается zip</a> с документацией и примерами использования на VBS, JS, и других языках.<br />Программный доступ к Winsock открывает нам широчайшие возможности для построения самых разнообразных приложений использующих протокол TCP/IP.<br />В примерах приведена процедура загрузки web-страницы по протоколу http. Таким же макаром можно загружать файлы по ftp. Один умелец сочинил <a href="http://admin-scripting.blogspot.ru/2009/09/web-jscript-wsh.html">web-сервер на JS</a>. Так же можно реализовать Telnet-сервер или клиента. Или, например, сочинить сетевой чат. Все зависит от вашей фантазии.</p><p><strong>Пример загрузки html кода веб-страницы:</strong></p><div class="codebox"><pre><code>&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv=content-type content=&quot;text-html; charset=utf-8&quot;&gt;
&lt;meta http-equiv=MSThemeCompatible content=yes&gt;
&lt;hta:application
    innerBorder=no
    scroll=no
    selection=no
    contextMenu=no
    singleinstance=yes
&gt;
&lt;title&gt;Get Page with OstroSoft Winsock component&lt;/title&gt;
&lt;object id=&quot;oWinsock&quot; style=&quot;display:none;&quot; classid=&quot;CLSID:37F9EE2B-98A7-49D7-B505-94DFCE7FAC60&quot;&gt;&lt;/object&gt;
&lt;script for=&quot;oWinsock&quot; event=&quot;OnConnect()&quot; type=&quot;text/javascript&quot;&gt;
    oWinsock.SendData(&#039;GET /&#039; + sPage + &#039; HTTP/1.0\r\nHost: &#039; + sHost + &#039;\r\nAccept: text/html\r\n\r\n&#039;);
&lt;/script&gt;
&lt;script for=&quot;oWinsock&quot; event=&quot;OnError(Number, Description, Scode, Source, HelpFile, HelpContext, CancelDisplay)&quot; type=&quot;text/javascript&quot;&gt;
    alert(Number + &#039;: &#039; + Description);
&lt;/script&gt;
&lt;script for=&quot;oWinsock&quot; event=&quot;OnDataArrival(bytesTotal)&quot; type=&quot;text/javascript&quot;&gt;
    idSource.insertAdjacentText(&#039;BeforeEnd&#039;, oWinsock.GetDataBuffer());
    oWinsock.CloseWinsock();
&lt;/script&gt;
&lt;script type=&quot;text/javascript&quot;&gt;

var sPage = &#039;&#039;;
var sHost = &#039;&#039;;

function Connect(){
    idSource.innerText = &quot;&quot;;
    if (/^(\w+?:\/\/)*([^\/:]+):*(\d*)\/*(.*?)$/.test(idURL.value)) {
        sHost = RegExp.$2;
        var nPort = RegExp.$3 || 80;
        sPage = RegExp.$4;

        alert(&quot;Host:\t&quot; + sHost + &quot;\nPort:\t&quot; + nPort + &quot;\nPage:\t&quot; + sPage);
        oWinsock.Connect(sHost, nPort);
    } else {
        alert(&quot;Invalid URL&quot;);
    }
}
&lt;/script&gt;
&lt;/head&gt;
&lt;body style=&quot;background-color:threedface;&quot;&gt;
    &lt;table style=&quot;width:100%; height:100%&quot;&gt;
        &lt;tr&gt;
            &lt;td style=&quot;width:100%;&quot;&gt;&lt;input id=&quot;idURL&quot; type=&quot;text&quot; value=&quot;http://www.ostrosoft.com/oswinsck.asp&quot; style=&quot;width:100%;&quot;&gt;&lt;/td&gt;
            &lt;td&gt;&lt;input type=button onClick=&quot;Connect()&quot; value=GetPage hidefocus&gt;&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr style=&quot;height:100%&quot;&gt;
            &lt;td colspan=&quot;2&quot;&gt;&lt;textarea id=&quot;idSource&quot; style=&quot;width:100%; height:100%&quot;&gt;&lt;/textarea&gt;&lt;/td&gt;
        &lt;/tr&gt;
    &lt;/table&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre></div><p><strong>Пример сканера открытых портов на локальном или удаленном ПК:</strong></p><div class="codebox"><pre><code>&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv=content-type content=&quot;text-html; charset=utf-8&quot;&gt;
&lt;meta http-equiv=MSThemeCompatible content=yes&gt;
&lt;hta:application
    innerBorder=no
    scroll=no
    selection=no
    contextMenu=no
    singleinstance=yes
&gt;
&lt;title&gt;Ports Scanner&lt;/title&gt;
&lt;script type=&quot;text/javascript&quot;&gt;
    window.resizeTo(280, 380);

    var aPorts = [21,22,23,25,80,110,139,143,445,1433,1521,3306,3389,5631,5900];
    var i = 0;

    function CheckNextPort(){
        if (i &lt; aPorts.length){
            var nPort = aPorts[i];
            Logging(nPort + &#039;\t&#039;);
            oWinsock.Connect(idHost.value, nPort);
            i++;
        }
    }

    function Logging(text){
        idLog.insertAdjacentText(&#039;BeforeEnd&#039;, text);
    }
&lt;/script&gt;
&lt;/head&gt;
&lt;body style=&quot;background-color:threedface;&quot;&gt;
    &lt;table style=&quot;width:100%; height:100%&quot;&gt;
        &lt;tr&gt;
            &lt;td&gt;Host:&lt;/td&gt;
            &lt;td style=&quot;width:100%;&quot;&gt;&lt;input id=&quot;idHost&quot; type=&quot;text&quot; value=&quot;127.0.0.1&quot; style=&quot;width:100%;&quot;&gt;&lt;/td&gt;
            &lt;td&gt;&lt;input type=button onClick=&quot;idLog.innerText=&#039;&#039;; CheckNextPort()&quot; value=CheckPorts hidefocus&gt;&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr style=&quot;height:100%&quot;&gt;
            &lt;td colspan=&quot;3&quot;&gt;&lt;textarea id=&quot;idLog&quot; style=&quot;width:100%; height:100%&quot;&gt;&lt;/textarea&gt;&lt;/td&gt;
        &lt;/tr&gt;
    &lt;/table&gt;
&lt;/body&gt;
&lt;object id=&quot;oWinsock&quot; style=&quot;display:none;&quot; classid=&quot;CLSID:37F9EE2B-98A7-49D7-B505-94DFCE7FAC60&quot;&gt;&lt;/object&gt;
&lt;script type=&quot;text/javascript&quot;&gt;
    function oWinsock::OnConnect(){
        oWinsock.CloseWinsock();
    }

    function oWinsock::OnError(){
        Logging(&#039;CLOSE\n&#039;);
        CheckNextPort();
    }

    function oWinsock::OnClose(){
        Logging(&#039;OPEN\n&#039;);
        CheckNextPort();
    }
&lt;/script&gt;
&lt;/html&gt;</code></pre></div><p>Обсудить компонент и решения можно <a href="http://forum.script-coding.com/viewtopic.php?id=8388">тут</a>.</p>]]></description>
			<author><![CDATA[null@example.com (mozers)]]></author>
			<pubDate>Wed, 19 Jun 2013 11:10:57 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?id=8410&amp;action=new</guid>
		</item>
		<item>
			<title><![CDATA[JS: Округление по модулю]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?id=8321&amp;action=new</link>
			<description><![CDATA[<p>На страницах MDN есть <a href="https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Math/ceil#Example:_Decimal_adjustment">пример десятичного округления чисел по степеням 10</a>. Недавно на глаза попался фрагмент кода java, где реализовано округление по произвольному числу. Реализовал на javascript. Публикую, вдруг кому-то понадобится. </p><p>Обсуждение в теме <a href="http://forum.script-coding.com/viewtopic.php?id=8312">JS: Округление по модулю (обсуждение)</a></p><div class="codebox"><pre><code>

(function()
{
    var names = [&#039;floor&#039;, &#039;ceil&#039;, &#039;round&#039;];

    for (var i = 0; i &lt; names.length; i++) {
        var name = names[i];
        (function(name, method)
        {
            //Math[name] = 
            Math[name + &#039;Modulo&#039;] = 
            function(value, modulo)
            {
                return arguments.length &lt; 2 
                    ? method(value) 
                    : method(value / modulo) * modulo;
            };
        })(name, Math[name]);
    }
})();

// Floor
Math.floorModulo(5, 5); // 5
Math.floorModulo(6, 5); // 5
Math.floorModulo(7, 5); // 5
Math.floorModulo(8, 5); // 5
Math.floorModulo(9, 5); // 5
Math.floorModulo(10, 5); // 10

// Ceil
Math.ceilModulo(5, 5); // 5
Math.ceilModulo(6, 5); // 10
Math.ceilModulo(7, 5); // 10
Math.ceilModulo(8, 5); // 10
Math.ceilModulo(9, 5); // 10
Math.ceilModulo(10, 5); // 10

// Round
Math.roundModulo(5, 5); // 5
Math.roundModulo(6, 5); // 5
Math.roundModulo(7, 5); // 5
Math.roundModulo(8, 5); // 10
Math.roundModulo(9, 5); // 10
Math.roundModulo(10, 5); // 10

</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (Rumata)]]></author>
			<pubDate>Sun, 19 May 2013 10:57:03 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?id=8321&amp;action=new</guid>
		</item>
		<item>
			<title><![CDATA[HTA: Remote Task Control - процессы, сервисы, драйвера, ПО]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?id=8181&amp;action=new</link>
			<description><![CDATA[<p><a href="https://html-applications.bitbucket.io/remote-task-control/readme.html"><strong>Remote Task Control</strong></a><br />Данное HTA-приложение позволяет наглядно просматривать и управлять процессами, сервисами, драйверами и установленным ПО на локальном и удаленном компьютере.</p><p>Процедуры извлечения списка и управления процессами основаны на WMI. Весь интерфейс - на DHTML. Все функции написаны на JavaScript.<br />Ключи запуска и другие тонкости подробно описаны в <a href="https://html-applications.bitbucket.io/remote-task-control/readme.html">readme.html</a> (Можно просто нажать F1 в программе).</p><p>Исходный код размещен в <a href="https://bitbucket.org/html-applications/remote-task-control/src">репозитарии bitbucket</a>.<br />Готовый к употреблению дистрибутив - <a href="https://bitbucket.org/html-applications/remote-task-control/downloads/rtc.zip">тут</a>.</p>]]></description>
			<author><![CDATA[null@example.com (mozers)]]></author>
			<pubDate>Tue, 26 Mar 2013 17:10:57 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?id=8181&amp;action=new</guid>
		</item>
		<item>
			<title><![CDATA[HTA/JScript: Network Calculator (библиотека NetIP)]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?id=7918&amp;action=new</link>
			<description><![CDATA[<p>Решил поделиться еще одной своей небольшой поделкой. Лежит она у меня давно (почти пять лет), за это время она, если и изменялась, то незначительно. Естественно, аналоги существуют; один из них (LanCalculator) послужил прообразом дизайна. </p><p>Суть программы - расчет IP-адресов подсети (включая адрес подсети, широковещательного адреса) с учетом маски подсети, битовой маски, инверсии маски, размера (количество допустимых адресов) подсети, вывод в двоичной, восьмеричной, десятичной и шестнадцатеричной системе счисления. </p><p>Окно программы состоит из 3 областей:<br />-- область ввода данных; <br />-- область детализации введенных данных; <br />-- область отображения параметров сети (адрес сети, широковещательный адрес, первый и последний адреса подсети, размер подсети). </p><p>Архив последней версии доступен на странице скачивания - <a href="https://github.com/ildar-shaimordanov/jsxt/releases	">https://github.com/ildar-shaimordanov/jsxt/releases	</a>.</p><p><span class="postimg"><img src="https://github.com/ildar-shaimordanov/jsxt/blob/master/wiki/NetCalc.jpg?raw=true" alt="https://github.com/ildar-shaimordanov/jsxt/blob/master/wiki/NetCalc.jpg?raw=true" /></span></p><p>Сама программа основана на небольшой библиотечке <a href="https://github.com/ildar-shaimordanov/jsxt/blob/master/js/NetIP.js">NetIP</a>, которая выполняет определенные манипуляции с сетевыми адресами - вычисление <br />а) адресов (сетевого, широковещательного, первого и последнего доступного адреса сети), <br />б) масок подсети, <br />в) количества доступных адресов в диапазоне; <br />г) определение принадлежности некоторого адреса данной подсети; <br />д) перевод адресов из точечной нотации в числовую форму и обратно. </p><div class="codebox"><pre><code>
// Несколько способов создания одного объекта
var net = new NetIP(&#039;192.168.1.100/24&#039;);
var net = new NetIP(&#039;192.168.1.100/255.255.255.0&#039;);
var net = new NetIP(&#039;192.168.1.100/0.0.0.255&#039;);

// Определение принадлежности адреса данной подсети
WScript.Echo(net.contains(&#039;192.168.1.200));
</code></pre></div><p>Предложения по исправлению ошибок и улучшению - приветствуются.</p>]]></description>
			<author><![CDATA[null@example.com (Rumata)]]></author>
			<pubDate>Thu, 27 Dec 2012 04:21:14 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?id=7918&amp;action=new</guid>
		</item>
		<item>
			<title><![CDATA[JScript: Конвертер в TXT, RTF, HTML, MHT, XML, PDF, XPS, FB2]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?id=7792&amp;action=new</link>
			<description><![CDATA[<p>Понятно, что таких программ сотни. Эта существует у меня давно, редко, но иногда, дорабатывается. Сегодня добавил еще один формат, в который можно конвертировать и решил опубликовать. Программа позволяет из командной строки преобразовать winword документы в другие форматы, включая FictionBook, популярный формат для электронных читалок. </p><p><strong>Установка</strong><br />-- скачать архив со страницы <a href="https://github.com/ildar-shaimordanov/jsxt/releases">https://github.com/ildar-shaimordanov/jsxt/releases</a> <br />-- распаковать содержимое архива в удобное для вас место на компьютере </p><p>В архив входят сама программа <strong>doc2html.bat</strong> и XSLT файл <strong>doc2fb.xsl</strong> (слегка модифицированный <a href="http://home.arcor.de/fb.tools">wml2fb.xsl</a>), который необходим для преобразования файлов в формат FictionBook (для электронных читалок). Поэтому если не планируете конвертировать в формат FB2, удалите xsl-файл, в противном случае оставьте его в том же каталоге, где и сама программа. </p><p><strong>Требования</strong><br />-- обязателен WinWord (возможно потребуется дополнение для <a href="http://www.microsoft.com/en-us/download/details.aspx?id=7">сохранения файлов в форматах pdf и xps</a>) </p><p><strong>Особенности</strong><br />-- командная строка <br />-- пакетная обработка <br />-- большой выбор поддерживаемых форматов <br />-- поддержка шаблонов имен файлов для массовой обработки файлов <br />-- возможность определить другой XSLT-файл для преобразования в формат FictionBook <br />-- возможность запустить WinWord на переднем плане <br />-- вывод отладочной информации на консоль </p><p><strong>Поддерживаемые форматы</strong><br />Чтание<br /></p><div class="quotebox"><blockquote><p>doc, docx, rtf, html, xml (WordML), mht, txt</p></blockquote></div><p>Запись<br /></p><div class="quotebox"><blockquote><p>html (по умолчанию), rtf, html, mht, txt, xml, pdf, xps, fb2</p></blockquote></div><p><strong>Примеры</strong><br /></p><div class="codebox"><pre><code>
:: преобразовать в html
doc2html filename.doc

:: аналогично первому, но с выводом отладочной информации на консоль
doc2html filename.doc /v

:: аналогично первому, но WinWord запускается на переднем плане
doc2html filename.doc /fg

:: преобразовать в текстовый файл в формате DOS (cp866)
doc2html filename.doc /f:txt /e:866

:: преобразовать в FictionBook для чтения в электронных книжках
doc2html filename.doc /f:fb2</code></pre></div><p><strong>Аргументы командной строки (все опциональные)</strong><br /></p><div class="quotebox"><blockquote><p>/F:format<br />&nbsp; &nbsp; Формат файла на выходе TXT, RTF, HTML, MHT, XML, PDF or XPS.<br />&nbsp; &nbsp; Дополнительно, FB2 определено для преобразования в формат FictionBook.</p><p>/E:encoding<br />&nbsp; &nbsp; Числовое значение кодировки используемое при сохранении в текстовый формат. <br />&nbsp; &nbsp; Опция работает только для формата, заданного с помощью /F:TXT. <br />&nbsp; &nbsp; Уточняйте список доступных кодировок в своей системе. </p><p>&nbsp; &nbsp; Для кириллических кодировок, используемых в России и Украине используются следующие значения:<br />&nbsp; &nbsp; 866&nbsp; &nbsp;- DOS<br />&nbsp; &nbsp; 28595 - ISO<br />&nbsp; &nbsp; 20866 - KOI8-R<br />&nbsp; &nbsp; 21866 - KOI8-U<br />&nbsp; &nbsp; 10007 - Mac<br />&nbsp; &nbsp; 1251&nbsp; - Win</p><p>/L:lineending<br />&nbsp; &nbsp; Опция определяет как кодировать концы строк. Доступны следующие значения: <br />&nbsp; &nbsp; CRLF (значение по умолчанию) , CR, LF, or LFCR. </p><p>/XSL:filename<br />&nbsp; &nbsp; Имя файла для XSL преобразований для трансформации в формат FictionBook.</p><p>/V<br />&nbsp; &nbsp; Включить вывод подробного отчета.</p><p>/FG<br />&nbsp; &nbsp; Запустить WINWORD на переднем плане.</p></blockquote></div>]]></description>
			<author><![CDATA[null@example.com (Rumata)]]></author>
			<pubDate>Sun, 18 Nov 2012 16:44:48 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?id=7792&amp;action=new</guid>
		</item>
		<item>
			<title><![CDATA[VBS & WMI: замена объекта класса Win32_Truste в DACL каталога]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?id=7749&amp;action=new</link>
			<description><![CDATA[<p>Продолжение темы <a href="http://forum.script-coding.com/viewtopic.php?id=5142">VBS &amp; WMI: безопасность NTFS для каталога, DACL (чтение, изменение)</a>.</p><p><strong>Сценарий 6.<br />Замена объекта класса &quot;Win32_Trustee&quot; в списке управления доступом NTFS (DACL) заданного каталога текущего компьютера <span style="color: green">с сохранением настроек, унаследованных от &quot;родителя&quot;</span>.</strong></p><p>Смысловое назначение сценария состоит в том, чтобы удалить текущую привязку записи DACL к некоторой пользовательской учётной записи, а затем привязать эту же запись DACL к другой пользовательской учётной записи. При этом тип, область действия и маска доступа записи DACL не изменяются.<br />Результат работы сценария аналогичен результату процедуры удаления некоторой записи DACL, а затем создания такой же по типу, области действия и маске доступа записи DACL, но соответствующей иной учётной записи пользователя.</p><p>Предполагается, что участвующие в процедуре пользовательские учётные записи, во-первых, являются доменными, во-вторых, принадлежат одному и тому же домену.<br />Сценарий способен работать и в графическом, и в консольном режимах.<br /></p><div class="codebox"><pre><code>Dim objWsNet, objFS, objWMI
Dim strDomain, strBaseFolder, blnContinue, xResult
Dim strAccountOld, strSIDOld, strAccountNew, strSIDNew

strAccountOld = &quot;user1&quot;: strAccountNew = &quot;user2&quot;
strBaseFolder = &quot;C:\Temp&quot;
Set objWsNet = CreateObject(&quot;WScript.Network&quot;)
strDomain = objWsNet.UserDomain
Set objWsNet = Nothing
Set objFS = CreateObject(&quot;Scripting.FileSystemObject&quot;)
On Error Resume Next
Set objWMI = GetObject(&quot;winmgmts:\\.\root\cimv2&quot;)
If Err.Number = 0 Then
    If objFS.FolderExists(strBaseFolder) Then
        If StrComp(strDomain &amp; &quot;\&quot; &amp; strAccountOld, strDomain &amp; &quot;\&quot; &amp; strAccountNew, vbTextCompare) &lt;&gt; 0 Then
            Set objAccount = objWMI.Get(&quot;Win32_UserAccount.Domain=&#039;&quot; &amp; strDomain &amp; &quot;&#039;,Name=&#039;&quot; &amp; strAccountOld &amp; &quot;&#039;&quot;)
            If Err.Number = 0 Then
                strSIDOld = UCase(objAccount.SID)
                Set objAccount = objWMI.Get(&quot;Win32_UserAccount.Domain=&#039;&quot; &amp; strDomain &amp; &quot;&#039;,Name=&#039;&quot; &amp; strAccountNew &amp; &quot;&#039;&quot;)
                If Err.Number = 0 Then
                    strSIDNew = UCase(objAccount.SID)
                    xResult = Change_Trustee(objWMI, strDomain, strAccountOld, strSIDOld, strAccountNew, strSIDNew, strBaseFolder)
                    WScript.Echo strAccountOld &amp; &quot; &lt;-&gt; &quot; &amp; strAccountNew &amp; &quot;: &quot; &amp; xResult
                Else
                    WScript.Echo strAccountNew &amp; &quot; -&gt; не найдена учётная запись объекта&quot;
                End If
            Else
                WScript.Echo strAccountOld &amp; &quot; -&gt; не найдена учётная запись объекта&quot;
                Err.Clear
            End If
            Set objAccount = Nothing
        Else
            WScript.Echo strAccountOld &amp; &quot; &lt;-&gt; &quot; &amp; strAccountNew &amp; &quot;: бессмысленная операция&quot;
        End If
    Else
        WScript.Echo &quot;Не найден путь &quot; &amp; UCase(strBaseFolder)
    End If
Else
    WScript.Echo &quot;Ошибка &quot; &amp; Err.Number &amp; &quot; при подключении к WMI-пространству&quot; &amp; vbNewLine &amp; Err.Description
    Err.Clear
End If
Set objWMI = Nothing
Set objFS = Nothing
WScript.Quit 0

&#039;======

Function Change_Trustee(objWMIServ, strDom, strSAN1, strSID1, strSAN2, strSID2, strDir)
Dim objSecSettings, objSD, objItem, blnHasInherited
Dim objSID, objTrustee, arrACE, arrLines, xRes, i, j
Const SE_DACL_PROTECTED = 4096 &#039;Флаг-признак отключенного режима наследования управляемым каталогом безопасности NTFS от &quot;родителя&quot;
Const INHERITED_ACE = 16 &#039;Флаг-признак того, что текущая запись DACL унаследована от &quot;родителя&quot;

On Error Resume Next
xRes = 0
Set objSecSettings = objWMIServ.Get(&quot;Win32_LogicalFileSecuritySetting.Path=&#039;&quot; &amp; strDir &amp; &quot;&#039;&quot;)
If Err.Number = 0 Then
    If objSecSettings.GetSecurityDescriptor(objSD) = 0 Then
        If Not IsNull(objSD.DACL) Then
            If Not CBool(objSD.ControlFlags And SE_DACL_PROTECTED) Then blnHasInherited = True
            arrACE = Array(): i = -1: arrLines = Array(): j = -1
            &#039;--- Выборка из исходного DACL записей, не унаследованных от &quot;родителя&quot;,
            &#039;и поиск среди них (по SID) тех, которые привязаны к заменяемой пользовательской &quot;учётке&quot;
            For Each objItem In objSD.DACL
                If Not CBool(objItem.AceFlags And INHERITED_ACE) Then
                    If UCase(objItem.Trustee.SIDString) = strSID1 Then
                        j = j + 1
                        ReDim Preserve arrLines(j)
                        arrLines(j) = i + 1
                    End If
                    i = i + 1
                    ReDim Preserve arrACE(i)
                    Set arrACE(i) = objItem
                End If
            Next
            Set objItem = Nothing
            &#039;------
            If j &gt;= 0 Then
                If blnHasInherited Then
                    &#039;--- Отключение наследования настроек безопасности от &quot;родителя&quot;
                    objSD.ControlFlags = objSD.ControlFlags + SE_DACL_PROTECTED
                    xRes = objSecSettings.SetSecurityDescriptor(objSD)
                    &#039;------
                End If
                If xRes = 0 Then
                    &#039;--- Создание экземпляра класса &quot;Win32_Trustee&quot;,
                    &#039;привязанного к заменяющей пользовательской &quot;учётке&quot;
                    Set objSID = objWMI.Get(&quot;Win32_SID.SID=&#039;&quot; &amp; strSID2 &amp; &quot;&#039;&quot;)
                    Set objTrustee = objWMIServ.Get(&quot;Win32_Trustee&quot;).Spawninstance_
                    objTrustee.Domain = strDom
                    objTrustee.Name = strSAN2
                    objTrustee.SID = objSID.BinaryRepresentation
                    objTrustee.SidLength = objSID.SidLength
                    objTrustee.SIDString = strSID2
                    Set objSID = Nothing
                    &#039;------
                    &#039;--- Замена объекта класса &quot;Win32_Trustee&quot; у обрабатываемых записей DACL
                    For j = 0 To UBound(arrLines)
                        arrACE(arrLines(j)).Trustee = objTrustee
                    Next
                    &#039;------
                    objSD.DACL = arrACE &#039;собственно изменение DACL
                    Erase arrACE: Erase arrLines
                    &#039;--- Включение наследования настроек безопасности от &quot;родителя&quot;, если первоначально оно было включено
                    If blnHasInherited Then objSD.ControlFlags = objSD.ControlFlags - SE_DACL_PROTECTED
                    &#039;------
                    &#039;--- Итоговое сохраненение изменений, внесённых в дескриптор безопасности
                    xRes = objSecSettings.SetSecurityDescriptor(objSD)
                    Select Case xRes
                        Case 0: xRes = &quot;успешное завершение&quot;
                        Case 2: xRes = &quot;не удалось сохранить изменения DACL (доступ запрещён)&quot;
                        Case 5, 9: xRes = &quot;не удалось сохранить изменения DACL (для выполнения операции недостаточно полномочий)&quot;
                        Case 21: xRes = &quot;не удалось сохранить изменения DACL (заданы недопустимые значения параметров)&quot;
                        Case Else: xRes = &quot;не удалось сохранить изменения DACL (неизвестная ошибка)&quot;
                    End Select
                    &#039;------
                Else
                    xRes = &quot;не удалось отключить наследование безопасности&quot;
                End If
            Else
                xRes = &quot;не обнаружено не унаследованных записей исходного объекта&quot;
            End If
            Set objTrustee = Nothing
        Else
            xRes = &quot;список управления доступом пуст&quot;
        End If
    Else
        xRes = &quot;не удалось прочитать дескриптор безопасности объекта&quot;
    End If
    Set objSD = Nothing
    Set objSecSettings = Nothing
Else
    xRes = &quot;ошибка &quot; &amp; CStr(Err.Number) &amp; vbNewLine &amp; Err.Description
    Err.Clear
End If
On Error GoTo 0
Change_Trustee = xRes
End Function</code></pre></div><p>Примечания.<br />1. Работа сценария проверена в 32-битных версиях: 2000 Pro. + SP4/XP Pro. + SP3/2008 Std. + SP2/7 Pro. + SP1<br />2. Сценарий ориентирован на использование в русифицированных ОС.</p>]]></description>
			<author><![CDATA[null@example.com (Dmitrii)]]></author>
			<pubDate>Thu, 01 Nov 2012 12:44:38 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?id=7749&amp;action=new</guid>
		</item>
	</channel>
</rss>
