<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title type="html"><![CDATA[Серый форум &mdash; VBS & WMI: безопасность NTFS для каталога, DACL (чтение, изменение)]]></title>
	<link rel="self" href="http://forum.script-coding.com/extern.php?action=feed&amp;tid=5142&amp;type=atom" />
	<updated>2010-11-09T14:22:46Z</updated>
	<generator>PunBB</generator>
	<id>http://forum.script-coding.com/viewtopic.php?id=5142</id>
		<entry>
			<title type="html"><![CDATA[VBS & WMI: безопасность NTFS для каталога, DACL (чтение, изменение)]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=41393#p41393" />
			<content type="html"><![CDATA[<p><strong>Сценарий 1.<br />Получение обобщённого полного списка управления доступом NTFS (DACL) указанного каталога текущего компьютера.</strong></p><p>Для каждой записи DACL сценарий позволяет определить:<br />- идентификатор учётной записи в формате &quot;домен\имя&quot;;<br />- тип;<br />- режим наследования настроек от родительского каталога;<br />- <strong><span style="color: green">маску доступа (в числовой форме, без детализации)</span></strong>;<br />- область действия по отношению к дочерним объектам каталога.<br />Каталог выбирается с помощью метода <strong><span style="color: blue">BrowseForFolder</span></strong> объекта <span style="color: blue">Shell.Application</span>.<br />Сценарий ориентирован на работу в графическом режиме.<br />[code]Option Explicit</p><p>Dim objWsNet, strComputer<br />Dim objShell, objFolder, strPath<br />Dim objWMI, objSecSettings, objSD, objACE<br />Dim strList, strTemp, intTemp<br />Const ACCESS_ALLOWED_ACE_TYPE = 0 &#039;Флаг-признак записи типа &quot;РАЗРЕШЕНИЕ&quot;<br />Const ACCESS_DENIED_ACE_TYPE&nbsp; = 1 &#039;Флаг-признак записи типа &quot;ЗАПРЕТ&quot;<br />Const INHERITED_ACE = 16 &#039;Флаг-признак того, что текущая запись DACL унаследована от родительского каталога </p><p>Set objShell = CreateObject(&quot;Shell.Application&quot;)<br />Set objFolder = objShell.BrowseForFolder(0, &quot;Выбор каталога&quot;, &amp;h10 + &amp;h200, &amp;h11)<br />If Not objFolder Is Nothing Then<br />&nbsp; &nbsp; strPath = objFolder.Self.Path<br />&nbsp; &nbsp; Set objWsNet = CreateObject(&quot;WScript.Network&quot;)<br />&nbsp; &nbsp; strComputer = objWsNet.ComputerName<br />&nbsp; &nbsp; Set objWsNet = Nothing<br />&nbsp; &nbsp; Set objWMI = GetObject(&quot;winmgmts:{impersonationLevel=impersonate}!\\&quot; &amp; strComputer &amp; &quot;\root\cimv2&quot;)<br />&nbsp; &nbsp; Set objSecSettings = objWMI.Get(&quot;Win32_LogicalFileSecuritySetting.Path=&#039;&quot; &amp; strPath &amp; &quot;&#039;&quot;)<br />&nbsp; &nbsp; If objSecSettings.GetSecurityDescriptor(objSD) = 0 Then &#039;Чтение содержимого дескриптора безопасности каталога<br />&nbsp; &nbsp; &nbsp; &nbsp; If Not IsNull(objSD.DACL) Then &#039;Проверка наличия хотя бы одной записи в DACL каталога<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; strList = vbNullString<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &#039;--- Просмотр DACL каталога<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; For Each objACE In objSD.DACL<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &#039;--- Определение режима наследования записи и области её действия<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; If CBool(objACE.AceFlags And INHERITED_ACE) Then<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; strTemp = &quot; - унаследовано &quot;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; intTemp = objACE.AceFlags - INHERITED_ACE<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Else<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; strTemp = &quot; - не унаследовано &quot;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; intTemp = objACE.AceFlags<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; End If<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Select Case intTemp<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Case 0: strTemp = strTemp &amp; &quot;(действует на: только текущий каталог); &quot;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Case 1: strTemp = strTemp &amp; &quot;(действует на: текущий каталог и его файлы); &quot;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Case 2: strTemp = strTemp &amp; &quot;(действует на: текущий каталог и его подкаталоги); &quot;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Case 3: strTemp = strTemp &amp; &quot;(действует на: текущий каталог, его подкаталоги и файлы); &quot;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Case 9: strTemp = strTemp &amp; &quot;(действует на: только файлы текущего каталога); &quot;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Case 10: strTemp = strTemp &amp; &quot;(действует на: только подкаталоги текущего каталога); &quot;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Case 11: strTemp = strTemp &amp; &quot;(действует на: подкаталоги и файлы текущего каталога); &quot;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Case Else: strTemp = strTemp &amp; &quot;(область действия не определена); &quot;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; End Select<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &#039;------<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &#039;--- Определение типа записи<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; If objACE.AceType = ACCESS_ALLOWED_ACE_TYPE Then<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; strTemp = strTemp &amp; &quot;Разрешено с маской&quot;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Else<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; strTemp = strTemp &amp; &quot;Запрещено с маской&quot;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; End If<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &#039;------<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; strTemp = strTemp &amp; &quot; -&gt; &quot; &amp; CStr(objACE.AccessMask) &amp; &quot; (&amp;h&quot; &amp; Hex(objACE.AccessMask) &amp; &quot;)&quot;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; strList = strList &amp; objACE.Trustee.Domain &amp; &quot;\&quot; &amp; objACE.Trustee.Name &amp; strTemp &amp; vbNewLine &amp; &quot;------&quot; &amp; vbNewLine<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Next<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Set objACE = Nothing<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &#039;------<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; WScript.Echo strList<br />&nbsp; &nbsp; &nbsp; &nbsp; Else<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; WScript.Echo &quot;Список управления доступом к каталогу &quot; &amp; UCase(strPath) &amp; &quot; пуст.&quot;<br />&nbsp; &nbsp; &nbsp; &nbsp; End If<br />&nbsp; &nbsp; Else<br />&nbsp; &nbsp; &nbsp; &nbsp; WScript.Echo &quot;Не удалось прочитать дескриптор безопасности каталога &quot; &amp; UCase(strPath)<br />&nbsp; &nbsp; End If<br />&nbsp; &nbsp; Set objSD = Nothing<br />&nbsp; &nbsp; Set objSecSettings = Nothing<br />&nbsp; &nbsp; Set objWMI = Nothing<br />Else<br />&nbsp; &nbsp; WScript.Echo &quot;Каталог не выбран.&quot;<br />End If<br />Set objFolder = Nothing<br />Set objShell = Nothing<br />WScript.Quit 0[/code]<br /><strong>Сценарий 2.<br />Получение подробного (полного или частичного) списка управления доступом NTFS (DACL) указанного каталога текущего компьютера.</strong></p><p>Частичный список составляется в том случае, когда задано NetBIOS-имя пользователя (группы), в противном случае составляется полный список.<br />Можно указать имя объекта либо доменного, либо локального (для текущего компьютера) уровня. Допустимо указание имён ряда встроенных локальных объектов: &quot;System&quot; (или &quot;Система&quot;), &quot;Все&quot;, &quot;Администратор(ы)&quot;, &quot;Гост(ь)(и)&quot; и т.п. Имена объектов можно задавать как в кавычках, так и без них.<br />Для каждой записи DACL сценарий позволяет определить:<br />- идентификатор учётной записи в формате &quot;домен\имя&quot;;<br />- тип;<br />- режим наследования настроек от родительского каталога;<br />- <strong><span style="color: green">маску доступа (в текстовой форме, с детализацией)</span></strong>;<br />- область действия по отношению к дочерним объектам каталога.<br />Сценарий требует привилегий локального администратора.<br />Каталог выбирается с помощью метода <strong><span style="color: blue">BrowseForFolder</span></strong> объекта <span style="color: blue">Shell.Application</span>.<br />Сценарий ориентирован на работу в графическом режиме.<br />[code]Option Explicit</p><p>Dim objShell, objFolder, strPath<br />Dim objWsNet, strDomain, strComputer, blnIsDomain, intOSVersion<br />Dim objWMI, objCollection, objItem, objSecSettings, objSD<br />Dim strAccount, strSID, strList<br />Dim intHasAccount &#039;Флаг-признак режима работы:<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &#039;-1 - не составлять список, т.к. указанная &quot;учётка&quot; не найдена;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &#039;0&nbsp; - составлять полный список;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &#039;1&nbsp; - составлять частичный список (только для указанной &quot;учётки&quot;).</p><p>Set objShell = CreateObject(&quot;Shell.Application&quot;)<br />Set objFolder = objShell.BrowseForFolder(0, &quot;Выбор каталога&quot;, &amp;h10 + &amp;h200, &amp;h11)<br />If Not objFolder Is Nothing Then<br />&nbsp; &nbsp; strPath = objFolder.Self.Path<br />&nbsp; &nbsp; Set objWsNet = CreateObject(&quot;WScript.Network&quot;)<br />&nbsp; &nbsp; strDomain = objWsNet.UserDomain<br />&nbsp; &nbsp; strComputer = objWsNet.ComputerName<br />&nbsp; &nbsp; Set objWsNet = Nothing<br />&nbsp; &nbsp; If StrComp(strDomain, strComputer, vbTextCompare) &lt;&gt; 0 Then blnIsDomain = True<br />&nbsp; &nbsp; Set objWMI = GetObject(&quot;winmgmts:{impersonationLevel=impersonate}!\\&quot; &amp; strComputer &amp; &quot;\root\cimv2&quot;)<br />&nbsp; &nbsp; &#039;--- Определение версии ОС<br />&nbsp; &nbsp; Set objCollection = objWMI.ExecQuery(&quot;SELECT Version FROM Win32_OperatingSystem&quot;)<br />&nbsp; &nbsp; For Each objItem In objCollection<br />&nbsp; &nbsp; &nbsp; &nbsp; intOSVersion = CInt(Replace(Left(objItem.Version, 3), &quot;.&quot;, &quot;&quot;))<br />&nbsp; &nbsp; Next<br />&nbsp; &nbsp; Set objItem = Nothing<br />&nbsp; &nbsp; &#039;------<br />&nbsp; &nbsp; strAccount = Trim(InputBox(&quot;Имя пользователя или группы&quot; &amp; vbNewLine &amp; _<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &quot;(при составлении полного списка -&quot; &amp; vbNewLine &amp; _<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &quot;не указывать):&quot;, &quot;Проверка настроек безопасности NTFS&quot;))<br />&nbsp; &nbsp; intHasAccount = 0<br />&nbsp; &nbsp; If Len(strAccount) &gt; 0 Then<br />&nbsp; &nbsp; &nbsp; &nbsp; strAccount = Replace(strAccount, &quot;&quot;&quot;&quot;, &quot;&quot;)<br />&nbsp; &nbsp; &nbsp; &nbsp; &#039;--- Настройка правильного наименования &quot;учётки&quot; локальной ОС в зависимости от версии ОС<br />&nbsp; &nbsp; &nbsp; &nbsp; If intOSVersion &lt; 61 Then<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; strAccount = Replace(strAccount, &quot;Система&quot;, &quot;System&quot;, 1, -1, vbTextCompare)<br />&nbsp; &nbsp; &nbsp; &nbsp; Else<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; strAccount = Replace(strAccount, &quot;System&quot;, &quot;Система&quot;, 1, -1, vbTextCompare)<br />&nbsp; &nbsp; &nbsp; &nbsp; End If<br />&nbsp; &nbsp; &nbsp; &nbsp; &#039;------<br />&nbsp; &nbsp; &nbsp; &nbsp; If StrComp(strAccount, &quot;System&quot;, vbTextCompare) = 0 Or StrComp(strAccount, &quot;Система&quot;, vbTextCompare) = 0 Or _<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; StrComp(strAccount, &quot;Все&quot;, vbTextCompare) = 0 Then<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; strDomain = vbNullString<br />&nbsp; &nbsp; &nbsp; &nbsp; Else<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; If blnIsDomain Then<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; If MsgBox(&quot;Задана доменная учётная запись?&quot;, vbYesNo + vbQuestion, &quot;Проверка настроек безопасности NTFS&quot;) = vbNo Then<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; strDomain = strComputer<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; End If<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Else<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; strDomain = strComputer<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; End If<br />&nbsp; &nbsp; &nbsp; &nbsp; End If<br />&nbsp; &nbsp; &nbsp; &nbsp; &#039;--- Поиск заданной &quot;учётки&quot; на локальном компьютере или в Active Directory<br />&nbsp; &nbsp; &nbsp; &nbsp; If Len(strDomain) &gt; 0 Then<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Set objCollection = objWMI.ExecQuery(&quot;SELECT SID FROM Win32_Account WHERE Domain=&#039;&quot; &amp; strDomain &amp; &quot;&#039; AND Name=&#039;&quot; &amp; strAccount &amp; &quot;&#039;&quot;)<br />&nbsp; &nbsp; &nbsp; &nbsp; Else<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Set objCollection = objWMI.ExecQuery(&quot;SELECT SID FROM Win32_Account WHERE Name=&#039;&quot; &amp; strAccount &amp; &quot;&#039;&quot;)<br />&nbsp; &nbsp; &nbsp; &nbsp; End If<br />&nbsp; &nbsp; &nbsp; &nbsp; &#039;------<br />&nbsp; &nbsp; &nbsp; &nbsp; If objCollection.Count &gt; 0 Then<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; intHasAccount = 1<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &#039;--- Определение SID заданной &quot;учётки&quot;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; For Each objItem In objCollection<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; strSID = UCase(objItem.SID)<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Next<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &#039;------<br />&nbsp; &nbsp; &nbsp; &nbsp; Else<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; intHasAccount = -1<br />&nbsp; &nbsp; &nbsp; &nbsp; End If<br />&nbsp; &nbsp; End If<br />&nbsp; &nbsp; If intHasAccount &gt;=0 Then<br />&nbsp; &nbsp; &nbsp; &nbsp; Set objSecSettings = objWMI.Get(&quot;Win32_LogicalFileSecuritySetting.Path=&#039;&quot; &amp; strPath &amp; &quot;&#039;&quot;)<br />&nbsp; &nbsp; &nbsp; &nbsp; If objSecSettings.GetSecurityDescriptor(objSD) = 0 Then &#039;Чтение содержимого дескриптора безопасности каталога<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; strList = vbNullString<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; If Not IsNull(objSD.DACL) Then &#039;Проверка наличия хотя бы одной записи в DACL каталога<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Call Get_DACLInfo(objSD.DACL, strList, intHasAccount, strSID, intOSVersion)<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; If Len(strList) &gt; 0 Then<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; WScript.Echo strList<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Else<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; WScript.Echo &quot;В DACL не обнаружено ни одной записи для объекта &quot; &amp; UCase(strDomain &amp; &quot;\&quot; &amp; strAccount)<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; End If<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Else<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; WScript.Echo &quot;Список управления доступом к каталогу &quot; &amp; UCase(strPath) &amp; &quot; пуст.&quot;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; End If<br />&nbsp; &nbsp; &nbsp; &nbsp; Else<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; WScript.Echo &quot;Не удалось прочитать дескриптор безопасности каталога &quot; &amp; UCase(strPath)<br />&nbsp; &nbsp; &nbsp; &nbsp; End If<br />&nbsp; &nbsp; Else<br />&nbsp; &nbsp; &nbsp; &nbsp; WScript.Echo &quot;Учётная запись объекта &quot; &amp; UCase(strDomain &amp; &quot;\&quot; &amp; strAccount) &amp; &quot; не найдена.&quot;<br />&nbsp; &nbsp; End If<br />&nbsp; &nbsp; Set objSecSettings = Nothing<br />&nbsp; &nbsp; Set objCollection = Nothing<br />&nbsp; &nbsp; Set objWMI = Nothing<br />Else<br />&nbsp; &nbsp; WScript.Echo &quot;Каталог не выбран.&quot;<br />End If<br />Set objFolder = Nothing<br />Set objShell = Nothing<br />WScript.Quit 0</p><p>&#039;======</p><p>Function Get_DACLInfo(arrACE(), strRes, intMode, strAccSID, intVer)<br />Dim objEntry, strTemp, i, j, lngMask, lngTemp<br />Dim arrFlagValue, arrFlagName, arrGenericValue, arrGenericName<br />Dim arrSieveGE, arrSieveGW, arrSieveGR, arrTemp<br />Const PART_MODE = 1 &#039;Флаг-признак составления частичного списка<br />&#039;--- Значения универсальных масок<br />Const GENERIC_ALL = &amp;H10000000<br />Const GENERIC_EXECUTE = &amp;H20000000<br />Const GENERIC_WRITE = &amp;H40000000<br />Const GENERIC_READ = &amp;H80000000<br />&#039;------<br />Const ACCESS_ALLOWED_ACE_TYPE = 0 &#039;Флаг-признак записи типа &quot;РАЗРЕШЕНИЕ&quot;<br />Const ACCESS_DENIED_ACE_TYPE&nbsp; = 1 &#039;Флаг-признак записи типа &quot;ЗАПРЕТ&quot;<br />Const INHERITED_ACE = 16 &#039;Флаг-признак того, что текущая запись DACL унаследована от родительского каталога <br />Const FULL_ACCESS = 983551 &#039;Значение маски полного разрешения или запрета<br />Const FLAG_SYNCHRONIZE = 1048576 &#039;Значение флага синхронизации доступа к объекту файловой системы<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&#039;(в версиях ОС &quot;2000/XP&quot;, применим только для записей типа &quot;РАЗРЕШЕНИЕ&quot;)</p><p>&#039;arrFlagValue = Array(&amp;H20, &amp;H1, &amp;H80, &amp;H8, &amp;H2, &amp;H4, &amp;H100, &amp;H10, &amp;H40, &amp;H10000, &amp;H20000, &amp;H40000, &amp;H80000)<br />arrFlagValue = Array(32, 1, 128, 8, 2, 4, 256, 16, 64, 65536, 131072, 262144, 524288)<br />arrFlagName = Array(&quot;Траверс папок / Выполнение файлов&quot;, _<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &quot;Содержание папки / Чтение данных&quot;, _<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &quot;Чтение атрибутов&quot;, _<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &quot;Чтение дополнительных атрибутов&quot;, _<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &quot;Создание файлов / Запись данных&quot;, _<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &quot;Создание папок / Дозапись данных&quot;, _<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &quot;Запись атрибутов&quot;, _<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &quot;Запись дополнительных атрибутов&quot;, _<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &quot;Удаление подпапок и файлов&quot;, _<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &quot;Удаление&quot;, _<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &quot;Чтение разрешений&quot;, _<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &quot;Смена разрешений&quot;, _<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &quot;Смена владельца&quot;)<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />arrGenericValue = Array(&amp;H20000000, &amp;H40000000, &amp;H80000000)<br />&#039;arrGenericValue = Array(536870912, 1073741824, 2147483648)<br />arrGenericName = Array(&quot;Выполнение (универсальная маска)&quot;, &quot;Запись (универсальная маска)&quot;, &quot;Чтение (универсальная маска)&quot;)<br />&#039;--- Вспомогательные массивы, предназначенные для детализации универсальных масок<br />arrSieveGE = Array(-1, 0, -1, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0)<br />arrSieveGW = Array(0, 0, 0, 0, -1, -1, -1, -1, 0, 0, -1, 0, 0)<br />arrSieveGR = Array(0, -1, -1, -1, 0, 0, 0, 0, 0, 0, -1, 0, 0)<br />&#039;------</p><p>&#039;--- Настройка правильного наименования одного из флагов маски доступа в зависимости от версии ОС<br />If intVer &lt; 60 Then<br />&nbsp; &nbsp; arrFlagName(0) = &quot;Обзор папок / Выполнение файлов&quot;<br />End If<br />&#039;------<br />For Each objEntry In arrACE<br />&nbsp; &nbsp; &#039;--- Определение режима наследования записи и области её действия<br />&nbsp; &nbsp; If CBool(objEntry.AceFlags And INHERITED_ACE) Then<br />&nbsp; &nbsp; &nbsp; &nbsp; strTemp = &quot; (унаследовано; &quot;<br />&nbsp; &nbsp; &nbsp; &nbsp; lngTemp = objEntry.AceFlags - INHERITED_ACE<br />&nbsp; &nbsp; Else<br />&nbsp; &nbsp; &nbsp; &nbsp; strTemp = &quot; (не унаследовано; &quot;<br />&nbsp; &nbsp; &nbsp; &nbsp; lngTemp = objEntry.AceFlags<br />&nbsp; &nbsp; End If<br />&nbsp; &nbsp; Select Case lngTemp<br />&nbsp; &nbsp; &nbsp; &nbsp; Case 0: strTemp = strTemp &amp; &quot;действует на: только текущий каталог)&quot;<br />&nbsp; &nbsp; &nbsp; &nbsp; Case 1: strTemp = strTemp &amp; &quot;действует на: текущий каталог и его файлы)&quot;<br />&nbsp; &nbsp; &nbsp; &nbsp; Case 2: strTemp = strTemp &amp; &quot;действует на: текущий каталог и его подкаталоги)&quot;<br />&nbsp; &nbsp; &nbsp; &nbsp; Case 3: strTemp = strTemp &amp; &quot;действует на: текущий каталог, его подкаталоги и файлы)&quot;<br />&nbsp; &nbsp; &nbsp; &nbsp; Case 9: strTemp = strTemp &amp; &quot;действует на: только файлы текущего каталога)&quot;<br />&nbsp; &nbsp; &nbsp; &nbsp; Case 10: strTemp = strTemp &amp; &quot;действует на: только подкаталоги текущего каталога)&quot;<br />&nbsp; &nbsp; &nbsp; &nbsp; Case 11: strTemp = strTemp &amp; &quot;действует на: подкаталоги и файлы текущего каталога)&quot;<br />&nbsp; &nbsp; &nbsp; &nbsp; Case Else: strTemp = strTemp &amp; &quot;область действия не определена); &quot;<br />&nbsp; &nbsp; End Select<br />&nbsp; &nbsp; strTemp = strTemp &amp; vbNewLine &amp; &quot;---&quot; &amp; vbNewLine<br />&nbsp; &nbsp; &#039;------<br />&nbsp; &nbsp; &#039;--- Определение типа записи<br />&nbsp; &nbsp; If objEntry.AceType = ACCESS_ALLOWED_ACE_TYPE Then<br />&nbsp; &nbsp; &nbsp; &nbsp; strTemp = strTemp &amp; &quot;РАЗРЕШЕНО:&quot; &amp; vbNewLine<br />&nbsp; &nbsp; ElseIf objEntry.AceType = ACCESS_DENIED_ACE_TYPE Then<br />&nbsp; &nbsp; &nbsp; &nbsp; strTemp = strTemp &amp; &quot;ЗАПРЕЩЕНО:&quot; &amp; vbNewLine<br />&nbsp; &nbsp; End If<br />&nbsp; &nbsp; &#039;------<br />&nbsp; &nbsp; &#039;--- Определение значения маски &quot;Полный доступ&quot; в зависимости от версии ОС<br />&nbsp; &nbsp; If intVer &lt; 52 Then<br />&nbsp; &nbsp; &nbsp; &nbsp; lngTemp = FULL_ACCESS + Abs(objEntry.AceType - 1) * FLAG_SYNCHRONIZE<br />&nbsp; &nbsp; &nbsp; &nbsp; &#039;Выражение FULL_ACCESS + Abs(objEntry.AceType - 1) * FLAG_SYNCHRONIZE<br />&nbsp; &nbsp; &nbsp; &nbsp; &#039;учитывает разницу между значениями маски &quot;Полный доступ&quot; у записей разных типов<br />&nbsp; &nbsp; &nbsp; &nbsp; &#039;в ОС версий &quot;2000/XP&quot;<br />&nbsp; &nbsp; Else<br />&nbsp; &nbsp; &nbsp; &nbsp; lngTemp = FULL_ACCESS + FLAG_SYNCHRONIZE<br />&nbsp; &nbsp; End If<br />&nbsp; &nbsp; &#039;------<br />&nbsp; &nbsp; lngMask = objEntry.AccessMask<br />&nbsp; &nbsp; Select Case Abs(lngMask)<br />&nbsp; &nbsp; &nbsp; &nbsp; Case lngTemp: strTemp = strTemp &amp; &quot;Полный доступ&quot; &amp; vbNewLine<br />&nbsp; &nbsp; &nbsp; &nbsp; Case GENERIC_ALL: strTemp = strTemp &amp; &quot;Полный доступ (универсальная маска)&quot; &amp; vbNewLine<br />&nbsp; &nbsp; &nbsp; &nbsp; Case Else<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &#039;--- Детальный анализ маски доступа текущей записи:<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &#039;обработка универсальных масок (биты №№ 29 - 31)<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; If Abs(lngMask) &gt; lngTemp Then<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; For i = 0 To UBound(arrGenericValue)<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; If lngMask And arrGenericValue(i) Then<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; strTemp = strTemp &amp; arrGenericName(i) &amp; vbNewLine &amp; vbTab &amp; &quot;{&quot; &amp; vbNewLine<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Select Case arrGenericValue(i)<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Case GENERIC_EXECUTE: arrTemp = arrSieveGE<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Case GENERIC_WRITE: arrTemp = arrSieveGW<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Case GENERIC_READ: arrTemp = arrSieveGR<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; End Select<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; For j = 0 To UBound(arrTemp)<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; If arrTemp(j) Then strTemp = strTemp &amp; vbTab &amp; arrFlagName(j) &amp; vbNewLine<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Next<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; strTemp = strTemp &amp; vbTab &amp; &quot;}&quot; &amp; vbNewLine<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; End If<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Next<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; End If<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &#039;обработка обычных масок (биты №№ 0 - 20)<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; For i = 0 To UBound(arrFlagValue)<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; If lngMask And arrFlagValue(i) Then<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; strTemp = strTemp &amp; arrFlagName(i) &amp; vbNewLine<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; End If<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Next<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &#039;------<br />&nbsp; &nbsp; End Select<br />&nbsp; &nbsp; strTemp = UCase(objEntry.Trustee.Domain &amp; &quot;\&quot; &amp; objEntry.Trustee.Name) &amp; strTemp &amp; &quot;===&quot; &amp; vbNewLine<br />&nbsp; &nbsp; If intMode = PART_MODE Then<br />&nbsp; &nbsp; &nbsp; &nbsp; If StrComp(UCase(objEntry.Trustee.SIDString), strAccSID, vbTextCompare) = 0 Then<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; strRes = strRes &amp; strTemp<br />&nbsp; &nbsp; &nbsp; &nbsp; End If<br />&nbsp; &nbsp; Else<br />&nbsp; &nbsp; &nbsp; &nbsp; strRes = strRes &amp; strTemp<br />&nbsp; &nbsp; End If<br />Next<br />End Function[/code]<br /><strong>Сценарий 3.<br />Изменение списка управления доступом NTFS (DACL) указанного каталога текущего компьютера <span style="color: brown">без сохранения настроек, унаследованных от &quot;родителя&quot;</span>.</strong></p><p>Варианты изменения DACL:<br />- изменение типа существующей записи и (или) её маски доступа;<br />- добавление отсутствующей записи заданного типа и с заданной маской;<br />- удаление существующей записи.<br />Для работы сценария необходимо задать NetBIOS-имя учётной записи, для которой необходимо изменить соответствующую запись DACL.<br />Можно указать имя объекта либо доменного, либо локального (для текущего компьютера) уровня. Допустимо указание имён ряда встроенных локальных объектов: &quot;System&quot; (или &quot;Система&quot;), &quot;Все&quot;, &quot;Администратор(ы)&quot;, &quot;Гост(ь)(и)&quot; и т.п. Имена объектов можно задавать как в кавычках, так и без них.<br />Сценарий требует привилегий локального администратора.<br />Каталог выбирается с помощью метода <strong><span style="color: blue">BrowseForFolder</span></strong> объекта <span style="color: blue">Shell.Application</span>.<br />Сценарий ориентирован на работу в графическом режиме.<br /><strong><span style="color: brown">Внимание!<br />1. Ни рациональность, ни, тем более, осмысленность заданного действия сценарием не проверяется.<br />2. Выбор записей DACL для обработки ведётся только по SID соответствующего объекта. Таким образом, все записи для данного объекта (независимо от их типа и маски) будут преобразованы в полные дубликаты, после чего ОС (в процессе оптимизации DACL) оставит только один экземпляр, удалив все остальные (записи с разной областью действия останутся в списке).<br />3. Для упрощения кода данная версия сценария не обеспечивает возможности задания произвольной области действия записи при её добавлении в список. Автоматически задаётся область действия по умолчанию (текущий каталог, его подкаталоги и файлы).<br />4. В Win 2000 Pro с SP ниже 4 возможно ограничение функциональности при попытке удаления записи: запись в DACL может остаться, но не иметь ни одного установленного флага маски доступа.<br /></span></strong><br />[code]Option Explicit</p><p>Dim objWsNet, strDomain, strComputer, strAccount, blnIsDomain<br />Dim objShell, objFolder, strPath, xResult, intTemp<br />Dim objWMI, objCollection, objItem, intOSVersion<br />Dim arrACEMasks, intACEType, lngACEMask, blnAddACE<br />Const ACCESS_ALLOWED_ACE_TYPE = 0 &#039;Флаг-признак записи типа &quot;РАЗРЕШЕНИЕ&quot;<br />Const ACCESS_DENIED_ACE_TYPE = 1 &#039;Флаг-признак записи типа &quot;ЗАПРЕТ&quot;<br />Const REMOVE_ACE = 0 &#039;Значение маски для удаления записи из DACL<br />&#039;--- Набор типичных значений масок доступа<br />Const WRITE_ONLY = 278<br />Const READ_ONLY = 131209<br />Const READ_AND_EXECUTE = 131241<br />Const READ_WRITE = 131487<br />Const READ_WRITE_EXECUTE = 131519<br />Const MODIFY = 197055<br />Const MODIFY_AND_REMOVE_CHILDREN = 197119<br />Const CHANGE_DACL = 262144<br />Const ACCESS_WITHOUT_CHANGE_OWNER = 459263<br />Const CHANGE_OWNER = 524288<br />Const CHANGE_DACL_AND_OWNER = 786432<br />Const FULL_ACCESS = 983551<br />&#039;---<br />Const FLAG_SYNCHRONIZE = 1048576 &#039;Значение флага синхронизации доступа к объекту файловой системы<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&#039;(применим только для записей типа &quot;РАЗРЕШЕНИЕ&quot;)</p><p>arrACEMasks = Array(REMOVE_ACE, WRITE_ONLY, READ_ONLY, READ_AND_EXECUTE, READ_WRITE, READ_WRITE_EXECUTE, MODIFY, _<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; MODIFY_AND_REMOVE_CHILDREN, CHANGE_DACL, ACCESS_WITHOUT_CHANGE_OWNER, CHANGE_OWNER, _<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; CHANGE_DACL_AND_OWNER, FULL_ACCESS)<br />strAccount = Trim(InputBox(&quot;Имя учётной записи:&quot;, &quot;Настройка безопасности NTFS&quot;))<br />If Len(strAccount) &gt; 0 Then<br />&nbsp; &nbsp; Set objShell = CreateObject(&quot;Shell.Application&quot;)<br />&nbsp; &nbsp; Set objFolder = objShell.BrowseForFolder(0, &quot;Выбор каталога&quot;, &amp;h10 + &amp;h200, &amp;h11)<br />&nbsp; &nbsp; If Not objFolder Is Nothing Then<br />&nbsp; &nbsp; &nbsp; &nbsp; strPath = objFolder.Self.Path<br />&nbsp; &nbsp; &nbsp; &nbsp; Set objWsNet = CreateObject(&quot;WScript.Network&quot;)<br />&nbsp; &nbsp; &nbsp; &nbsp; strDomain = objWsNet.UserDomain<br />&nbsp; &nbsp; &nbsp; &nbsp; strComputer = objWsNet.ComputerName<br />&nbsp; &nbsp; &nbsp; &nbsp; Set objWsNet = Nothing<br />&nbsp; &nbsp; &nbsp; &nbsp; Set objWMI = GetObject(&quot;winmgmts:{impersonationLevel=impersonate}!\\&quot; &amp; strComputer &amp; &quot;\root\cimv2&quot;)<br />&nbsp; &nbsp; &nbsp; &nbsp; &#039;--- Определение версии ОС<br />&nbsp; &nbsp; &nbsp; &nbsp; Set objCollection = objWMI.ExecQuery(&quot;SELECT Version FROM Win32_OperatingSystem&quot;)<br />&nbsp; &nbsp; &nbsp; &nbsp; For Each objItem In objCollection<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; intOSVersion = CInt(Replace(Left(objItem.Version, 3), &quot;.&quot;, &quot;&quot;))<br />&nbsp; &nbsp; &nbsp; &nbsp; Next<br />&nbsp; &nbsp; &nbsp; &nbsp; Set objItem = Nothing<br />&nbsp; &nbsp; &nbsp; &nbsp; Set objCollection = Nothing<br />&nbsp; &nbsp; &nbsp; &nbsp; Set objWMI = Nothing<br />&nbsp; &nbsp; &nbsp; &nbsp; &#039;------&nbsp; &nbsp; <br />&nbsp; &nbsp; &nbsp; &nbsp; strAccount = Replace(strAccount, &quot;&quot;&quot;&quot;, &quot;&quot;)<br />&nbsp; &nbsp; &nbsp; &nbsp; &#039;--- Настройка правильного наименования &quot;учётки&quot; локальной ОС в зависимости от версии ОС<br />&nbsp; &nbsp; &nbsp; &nbsp; If intOSVersion &lt; 61 Then<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; strAccount = Replace(strAccount, &quot;Система&quot;, &quot;System&quot;, 1, -1, vbTextCompare)<br />&nbsp; &nbsp; &nbsp; &nbsp; Else<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; strAccount = Replace(strAccount, &quot;System&quot;, &quot;Система&quot;, 1, -1, vbTextCompare)<br />&nbsp; &nbsp; &nbsp; &nbsp; End If<br />&nbsp; &nbsp; &nbsp; &nbsp; &#039;------<br />&nbsp; &nbsp; &nbsp; &nbsp; If StrComp(strDomain, strComputer, vbTextCompare) &lt;&gt; 0 Then blnIsDomain = True<br />&nbsp; &nbsp; &nbsp; &nbsp; If StrComp(strAccount, &quot;System&quot;, vbTextCompare) = 0 Or StrComp(strAccount, &quot;Система&quot;, vbTextCompare) = 0 Or _<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; StrComp(strAccount, &quot;Все&quot;, vbTextCompare) = 0 Then<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; strDomain = vbNullString<br />&nbsp; &nbsp; &nbsp; &nbsp; Else<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; If blnIsDomain Then<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; If MsgBox(&quot;Задана доменная учётная запись?&quot;, vbYesNo + vbQuestion, &quot;Проверка настроек безопасности NTFS&quot;) = vbNo Then<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; strDomain = strComputer<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; End If<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Else<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; strDomain = strComputer<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; End If<br />&nbsp; &nbsp; &nbsp; &nbsp; End If<br />&nbsp; &nbsp; &nbsp; &nbsp; <br />&nbsp; &nbsp; &nbsp; &nbsp; intTemp = Trim(InputBox(&quot;Тип доступа и маска доступа в формате&quot; &amp; vbNewLine &amp; _<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &quot;+ЧИСЛО (разрешить) или -ЧИСЛО (запретить),&quot; &amp; vbNewLine &amp; _<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &quot;где ЧИСЛО:&quot; &amp; vbNewLine &amp; _<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &quot;1 - запись;&quot; &amp; vbNewLine &amp; _<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &quot;2 - только чтение;&quot; &amp; vbNewLine &amp; _<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &quot;3 - чтение и выполнение;&quot; &amp; vbNewLine &amp; _<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &quot;4 - чтение и запись (без выполнения);&quot; &amp; vbNewLine &amp; _<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &quot;5 - чтение, запись, выполнение;&quot; &amp; vbNewLine &amp; _<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &quot;6 - изменение (без удаления подпапок и файлов);&quot; &amp; vbNewLine &amp; _<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &quot;7 - изменение (с удалением подпапок и файлов);&quot; &amp; vbNewLine &amp; _<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &quot;8 - смена разрешений;&quot; &amp; vbNewLine &amp; _<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &quot;9 - почти полный доступ (без смены владельца);&quot; &amp; vbNewLine &amp; _<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &quot;10 - смена владельца;&quot; &amp; vbNewLine &amp; _<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &quot;11 - смена разрешений и владельца;&quot; &amp; vbNewLine &amp; _<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &quot;12 - полный доступ.&quot; &amp; vbNewLine &amp; vbNewLine &amp; _<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &quot;Если знак типа доступа (+/-) отсутствует,&quot; &amp; vbNewLine &amp; _<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &quot;то предполагается разрешение.&quot; &amp; vbNewLine &amp; vbNewLine &amp; _<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &quot;Для удаления записи из списка&quot; &amp; vbNewLine &amp; _<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &quot;в качестве значения маски укажите 0&quot;, &quot;Настройка безопасности NTFS&quot;))<br />&nbsp; &nbsp; &nbsp; &nbsp; <br />&nbsp; &nbsp; &nbsp; &nbsp; If IsNumeric(intTemp) Then<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; intTemp = CInt(intTemp)<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; If Abs(intTemp) &gt;= 0 And Abs(intTemp) &lt;= 12 Then<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; lngACEMask = arrACEMasks(Abs(intTemp))<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; If intTemp &lt; 0 Then<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; intACEType = 1<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; If intOSVersion &gt;= 52 And lngACEMask = FULL_ACCESS Then<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; lngACEMask = lngACEMask + FLAG_SYNCHRONIZE<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &#039;Эта проверка позволяет учесть разницу между значениями маски &quot;Полный доступ&quot;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &#039;у записей разных типов в ОС версий &quot;2000/XP&quot;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; End If<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ElseIf intTemp &gt; 0 Then<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; intACEType = 0<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; lngACEMask = lngACEMask + FLAG_SYNCHRONIZE<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Else<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; intACEType = 0<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; End If<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; If intTemp &lt;&gt; 0 Then<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; If MsgBox(&quot;Добавлять запись в список, если она отсутствует?&quot;, vbYesNo + vbQuestion, _<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &quot;Настройка безопасности NTFS&quot;) = vbYes Then<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; blnAddACE = True<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; End If<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; End If<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; xResult = Modify_DACL(strDomain, strComputer, strAccount, strPath, intACEType, lngACEMask, blnAddACE)<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Else<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; xResult = &quot;Маска доступа задана неверно.&quot;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; End If<br />&nbsp; &nbsp; &nbsp; &nbsp; Else<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; xResult = &quot;Тип доступа или маска доступа не заданы или заданы неверно.&quot;<br />&nbsp; &nbsp; &nbsp; &nbsp; End If<br />&nbsp; &nbsp; &nbsp; &nbsp; Wscript.Echo xResult<br />&nbsp; &nbsp; Else<br />&nbsp; &nbsp; &nbsp; &nbsp; WScript.Echo &quot;Каталог не выбран.&quot;<br />&nbsp; &nbsp; End If<br />&nbsp; &nbsp; Set objShell = Nothing<br />&nbsp; &nbsp; Set objFolder = Nothing<br />Else<br />&nbsp; &nbsp; WScript.Echo &quot;Учётная запись не указана.&quot;<br />End If<br />WScript.Quit 0</p><p>&#039;======</p><p>Function Modify_DACL(strDom, strWS, strSAN, strDir, intType, lngMask, blnAdd)<br />Dim objWMI, objSecSettings, objSD, objACE<br />Dim xRes, arrACE, objCollection, objItem, strSID<br />Dim objSID, objTrustee, objNewACE<br />Dim blnHasACE, i<br />Const SE_DACL_PROTECTED = 4096 &#039;Флаг-признак отключенного режима наследования управляемым каталогом безопасности NTFS от родительского каталога<br />Const OBJECT_INHERIT_ACE = 1 &#039;Флаг-признак области действия записи на текущий каталог и его файлы<br />Const CONTAINER_INHERIT_ACE = 2 &#039;Флаг-признак области действия записи на текущий каталог и его подкаталоги</p><p>On Error Resume Next<br />xRes = 0: blnHasACE = False<br />Set objWMI = GetObject(&quot;winmgmts:{impersonationLevel=impersonate}!\\&quot; &amp; strWS &amp; &quot;\root\cimv2&quot;)<br />If Err.Number = 0 Then<br />&nbsp; &nbsp; Set objSecSettings = objWMI.Get(&quot;Win32_LogicalFileSecuritySetting.Path=&#039;&quot; &amp; strDir &amp; &quot;&#039;&quot;)<br />&nbsp; &nbsp; If Err.Number = 0 Then<br />&nbsp; &nbsp; &nbsp; &nbsp; If objSecSettings.GetSecurityDescriptor(objSD) = 0 Then &#039;Чтение содержимого дескриптора безопасности управляемого каталога<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; If Not IsNull(objSD.DACL) Then &#039;Проверка наличия хотя бы одной записи в DACL управляемого каталога<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &#039;--- Отключение наследования настроек безопасности от &quot;родителя&quot;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; If Not CBool(objSD.ControlFlags And SE_DACL_PROTECTED) Then<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; objSD.ControlFlags = objSD.ControlFlags + SE_DACL_PROTECTED<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; xRes = objSecSettings.SetSecurityDescriptor(objSD)<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; End If<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &#039;------<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; If xRes = 0 Then<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &#039;--- Поиск заданной &quot;учётки&quot; на локальном компьютере или в Active Directory<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; If Len(strDom) &gt; 0 Then<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Set objCollection = objWMI.ExecQuery(&quot;SELECT SID FROM Win32_Account WHERE Domain=&#039;&quot; &amp; strDom &amp; &quot;&#039; AND Name=&#039;&quot; &amp; strSAN &amp; &quot;&#039;&quot;)<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Else<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Set objCollection = objWMI.ExecQuery(&quot;SELECT SID FROM Win32_Account WHERE Name=&#039;&quot; &amp; strSAN &amp; &quot;&#039;&quot;)<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; End If<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &#039;------<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; If objCollection.Count &gt; 0 Then<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &#039;--- Определение SID заданной &quot;учётки&quot;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; For Each objItem In objCollection<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; strSID = UCase(objItem.SID)<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Next<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Set objItem = Nothing<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &#039;------<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &#039;--- Поиск в DACL записи с известным SID<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; For Each objACE In objSD.DACL<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; If UCase(objACE.Trustee.SIDString) = strSID Then<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; blnHasACE = True &#039;флаг-признак того, что запись с искомым SID найдена<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &#039;--- Установка заданных значений типа и маски доступа для найденной записи<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; objACE.AceType = intType<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; objACE.AccessMask = lngMask<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &#039;-----<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; End If<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Next<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &#039;------<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; If blnHasACE Then<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &#039;--- Применение изменений, внесённых в DACL, в том случае,<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &#039;когда хотя бы одна запись с искомым SID там найдена<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; xRes = objSecSettings.SetSecurityDescriptor(objSD)<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Select Case xRes<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Case &quot;0&quot;: xRes = &quot;Успешное завершение.&quot;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Case &quot;2&quot;: xRes = &quot;Не удалось настроить параметры существующей записи &quot; &amp; UCase(strDom &amp; &quot;\&quot; &amp; strSAN) &amp; vbNewLine &amp; &quot;Доступ запрещён.&quot;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Case &quot;5&quot;, &quot;9&quot;: xRes = &quot;Не удалось настроить параметры существующей записи &quot; &amp; UCase(strDom &amp; &quot;\&quot; &amp; strSAN) &amp; vbNewLine &amp; &quot;Для выполнения операции недостаточно полномочий.&quot;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Case &quot;21&quot;: xRes = &quot;Не удалось настроить параметры существующей записи &quot; &amp; UCase(strDom &amp; &quot;\&quot; &amp; strSAN) &amp; vbNewLine &amp; &quot;Заданы недопустимые значения параметров.&quot;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Case Else: xRes = &quot;Не удалось настроить параметры существующей записи &quot; &amp; UCase(strDom &amp; &quot;\&quot; &amp; strSAN) &amp; vbNewLine &amp; &quot;Неизвестная ошибка с кодом: &quot; &amp; xRes<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; End Select&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Else<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; If blnAdd Then<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &#039;--- Добавление в DACL записи с известным SID, если она там не найдена<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; arrACE = objSD.DACL<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Set objSID = objWMI.Get(&quot;Win32_SID.SID=&#039;&quot; &amp; strSID &amp; &quot;&#039;&quot;)<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Set objTrustee = objWMI.Get(&quot;Win32_Trustee&quot;).Spawninstance_<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; objTrustee.Domain = strDom<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; objTrustee.Name = strSAN<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; objTrustee.SID = objSID.BinaryRepresentation<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; objTrustee.SidLength = objSID.SidLength<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; objTrustee.SIDString = strSID<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Set objSID = Nothing<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Set objNewACE = objWMI.Get(&quot;Win32_Ace&quot;).Spawninstance_<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; objNewACE.AceType&nbsp; = intType<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; objNewACE.AceFlags = OBJECT_INHERIT_ACE + CONTAINER_INHERIT_ACE<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; objNewACE.AccessMask = lngMask<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; objNewACE.Trustee = objTrustee<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Set objTrustee = Nothing<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; i = UBound(arrACE) + 1<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ReDim Preserve arrACE(i)<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Set arrACE(i) = objNewACE<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; objSD.DACL = arrACE<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Set objNewACE = Nothing<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Erase arrACE<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; xRes = objSecSettings.SetSecurityDescriptor(objSD)<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Select Case xRes<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Case &quot;0&quot;: xRes = &quot;Успешное завершение.&quot;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Case &quot;2&quot;: xRes = &quot;Не удалось добавить запись &quot; &amp; UCase(strDom &amp; &quot;\&quot; &amp; strSAN) &amp; vbNewLine &amp; &quot;Доступ запрещён.&quot;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Case &quot;5&quot;, &quot;9&quot;: xRes = &quot;Не удалось добавить запись &quot; &amp; UCase(strDom &amp; &quot;\&quot; &amp; strSAN) &amp; vbNewLine &amp; &quot;Для выполнения операции недостаточно полномочий.&quot;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Case &quot;21&quot;: xRes = &quot;Не удалось добавить запись &quot; &amp; UCase(strDom &amp; &quot;\&quot; &amp; strSAN) &amp; vbNewLine &amp; &quot;Заданы недопустимые значения параметров.&quot;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Case Else: xRes = &quot;Не удалось добавить запись &quot; &amp; UCase(strDom &amp; &quot;\&quot; &amp; strSAN) &amp; vbNewLine &amp; &quot;Неизвестная ошибка с кодом: &quot; &amp; xRes<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; End Select<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &#039;------<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Else<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; xRes = &quot;Запись &quot; &amp; UCase(strDom &amp; &quot;\&quot; &amp; strSAN) &amp; &quot; в DACL объекта &quot; &amp; UCase(strDir) &amp; &quot; отсутствует.&quot;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; End If<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; End If<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Else<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; xRes = &quot;Не найдена учётная запись объекта &quot; &amp; UCase(strDom &amp; &quot;\&quot; &amp; strSAN)<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; End If<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Set objCollection = Nothing<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Else<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; xRes = &quot;Не удалось отключить наследование безопасности для каталога &quot; &amp; UCase(strDir)<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; End If<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Else<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; xRes = &quot;Список управления доступом к каталогу &quot; &amp; UCase(strDir) &amp; &quot; пуст.&quot;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; End If<br />&nbsp; &nbsp; &nbsp; &nbsp; Else<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; xRes = &quot;Не удалось прочитать дескриптор безопасности каталога &quot; &amp; UCase(strDir)<br />&nbsp; &nbsp; &nbsp; &nbsp; End If<br />&nbsp; &nbsp; &nbsp; &nbsp; Set objSD = Nothing<br />&nbsp; &nbsp; &nbsp; &nbsp; Set objSecSettings = Nothing<br />&nbsp; &nbsp; Else<br />&nbsp; &nbsp; &nbsp; &nbsp; xRes = &quot;Ошибка &quot; &amp; CStr(Err.Number) &amp; vbNewLine &amp; Err.Description<br />&nbsp; &nbsp; &nbsp; &nbsp; Err.Clear<br />&nbsp; &nbsp; End If<br />Else<br />&nbsp; &nbsp; xRes = &quot;Ошибка &quot; &amp; CStr(Err.Number) &amp; vbNewLine &amp; Err.Description<br />&nbsp; &nbsp; Err.Clear<br />End If<br />Set objWMI = Nothing<br />On Error GoTo 0<br />Modify_DACL = xRes<br />End Function[/code]<br /><strong>Сценарий 4.<br />Изменение списка управления доступом NTFS (DACL) указанного каталога текущего компьютера <span style="color: green">с сохранением настроек, унаследованных от &quot;родителя&quot;</span>.</strong></p><p>Варианты изменения DACL (все варианты возможны только для не унаследованных записей):<br />- изменение маски доступа существующей записи с учётом области её действия;<br />- добавление отсутствующей записи с заданными типом, областью действия и маской;<br />- удаление существующей записи с учётом её типа и области действия.<br />С помощью сценария можно изменять DACL и того каталога, у которого включено наследование от &quot;родителя&quot;, и того - у которого отключено.</p><p>Для работы сценария необходимо задать NetBIOS-имя учётной записи, для которой необходимо изменить соответствующую запись DACL.<br />Можно указать имя объекта либо доменного, либо локального (для текущего компьютера) уровня. Допустимо указание имён ряда встроенных локальных объектов: &quot;System&quot; (или &quot;Система&quot;), &quot;Все&quot;, &quot;Администратор(ы)&quot;, &quot;Гост(ь)(и)&quot; и т.п. Имена объектов можно задавать как в кавычках, так и без них.<br />Сценарий требует привилегий локального администратора.<br />Каталог выбирается с помощью метода <strong><span style="color: blue">BrowseForFolder</span></strong> объекта <span style="color: blue">Shell.Application</span>.<br />Сценарий ориентирован на работу в графическом режиме.<br /><strong><span style="color: brown">Внимание!<br />1. Ни рациональность, ни, тем более, осмысленность заданного действия сценарием не проверяется.<br />2. В Win 2000 Pro с SP ниже 4 возможно ограничение функциональности при попытке удаления записи: запись в DACL может остаться, но не иметь ни одного установленного флага маски доступа.</span></strong></p><p>[code]Option Explicit</p><p>Dim objWsNet, strDomain, strComputer, strAccount, blnIsDomain<br />Dim objShell, objFolder, strPath, xResult, intTemp, strTemp<br />Dim objWMI, objCollection, objItem, intOSVersion<br />Dim arrACEMasks, arrACEScopes, intACEType, intACEScope, lngACEMask<br />Const ACCESS_ALLOWED_ACE_TYPE = 0 &#039;Флаг-признак записи типа &quot;РАЗРЕШЕНИЕ&quot;<br />Const ACCESS_DENIED_ACE_TYPE = 1 &#039;Флаг-признак записи типа &quot;ЗАПРЕТ&quot;<br />Const OBJECT_INHERIT_ACE = 1 &#039;Флаг-признак области действия записи на текущий каталог и его файлы<br />Const CONTAINER_INHERIT_ACE = 2 &#039;Флаг-признак области действия записи на текущий каталог и его подкаталоги<br />Const REMOVE_ACE = 0 &#039;Значение маски для удаления записи из DACL<br />&#039;--- Допустимые значения для указания областей действия записи <br />Const ANY_SCOPE = -1 &#039;Любая область действия записи<br />Const FOLDER_ONLY = 0 &#039;Только текущая папка<br />Const FOLDER_AND_FILES = 1 &#039;Текущая папка и её файлы<br />Const FOLDER_AND_SUBFOLDERS = 2 &#039;Текущая папка и её подпапки<br />Const FOLDER_SUBFOLDERS_FILES = 3 &#039;Текущая папка её подпапки и файлы<br />Const FILES_ONLY = 9 &#039;Только файлы текущей папки<br />Const SUBFOLDERS_ONLY = 10 &#039;Только подпапки текущей папки<br />Const SUBFOLDERS_AND_FILES = 11 &#039;Подпапки и файлы текущей папки<br />&#039;--- Набор типичных значений масок доступа<br />Const WRITE_ONLY = 278<br />Const READ_ONLY = 131209<br />Const READ_AND_EXECUTE = 131241<br />Const READ_WRITE = 131487<br />Const READ_WRITE_EXECUTE = 131519<br />Const MODIFY = 197055<br />Const MODIFY_AND_REMOVE_CHILDREN = 197119<br />Const CHANGE_DACL = 262144<br />Const ACCESS_WITHOUT_CHANGE_OWNER = 459263<br />Const CHANGE_OWNER = 524288<br />Const CHANGE_DACL_AND_OWNER = 786432<br />Const FULL_ACCESS = 983551<br />&#039;---<br />Const FLAG_SYNCHRONIZE = 1048576 &#039;Значение флага синхронизации доступа к объекту файловой системы<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &#039;(применим только для записей типа &quot;РАЗРЕШЕНИЕ&quot;)</p><p>arrACEMasks = Array(REMOVE_ACE, WRITE_ONLY, READ_ONLY, READ_AND_EXECUTE, READ_WRITE, READ_WRITE_EXECUTE, MODIFY, _<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; MODIFY_AND_REMOVE_CHILDREN, CHANGE_DACL, ACCESS_WITHOUT_CHANGE_OWNER, CHANGE_OWNER, _<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; CHANGE_DACL_AND_OWNER, FULL_ACCESS)<br />arrACEScopes = Array(ANY_SCOPE, FOLDER_ONLY, FOLDER_AND_FILES, FOLDER_AND_SUBFOLDERS, FOLDER_SUBFOLDERS_FILES, _<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; FILES_ONLY, SUBFOLDERS_ONLY, SUBFOLDERS_AND_FILES)<br />strAccount = InputBox(&quot;Имя учётной записи:&quot;, &quot;Настройка безопасности NTFS&quot;)<br />If Len(strAccount) &gt; 0 Then<br />&nbsp; &nbsp; If StrComp(strAccount, &quot;Система&quot;, vbTextCompare) = 0 Then strAccount = &quot;System&quot;<br />&nbsp; &nbsp; Set objShell = CreateObject(&quot;Shell.Application&quot;)<br />&nbsp; &nbsp; Set objFolder = objShell.BrowseForFolder(0, &quot;Выбор каталога&quot;, &amp;H10 + &amp;H200, &amp;H11)<br />&nbsp; &nbsp; If Not objFolder Is Nothing Then<br />&nbsp; &nbsp; &nbsp; &nbsp; strPath = objFolder.Self.Path<br />&nbsp; &nbsp; &nbsp; &nbsp; Set objWsNet = CreateObject(&quot;WScript.Network&quot;)<br />&nbsp; &nbsp; &nbsp; &nbsp; strDomain = objWsNet.UserDomain<br />&nbsp; &nbsp; &nbsp; &nbsp; strComputer = objWsNet.ComputerName<br />&nbsp; &nbsp; &nbsp; &nbsp; Set objWsNet = Nothing<br />&nbsp; &nbsp; &nbsp; &nbsp; Set objWMI = GetObject(&quot;winmgmts:{impersonationLevel=impersonate}!\\&quot; &amp; strComputer &amp; &quot;\root\cimv2&quot;)<br />&nbsp; &nbsp; &nbsp; &nbsp; &#039;--- Определение версии ОС<br />&nbsp; &nbsp; &nbsp; &nbsp; Set objCollection = objWMI.ExecQuery(&quot;SELECT Version FROM Win32_OperatingSystem&quot;)<br />&nbsp; &nbsp; &nbsp; &nbsp; For Each objItem In objCollection<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; intOSVersion = CInt(Replace(Left(objItem.Version, 3), &quot;.&quot;, &quot;&quot;))<br />&nbsp; &nbsp; &nbsp; &nbsp; Next<br />&nbsp; &nbsp; &nbsp; &nbsp; Set objItem = Nothing<br />&nbsp; &nbsp; &nbsp; &nbsp; Set objCollection = Nothing<br />&nbsp; &nbsp; &nbsp; &nbsp; Set objWMI = Nothing<br />&nbsp; &nbsp; &nbsp; &nbsp; &#039;------&nbsp; &nbsp; <br />&nbsp; &nbsp; &nbsp; &nbsp; strAccount = Replace(strAccount, &quot;&quot;&quot;&quot;, &quot;&quot;)<br />&nbsp; &nbsp; &nbsp; &nbsp; &#039;--- Настройка правильного наименования &quot;учётки&quot; локальной ОС в зависимости от версии ОС<br />&nbsp; &nbsp; &nbsp; &nbsp; If intOSVersion &lt; 61 Then<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; strAccount = Replace(strAccount, &quot;Система&quot;, &quot;System&quot;, 1, -1, vbTextCompare)<br />&nbsp; &nbsp; &nbsp; &nbsp; Else<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; strAccount = Replace(strAccount, &quot;System&quot;, &quot;Система&quot;, 1, -1, vbTextCompare)<br />&nbsp; &nbsp; &nbsp; &nbsp; End If<br />&nbsp; &nbsp; &nbsp; &nbsp; &#039;------<br />&nbsp; &nbsp; &nbsp; &nbsp; If StrComp(strDomain, strComputer, vbTextCompare) &lt;&gt; 0 Then blnIsDomain = True&nbsp; &nbsp; &nbsp; &nbsp; <br />&nbsp; &nbsp; &nbsp; &nbsp; If StrComp(strAccount, &quot;System&quot;, vbTextCompare) = 0 Or StrComp(strAccount, &quot;Система&quot;, vbTextCompare) = 0 Or _<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; StrComp(strAccount, &quot;Все&quot;, vbTextCompare) = 0 Then<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; strDomain = vbNullString<br />&nbsp; &nbsp; &nbsp; &nbsp; Else<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; If blnIsDomain Then<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; If MsgBox(&quot;Задана доменная учётная запись?&quot;, vbYesNo + vbQuestion, &quot;Настройка безопасности NTFS&quot;) = vbNo Then<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; strDomain = strComputer<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; End If<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Else<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; strDomain = strComputer<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; End If<br />&nbsp; &nbsp; &nbsp; &nbsp; End If<br />&nbsp; &nbsp; &nbsp; &nbsp; <br />&nbsp; &nbsp; &nbsp; &nbsp; intTemp = Trim(InputBox(&quot;Тип доступа и маска доступа в формате&quot; &amp; vbNewLine &amp; _<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &quot;+ЧИСЛО (разрешить) или -ЧИСЛО (запретить),&quot; &amp; vbNewLine &amp; _<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &quot;где ЧИСЛО:&quot; &amp; vbNewLine &amp; _<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &quot;1 - запись;&quot; &amp; vbNewLine &amp; _<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &quot;2 - только чтение;&quot; &amp; vbNewLine &amp; _<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &quot;3 - чтение и выполнение;&quot; &amp; vbNewLine &amp; _<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &quot;4 - чтение и запись (без выполнения);&quot; &amp; vbNewLine &amp; _<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &quot;5 - чтение, запись, выполнение;&quot; &amp; vbNewLine &amp; _<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &quot;6 - изменение (без удаления подпапок и файлов);&quot; &amp; vbNewLine &amp; _<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &quot;7 - изменение (с удалением подпапок и файлов);&quot; &amp; vbNewLine &amp; _<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &quot;8 - смена разрешений;&quot; &amp; vbNewLine &amp; _<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &quot;9 - почти полный доступ (без смены владельца);&quot; &amp; vbNewLine &amp; _<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &quot;10 - смена владельца;&quot; &amp; vbNewLine &amp; _<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &quot;11 - смена разрешений и владельца;&quot; &amp; vbNewLine &amp; _<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &quot;12 - полный доступ.&quot; &amp; vbNewLine &amp; vbNewLine &amp; _<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &quot;Если знак типа доступа (+/-) отсутствует,&quot; &amp; vbNewLine &amp; _<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &quot;то предполагается разрешение.&quot; &amp; vbNewLine &amp; vbNewLine &amp; _<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &quot;Для удаления записи из списка&quot; &amp; vbNewLine &amp; _<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &quot;в качестве значения маски укажите:&quot; &amp; vbNewLine &amp; _<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &quot;+0 - для записи типа &quot;&quot;РАЗРЕШЕНИЕ&quot;&quot;;&quot; &amp; vbNewLine &amp; _<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &quot;-0 - для записи типа &quot;&quot;ЗАПРЕТ&quot;&quot;;&quot; &amp; vbNewLine &amp; _<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &quot;0 - для записи любого типа.&quot;, &quot;Настройка безопасности NTFS&quot;))<br />&nbsp; &nbsp; &nbsp; &nbsp; <br />&nbsp; &nbsp; &nbsp; &nbsp; If IsNumeric(intTemp) Then<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; strTemp = Left(intTemp, 1)<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; intTemp = CInt(intTemp)<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; If Abs(intTemp) &gt;= 0 And Abs(intTemp) &lt;= 12 Then<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; lngACEMask = arrACEMasks(Abs(intTemp))<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; If intTemp &lt; 0 Then<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; intACEType = 1<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; If intOSVersion &gt;= 52 And lngACEMask = FULL_ACCESS Then<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; lngACEMask = lngACEMask + FLAG_SYNCHRONIZE<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &#039;Эта проверка позволяет учесть разницу между значениями маски &quot;Полный доступ&quot;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &#039;у записей разных типов в ОС версий &quot;2000/XP&quot;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; End If<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ElseIf intTemp &gt; 0 Then<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; intACEType = 0<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; lngACEMask = lngACEMask + FLAG_SYNCHRONIZE<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Else<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Select Case strTemp<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Case &quot;-&quot;: intACEType = 1<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Case &quot;+&quot;: intACEType = 0<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Case Else: intACEType = -1&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; End Select<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; End If<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; intTemp = Trim(InputBox(&quot;Область действия записи:&quot; &amp; vbNewLine &amp; _<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &quot;1 - только текущая папка;&quot; &amp; vbNewLine &amp; _<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &quot;2 - текущая папка и её файлы;&quot; &amp; vbNewLine &amp; _<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &quot;3 - текущая папка и её подпапки;&quot; &amp; vbNewLine &amp; _<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &quot;4 - текущая папка, её подпапки и файлы;&quot; &amp; vbNewLine &amp; _<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &quot;5 - только файлы текущей папки;&quot; &amp; vbNewLine &amp; _<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &quot;6 - только подпапки текущей папки;&quot; &amp; vbNewLine &amp; _<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &quot;7 - подпапки и файлы текущей папки.&quot; &amp; vbNewLine &amp; vbNewLine &amp; _<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &quot;Для обработки записи с любой&quot; &amp; vbNewLine &amp; _<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &quot;областью действия задайте значение 0&quot;, &quot;Настройка безопасности NTFS&quot;))<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; If IsNumeric(intTemp) Then<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; intTemp = CInt(intTemp)<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; If intTemp &lt; 0 Or intTemp &gt; 7 Then<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; intTemp = 4<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; MsgBox &quot;Область действия задана неверно.&quot; &amp; vbNewLine &amp; _<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &quot;Будет использована стандартная область:&quot; &amp; vbNewLine &amp; _<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &quot;ТЕКУЩАЯ ПАПКА, ЕЁ ПОДПАПКИ И ФАЙЛЫ.&quot;, _<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; vbExclamation, &quot;Настройка безопасности NTFS&quot;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; End If<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Else<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; intTemp = 4<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; MsgBox &quot;Область действия не задана или задана неверно.&quot; &amp; vbNewLine &amp; _<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &quot;Будет использована стандартная область:&quot; &amp; vbNewLine &amp; _<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &quot;ТЕКУЩАЯ ПАПКА, ЕЁ ПОДПАПКИ И ФАЙЛЫ.&quot;, _<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; vbExclamation, &quot;Настройка безопасности NTFS&quot;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; End If<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; intACEScope = arrACEScopes(intTemp)<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; xResult = ModifyEx2_DACL(strDomain, strComputer, strAccount, strPath, intACEType, intACEScope, lngACEMask)<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Else<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; xResult = &quot;Маска доступа задана неверно.&quot;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; End If<br />&nbsp; &nbsp; &nbsp; &nbsp; Else<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; xResult = &quot;Тип доступа или маска доступа не заданы или заданы неверно.&quot;<br />&nbsp; &nbsp; &nbsp; &nbsp; End If<br />&nbsp; &nbsp; &nbsp; &nbsp; Wscript.Echo xResult<br />&nbsp; &nbsp; Else<br />&nbsp; &nbsp; &nbsp; &nbsp; WScript.Echo &quot;Каталог не выбран.&quot;<br />&nbsp; &nbsp; End If<br />&nbsp; &nbsp; Set objShell = Nothing<br />&nbsp; &nbsp; Set objFolder = Nothing<br />Else<br />&nbsp; &nbsp; WScript.Echo &quot;Учётная запись не указана.&quot;<br />End If<br />WScript.Quit 0</p><p>&#039;======</p><p>Function ModifyEx2_DACL(strDom, strWS, strSAN, strDir, intType, intScope, lngMask)<br />Dim objWMI, objSecSettings, objSD, blnHasInherited, blnHasACE, i<br />Dim xRes, arrACE, objCollection, objItem, strSID<br />Dim objSID, objTrustee, objACE<br />Const SE_DACL_PROTECTED = 4096 &#039;Флаг-признак отключенного режима наследования управляемым каталогом безопасности NTFS от &quot;родителя&quot;<br />Const INHERITED_ACE = 16 &#039;Флаг-признак того, что текущая запись DACL унаследована от &quot;родителя&quot;</p><p>On Error Resume Next<br />xRes = 0<br />Set objWMI = GetObject(&quot;winmgmts:{impersonationLevel=impersonate}!\\&quot; &amp; strWS &amp; &quot;\root\cimv2&quot;)<br />If Err.Number = 0 Then<br />&nbsp; &nbsp; Set objSecSettings = objWMI.Get(&quot;Win32_LogicalFileSecuritySetting.Path=&#039;&quot; &amp; strDir &amp; &quot;&#039;&quot;)<br />&nbsp; &nbsp; If Err.Number = 0 Then<br />&nbsp; &nbsp; &nbsp; &nbsp; If objSecSettings.GetSecurityDescriptor(objSD) = 0 Then<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; If Not IsNull(objSD.DACL) Then<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &#039;--- Поиск заданной &quot;учётки&quot; на локальном компьютере или в Active Directory<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; If Len(strDom) &gt; 0 Then<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Set objCollection = objWMI.ExecQuery(&quot;SELECT SID FROM Win32_Account WHERE Domain=&#039;&quot; &amp; strDom &amp; &quot;&#039; AND Name=&#039;&quot; &amp; strSAN &amp; &quot;&#039;&quot;)<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Else<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Set objCollection = objWMI.ExecQuery(&quot;SELECT SID FROM Win32_Account WHERE Name=&#039;&quot; &amp; strSAN &amp; &quot;&#039;&quot;)<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; End If<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &#039;------<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; If objCollection.Count &gt; 0 Then<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; If Not CBool(objSD.ControlFlags And SE_DACL_PROTECTED) Then blnHasInherited = True<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; If blnHasInherited Then<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; arrACE = Array()<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &#039;--- Выборка из исходного DACL записей, не унаследованных от &quot;родителя&quot;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; i = -1<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; For Each objItem In objSD.DACL<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; If Not CBool(objItem.AceFlags And INHERITED_ACE) Then<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; i = i + 1<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ReDim Preserve arrACE(i)<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Set arrACE(i) = objItem<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; End If<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Next<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Set objItem = Nothing<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &#039;------<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &#039;--- Отключение наследования настроек безопасности от &quot;родителя&quot;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; objSD.ControlFlags = objSD.ControlFlags + SE_DACL_PROTECTED<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; xRes = objSecSettings.SetSecurityDescriptor(objSD)<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &#039;------<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Else<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; arrACE = objSD.DACL<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; End If<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; If xRes = 0 Then<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &#039;--- Определение SID &quot;учётки&quot;, назначенной для обработки<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; For Each objItem In objCollection<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; strSID = UCase(objItem.SID)<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Next<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Set objItem = Nothing<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &#039;------<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; If lngMask &gt; 0 Then<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &#039;--- Подготовка к добавлению в DACL новой записи<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Set objSID = objWMI.Get(&quot;Win32_SID.SID=&#039;&quot; &amp; strSID &amp; &quot;&#039;&quot;)<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Set objTrustee = objWMI.Get(&quot;Win32_Trustee&quot;).Spawninstance_()<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; objTrustee.Domain = strDom<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; objTrustee.Name = strSAN<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; objTrustee.SID = objSID.BinaryRepresentation<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; objTrustee.SidLength = objSID.SidLength<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; objTrustee.SIDString = strSID<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Set objSID = Nothing<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Set objACE = objWMI.Get(&quot;Win32_Ace&quot;).Spawninstance_()<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; objACE.AceType = intType<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; objACE.AceFlags = intScope<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; objACE.AccessMask = lngMask<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; objACE.Trustee = objTrustee<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Set objTrustee = Nothing<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; i = UBound(arrACE) + 1<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ReDim Preserve arrACE(i)<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Set arrACE(i) = objACE<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; objSD.DACL = arrACE<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &#039;------<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Else<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &#039;--- Подготовка к удалению из DACL указанной записи<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; For Each objACE In arrACE<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; blnHasACE = False<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &#039;--- Поиск указанной записи по SID, области действия и типу<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; If UCase(objACE.Trustee.SIDString) = strSID Then<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; If intScope &gt;= 0 Then<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; If objACE.AceFlags = intScope Then<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; If intType &lt; 0 Or objACE.AceType = intType Then<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; blnHasACE = True &#039;запись заданного типа с искомыми SID и областью действия найдена<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; End If<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; End If<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Else<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; blnHasACE = True &#039;запись с искомым SID найдена (область действия - любая)<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; End If<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; If blnHasACE Then<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; objACE.AccessMask = 0<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; End If<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; End If<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &#039;------<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Next<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &#039;------<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; End If<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; objSD.DACL = arrACE &#039;Собственно изменение DACL<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Set objACE = Nothing<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Erase arrACE<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; If blnHasInherited Then<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &#039;--- Включение наследования настроек безопасности от &quot;родителя&quot;,<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &#039;если первоначально оно было включено<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; objSD.ControlFlags = objSD.ControlFlags - SE_DACL_PROTECTED<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &#039;------<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; End If<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &#039;--- Итоговое сохраненение изменений, внесённых в дескриптор безопасности<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; xRes = objSecSettings.SetSecurityDescriptor(objSD)<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Select Case xRes<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Case 0: xRes = &quot;Успешное завершение.&quot;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Case 2: xRes = &quot;Не удалось сохранить изменения DACL.&quot; &amp; vbNewLine &amp; &quot;Доступ запрещён.&quot;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Case 5, 9: xRes = &quot;Не удалось сохранить изменения DACL.&quot; &amp; vbNewLine &amp; &quot;Для выполнения операции недостаточно полномочий.&quot;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Case 21: xRes = &quot;Не удалось сохранить изменения DACL.&quot; &amp; vbNewLine &amp; &quot;Заданы недопустимые значения параметров.&quot;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Case Else: xRes = &quot;Не удалось сохранить изменения DACL.&quot; &amp; vbNewLine &amp; &quot;Неизвестная ошибка.&quot;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; End Select<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &#039;------<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Else<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; xRes = &quot;Не удалось отключить наследование безопасности для папки &quot; &amp; UCase(strDir)<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; End If<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Else<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; xRes = &quot;Не найдена учётная запись объекта &quot; &amp; UCase(strDom &amp; &quot;\&quot; &amp; strSAN)<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; End If<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Set objCollection = Nothing<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Else<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; xRes = &quot;Список управления доступом (ACL) к заданному объекту пуст.&quot;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; End If<br />&nbsp; &nbsp; &nbsp; &nbsp; Else<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; xRes = &quot;Не удалось прочитать дескриптор безопасности объекта.&quot;<br />&nbsp; &nbsp; &nbsp; &nbsp; End If<br />&nbsp; &nbsp; &nbsp; &nbsp; Set objSD = Nothing<br />&nbsp; &nbsp; &nbsp; &nbsp; Set objSecSettings = Nothing<br />&nbsp; &nbsp; Else<br />&nbsp; &nbsp; &nbsp; &nbsp; xRes = &quot;Ошибка &quot; &amp; CStr(Err.Number) &amp; vbNewLine &amp; Err.Description<br />&nbsp; &nbsp; &nbsp; &nbsp; Err.Clear<br />&nbsp; &nbsp; End If<br />Else<br />&nbsp; &nbsp; xRes = &quot;Ошибка &quot; &amp; CStr(Err.Number) &amp; vbNewLine &amp; Err.Description<br />&nbsp; &nbsp; Err.Clear<br />End If<br />Set objWMI = Nothing<br />On Error GoTo 0<br />ModifyEx2_DACL = xRes<br />End Function[/code]<br /><strong>Сценарий 5.<br />Очистка DACL указанного дерева папок от записей с не олицетворёнными SID.</strong></p><p>Сценарий способен работать и в графическом, и в консольном режимах.<br />Подробное описание функциональности сценария и особенностей его работы - во встроенной справке (см. функцию <span style="color: blue">View_Help()</span>).<br />[code]Option Explicit</p><p>Dim objFS, objShell, objFolder, objFile, objWShell, objWMI<br />Dim strTranslator, strLogFile, strComputer, strTargetPath<br />Dim objDict, objRegExp, arrTemp, intNumArgs, strKey, strTemp, i<br />Dim blnIsConsole, blnRecursive, blnCreateLog, blnSilent, blnAvailable, blnHasError</p><p>strComputer = &quot;.&quot;<br />blnCreateLog = True: blnSilent = True: blnAvailable = True<br />Set objFS = CreateObject(&quot;Scripting.FileSystemObject&quot;)<br />strTranslator = objFS.GetBaseName(WScript.FullName)<br />If StrComp(strTranslator, &quot;cscript&quot;, vbTextCompare) = 0 Then blnIsConsole = True<br />If blnIsConsole Then<br />&nbsp; &nbsp; arrTemp = Array(&quot;tc&quot;, &quot;tlp&quot;, &quot;r&quot;, &quot;nl&quot;, &quot;s&quot;)<br />&nbsp; &nbsp; Set objDict = CreateObject(&quot;Scripting.Dictionary&quot;)<br />&nbsp; &nbsp; objDict.CompareMode = 1<br />&nbsp; &nbsp; For i = 0 To UBound(arrTemp)<br />&nbsp; &nbsp; &nbsp; &nbsp; objDict.Add arrTemp(i), vbNullString<br />&nbsp; &nbsp; Next<br />&nbsp; &nbsp; &#039;--- Проверка корректности набора заданных ключей, определение значений ключей<br />&nbsp; &nbsp; Set objRegExp = CreateObject(&quot;VBScript.RegExp&quot;)<br />&nbsp; &nbsp; objRegExp.Global = True<br />&nbsp; &nbsp; objRegExp.IgnoreCase = True<br />&nbsp; &nbsp; objRegExp.Pattern = &quot;^[-/]&quot;<br />&nbsp; &nbsp; intNumArgs = WScript.Arguments.Count<br />&nbsp; &nbsp; Select Case intNumArgs<br />&nbsp; &nbsp; &nbsp; &nbsp; Case 0: Call View_Help: WScript.Quit 0<br />&nbsp; &nbsp; &nbsp; &nbsp; Case 1<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; strTemp = objRegExp.Replace(WScript.Arguments.Item(0), &quot;&quot;)<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; If strTemp = &quot;?&quot; Then<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Call View_Help: WScript.Quit 0<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Else<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; If Len(strTemp) &gt; 1 Then<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; If LCase(Left(strTemp, 4)) &lt;&gt; &quot;tlp:&quot; Then<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Call Err_Message(1, strTemp)<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; WScript.Quit 0<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Else<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; If Len(strTemp) &gt; 4 Then<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </p>]]></content>
			<author>
				<name><![CDATA[Dmitrii]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=13351</uri>
			</author>
			<updated>2010-11-09T14:22:46Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=41393#p41393</id>
		</entry>
</feed>
