<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title type="html"><![CDATA[Серый форум &mdash; VBS: Разрешения на папку во вкладке безопасность]]></title>
	<link rel="self" href="https://forum.script-coding.com/extern.php?action=feed&amp;tid=4985&amp;type=atom" />
	<updated>2011-03-05T10:34:06Z</updated>
	<generator>PunBB</generator>
	<id>https://forum.script-coding.com/viewtopic.php?id=4985</id>
		<entry>
			<title type="html"><![CDATA[Re: VBS: Разрешения на папку во вкладке безопасность]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=45829#p45829" />
			<content type="html"><![CDATA[<div class="quotebox"><cite>abasov пишет:</cite><blockquote><p>... предварительно сформировать себе шаблон с помощью svcadmin.exe</p></blockquote></div><p>Можно, конечно, но я подразумевал использование только встроенных инструментов &quot;Окошек&quot;.</p>]]></content>
			<author>
				<name><![CDATA[Dmitrii]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=13351</uri>
			</author>
			<updated>2011-03-05T10:34:06Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=45829#p45829</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: VBS: Разрешения на папку во вкладке безопасность]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=45828#p45828" />
			<content type="html"><![CDATA[<div class="quotebox"><cite>Dmitrii пишет:</cite><blockquote><p>передать утилите SC.EXE</p></blockquote></div><p>Жаль, что нельзя использовать объект в XP, опять ждать обновления своего парка машин. Из своих, рабочих GUI&#039;ёвых средств рекомендую svcadmin.exe (c исходником) из <a href="http://www.rsdn.ru/?article/?baseserv/svcadmin-1.xml">статьи</a> на rsdn. Для анализа очень полезно.</p><p>По мере накопления опыта в дальнейшем выкладывайте для семерки код пожалуйста.</p><br /><div class="quotebox"><cite>Dmitrii пишет:</cite><blockquote><p>преобразовать его в формат SDDL</p></blockquote></div><p>Можно сразу sc.exe sdshow, предварительно сформировать себе шаблон с помощью svcadmin.exe</p>]]></content>
			<author>
				<name><![CDATA[abasov]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=5104</uri>
			</author>
			<updated>2011-03-05T10:02:26Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=45828#p45828</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: VBS: Разрешения на папку во вкладке безопасность]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=45822#p45822" />
			<content type="html"><![CDATA[<div class="quotebox"><cite>abasov пишет:</cite><blockquote><p>Значит в XP чтобы назначить права службе я должен редактировать права на ветку реестра, либо sc.exe?..</p></blockquote></div><p>В общем,- да.<br />Однако можно попробовать (если есть хотя бы одна станция под ОС версии не ниже Vista) &quot;обойти&quot; непосредственную работу с <strong>SDDL</strong>:<br />- сформировать дескриптор безопасности в формате класса <strong><span style="color: blue">Win32_SecurityDescriptor</span></strong>;<br />- с помощью метода <span style="color: green">Win32SDToSDDL</span> класса <strong><span style="color: green">Win32_SecurityDescriptorHelper</span></strong> преобразовать его в формат <strong>SDDL</strong>;<br />- передать утилите SC.EXE полученное значение в качестве параметра.</p>]]></content>
			<author>
				<name><![CDATA[Dmitrii]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=13351</uri>
			</author>
			<updated>2011-03-05T07:43:29Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=45822#p45822</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: VBS: Разрешения на папку во вкладке безопасность]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=45819#p45819" />
			<content type="html"><![CDATA[<div class="quotebox"><cite>Dmitrii пишет:</cite><blockquote><div class="quotebox"><cite>abasov пишет:</cite><blockquote><p>для <strong>служб </strong>такой же принцип назначения ACL&#039;ов..?</p></blockquote></div><p>Да. Вот только методы <span style="color: blue">GetSecurityDescriptor</span> и <span style="color: blue">SetSecurityDescriptor</span> у класса <strong><span style="color: blue">Win32_Service</span></strong> доступны лишь начиная с Win Vista.</p></blockquote></div><p>Значит в XP чтобы назначить права службе я должен редактировать права на ветку реестра, либо sc.exe?<br />пример:<br /></p><div class="codebox"><pre><code>sc.exe sdset &quot;service&quot; &quot;D:(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;DA)(A;;LCSWRPWPDTLOCRRC;;;SY)(A;;CCLCSWRPWPDTLOCRRC;;;LA)(A;;CCLCSWLOCRRC;;;IU)(A;;CCLCSWLOCRRC;;;SU)&quot;</code></pre></div><p>Установит: Domain Admins - Full, System - Read, Execute, Local Admin - Read, Execute</p><br /><p><a href="http://msdn.microsoft.com/en-us/library/aa379567(v=vs.85).aspx">Security Descriptor Definition Language (Windows)</a></p>]]></content>
			<author>
				<name><![CDATA[abasov]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=5104</uri>
			</author>
			<updated>2011-03-05T06:36:49Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=45819#p45819</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: VBS: Разрешения на папку во вкладке безопасность]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=45818#p45818" />
			<content type="html"><![CDATA[<div class="quotebox"><cite>abasov пишет:</cite><blockquote><p>для <strong>служб </strong>такой же принцип назначения ACL&#039;ов..?</p></blockquote></div><p>Да. Вот только методы <span style="color: blue">GetSecurityDescriptor</span> и <span style="color: blue">SetSecurityDescriptor</span> у класса <strong><span style="color: blue">Win32_Service</span></strong> доступны лишь начиная с Win Vista.</p>]]></content>
			<author>
				<name><![CDATA[Dmitrii]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=13351</uri>
			</author>
			<updated>2011-03-05T06:22:08Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=45818#p45818</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: VBS: Разрешения на папку во вкладке безопасность]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=45816#p45816" />
			<content type="html"><![CDATA[<p>для <strong>служб </strong>такой же принцип назначения ACL&#039;ов. Т.е. используя SecurityDescriptor в коллекции применяем AccessMask?</p>]]></content>
			<author>
				<name><![CDATA[abasov]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=5104</uri>
			</author>
			<updated>2011-03-05T04:58:26Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=45816#p45816</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: VBS: Разрешения на папку во вкладке безопасность]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=41396#p41396" />
			<content type="html"><![CDATA[<div class="quotebox"><cite>Dmitrii пишет:</cite><blockquote><p>... Предыдущие варианты сценариев поправлю и размещу в коллекции позже.</p></blockquote></div><p>Наконец-то &quot;дошли руки&quot;:<br />- поправил диагностику ошибок в сценариях 1 и 2;<br />- поместил в коллекцию: сценарий 3 (в теме коллекции - сценарий 1), его более развитый вариант (в теме коллекции - сценарий 2), универсализированный сценарий изменений DACL (в теме коллекции - сценарий 3).<br />Тема: <a href="http://forum.script-coding.com/viewtopic.php?pid=41393#p41393">VBS+WMI: безопасность NTFS для каталога, DACL (чтение, изменение)</a></p>]]></content>
			<author>
				<name><![CDATA[Dmitrii]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=13351</uri>
			</author>
			<updated>2010-11-09T14:44:25Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=41396#p41396</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: VBS: Разрешения на папку во вкладке безопасность]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=40306#p40306" />
			<content type="html"><![CDATA[<p><strong>2 Dmitrii</strong> большущее спасибо, вопросов больше не имею, для меня тема полностью разобрана.</p>]]></content>
			<author>
				<name><![CDATA[Евген]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=25253</uri>
			</author>
			<updated>2010-10-11T13:57:56Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=40306#p40306</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: VBS: Разрешения на папку во вкладке безопасность]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=40303#p40303" />
			<content type="html"><![CDATA[<div class="quotebox"><cite>Евген пишет:</cite><blockquote><p>... сделать ещё один вариант второго скрипта, который давал бы права только на чтение...</p></blockquote></div><p>Я думаю, Вы уже поняли, что и первый, и второй сценарии почти тождественны. Разница между ними лишь в том, какая маска доступа назначается указанной &quot;учётке&quot;.<br />Вы сами без труда получите желаемое, если в качестве значения свойства <strong><span style="color: blue">AccessMask</span></strong> зададите число <strong><span style="color: green">1179785</span></strong> (это и будет &quot;только чтение&quot;).</p><div class="quotebox"><cite>Евген пишет:</cite><blockquote><p>... хотелось бы скрипт который удалял бы имеющегося пользователя из прав на папку (не запрещал доступ - а не давал никаких прав).</p></blockquote></div><p>При отключенном наследовании всё очень просто: назначить маске доступа значение <strong><span style="color: green">0</span></strong>. В процессе упорядочения ACL система сама удалит такие записи.<br /><strong>Примечание: обратите внимание на то, что по сравнению с предыдущими вариантами (сценарии 1 и 2) несколько изменилась диагностика ошибок.</strong><br /></p><div class="codebox"><pre><code>Dim objWsNet, strDomain, strComputer, strAccount
Dim objShell, objFolder, strPath, xResult

strAccount = InputBox(&quot;Имя учётной записи:&quot;, &quot;Настройка безопасности NTFS&quot;)
If Len(strAccount) &gt; 0 Then
    If StrComp(strAccount, &quot;Система&quot;, vbTextCompare) = 0 Then strAccount = &quot;System&quot;
    Set objShell = CreateObject(&quot;Shell.Application&quot;)
    Set objFolder = objShell.BrowseForFolder(0, &quot;Выбор каталога&quot;, &amp;h10 + &amp;h200, &amp;h11)
    If Not objFolder Is Nothing Then
        strPath = objFolder.Self.Path
        Set objWsNet = CreateObject(&quot;WScript.Network&quot;)
        strComputer = objWsNet.ComputerName
        Set objWsNet = Nothing        
        If StrComp(strAccount, &quot;System&quot;, vbTextCompare) &lt;&gt; 0 And StrComp(strAccount, &quot;Все&quot;, vbTextCompare) &lt;&gt; 0 Then
            strDomain = strComputer
        Else
            strDomain = vbNullString
        End If
        xResult = Remove_ACE(strDomain, strComputer, strAccount, strPath)
        If IsNumeric(xResult) Then xResult = CStr(xResult)
        Select Case xResult
            Case &quot;-2&quot;: Wscript.Echo &quot;Не найдена учётная запись объекта &quot; &amp; UCase(strDomain &amp; &quot;\&quot; &amp; strAccount)
            Case &quot;-1&quot;: Wscript.Echo &quot;Не удалось отключить наследование безопасности у папки &quot; &amp; UCase(strPath)
            Case &quot;0&quot;: Wscript.Echo &quot;Успешное завершение.&quot;
            Case &quot;2&quot;: Wscript.Echo &quot;Доступ запрещён.&quot;
            Case &quot;8&quot;: Wscript.Echo &quot;Неизвестная ошибка.&quot;
            Case &quot;5&quot;, &quot;9&quot;: Wscript.Echo &quot;Для выполнения операции недостаточно полномочий.&quot;
            Case &quot;21&quot;: Wscript.Echo &quot;Заданы недопустимые значения параметров.&quot;
            Case Else: WScript.Echo xResult
        End Select
    Else
        WScript.Echo &quot;Каталог не выбран.&quot;
    End If
    Set objShell = Nothing
    Set objFolder = Nothing
Else
    WScript.Echo &quot;Учётная запись не указана.&quot;
End If
WScript.Quit 0

&#039;======

Function Remove_ACE(strDom, strComp, strSAN, strDir)
Dim objWMI, objSecSettings, objSD, objACE
Dim xRes, objCollection, objItem, strSID, i
Const SE_DACL_PROTECTED = 4096
Const INHERITED_ACE = 16

On Error Resume Next
xRes = 0
Set objWMI = GetObject(&quot;winmgmts:{impersonationLevel=impersonate}!\\&quot; &amp; strComp &amp; &quot;\root\cimv2&quot;)
If Err.Number = 0 Then
    Set objSecSettings = objWMI.Get(&quot;Win32_LogicalFileSecuritySetting.Path=&#039;&quot; &amp; strDir &amp; &quot;&#039;&quot;)
    If Err.Number = 0 Then
        If objSecSettings.GetSecurityDescriptor(objSD) = 0 Then
            If Not IsNull(objSD.DACL) Then
                If Not CBool(objSD.ControlFlags And SE_DACL_PROTECTED) Then
                    objSD.ControlFlags = objSD.ControlFlags + SE_DACL_PROTECTED
                    xRes = objSecSettings.SetSecurityDescriptor(objSD)
                End If
                If xRes = 0 Then
                    If Len(strDom) &gt; 0 Then
                        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;)
                    Else
                        Set objCollection = objWMI.ExecQuery(&quot;SELECT SID FROM Win32_Account WHERE Name=&#039;&quot; &amp; strSAN &amp; &quot;&#039;&quot;)
                    End If
                    If objCollection.Count &gt; 0 Then
                        For Each objItem In objCollection
                            strSID = UCase(objItem.SID)
                        Next
                        Set objItem = Nothing
                        For Each objACE In objSD.DACL
                            If UCase(objACE.Trustee.SIDString) = strSID Then
                                If Not CBool(objACE.AceFlags And INHERITED_ACE) Then
                                    objACE.AccessMask = 0
                                End If
                            End If
                        Next
                        xRes = objSecSettings.SetSecurityDescriptor(objSD)
                    Else
                        xRes = -2
                    End If
                    Set objCollection = Nothing
                Else
                    xRes = -1
                End If
            Else
                xRes = &quot;Список управления доступом (ACL) к заданному объекту пуст.&quot;
            End If
        Else
            xRes = &quot;Не удалось прочитать дескриптор безопасности объекта.&quot;
        End If
        Set objSD = Nothing
        Set objSecSettings = Nothing
    Else
        xRes = &quot;Ошибка &quot; &amp; CStr(Err.Number) &amp; vbNewLine &amp; Err.Description
        Err.Clear
    End If
Else
    xRes = &quot;Ошибка &quot; &amp; CStr(Err.Number) &amp; vbNewLine &amp; Err.Description
    Err.Clear
End If
Set objWMI = Nothing
On Error GoTo 0
Remove_ACE = xRes
End Function</code></pre></div><p>Предыдущие варианты сценариев поправлю и размещу в коллекции позже. Пока недосуг.</p>]]></content>
			<author>
				<name><![CDATA[Dmitrii]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=13351</uri>
			</author>
			<updated>2010-10-11T13:33:29Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=40303#p40303</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: VBS: Разрешения на папку во вкладке безопасность]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=40180#p40180" />
			<content type="html"><![CDATA[<p>Кстати, нашёл вразумительную статейку MS TechNet&#039;a по поводу использования&nbsp; <a href="http://download.microsoft.com/download/f/d/0/fd05def7-68a1-4f71-8546-25c359cc0842/ScriptingGuys05.exe">Win32_LogicalFileSecuritySetting</a> <br />Постараюсь сам тоже подтянуться по данной теме.<br />Ещё раз выражаю коллеге <strong>Dmitrii</strong> свою признательность, по поводу написанных скриптов, занесите пожалуйста скрипты в коллекцию, им место там.</p>]]></content>
			<author>
				<name><![CDATA[Евген]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=25253</uri>
			</author>
			<updated>2010-10-08T16:10:43Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=40180#p40180</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: VBS: Разрешения на папку во вкладке безопасность]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=40167#p40167" />
			<content type="html"><![CDATA[<div class="quotebox"><cite>Евген пишет:</cite><blockquote><p><strong>2 alexii</strong> - обращаюсь к Вам с просьбой занести данные скрипты в Коллекцию !!!</p></blockquote></div><p>Я обеими руками «за», но ведь коллега <strong>Dmitrii</strong> сам имеет возможность сделать это. Так что, просим его <img src="//forum.script-coding.com/img/smilies/wink.png" width="15" height="15" />.</p>]]></content>
			<author>
				<name><![CDATA[alexii]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=1844</uri>
			</author>
			<updated>2010-10-08T14:38:09Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=40167#p40167</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: VBS: Разрешения на папку во вкладке безопасность]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=40164#p40164" />
			<content type="html"><![CDATA[<div class="quotebox"><cite>smaharbA пишет:</cite><blockquote><p>не просче воспользоваться утилитой командной строки ?</p></blockquote></div><p>Интересует именно VBS+WMI вариант...</p>]]></content>
			<author>
				<name><![CDATA[Евген]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=25253</uri>
			</author>
			<updated>2010-10-08T14:04:15Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=40164#p40164</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: VBS: Разрешения на папку во вкладке безопасность]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=40162#p40162" />
			<content type="html"><![CDATA[<p>не просче воспользоваться утилитой командной строки ?</p>]]></content>
			<author>
				<name><![CDATA[smaharbA]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=2911</uri>
			</author>
			<updated>2010-10-08T13:55:52Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=40162#p40162</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: VBS: Разрешения на папку во вкладке безопасность]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=40160#p40160" />
			<content type="html"><![CDATA[<p><em><span class="bbu"><strong>Просто большущее человеческое спасибо !!!</strong></span></em> <img src="//forum.script-coding.com/img/smilies/smile.png" width="15" height="15" /></p><p><strong>2 Dmitrii</strong> я ещё не совсем чётко свою мысль выразил, можно сделать ещё один вариант второго скрипта, который давал бы права только на чтение<br />и ещё до полной клиники, хотелось бы скрипт который удалял бы имеющегося пользователя из прав на папку (не запрещал доступ - а не давал никаких прав).</p><p><strong>2 alexii</strong> - обращаюсь к Вам с просьбой занести данные скрипты в Коллекцию !!!</p>]]></content>
			<author>
				<name><![CDATA[Евген]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=25253</uri>
			</author>
			<updated>2010-10-08T13:45:37Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=40160#p40160</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: VBS: Разрешения на папку во вкладке безопасность]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=40155#p40155" />
			<content type="html"><![CDATA[<div class="quotebox"><cite>Евген пишет:</cite><blockquote><p>3 - добавлять дубликат с другой маской<br />4 - отключать наследование &quot;родителей&quot;</p></blockquote></div><p>При отключенном наследовании добавление дубликата невозможно, т.к. система (при выполнении процедуры упорядочивания ACL) обязательно объединит записи-дубликаты, выполнив соответствующее преобразование маски.</p><div class="quotebox"><cite>Евген пишет:</cite><blockquote><p>5 - Настройки безопасности наследуются дочерними объектами управляемой папки,распространять внесённые изменения &quot;вниз&quot;.</p></blockquote></div><p>При включенном наследовании все изменения распространятся &quot;вниз&quot; автоматически.</p><p>Предварительные примечания:<br />1. Поскольку сразу забыл спросить о том, в каком режиме должны работать сценарии, то выложу GUI-варианты (как более наглядные).<br />2. Сценарии предполагают возможность работы с некоторыми встроенными системными &quot;учётками&quot; (на всякий случай).<br />3. Сценарии предполагают возможность добавления указанной &quot;учётки&quot; в ACL, если на момент выполнения настройки безопасности NTFS её там нет.<br />4. Сценарии ориентированы на использование в русифицированной ОС.</p><p><strong>Сценарий 1 - назначение полного доступа:</strong><br /></p><div class="codebox"><pre><code>Dim objWsNet, strDomain, strComputer, strAccount
Dim objShell, objFolder, strPath, xResult

strAccount = InputBox(&quot;Имя учётной записи:&quot;, &quot;Настройка безопасности NTFS&quot;)
If Len(strAccount) &gt; 0 Then
    If StrComp(strAccount, &quot;Система&quot;, vbTextCompare) = 0 Then strAccount = &quot;System&quot;
    Set objShell = CreateObject(&quot;Shell.Application&quot;)
    Set objFolder = objShell.BrowseForFolder(0, &quot;Выбор каталога&quot;, &amp;h10 + &amp;h200, &amp;h11)
    If Not objFolder Is Nothing Then
        strPath = objFolder.Self.Path
        Set objWsNet = CreateObject(&quot;WScript.Network&quot;)
        strComputer = objWsNet.ComputerName
        Set objWsNet = Nothing        
        If StrComp(strAccount, &quot;System&quot;, vbTextCompare) &lt;&gt; 0 And StrComp(strAccount, &quot;Все&quot;, vbTextCompare) &lt;&gt; 0 Then
            strDomain = strComputer
        Else
            strDomain = vbNullString
        End If
        xResult = Set_FullAccess(strDomain, strComputer, strAccount, strPath)
        If IsNumeric(xResult) Then xResult = CStr(xResult)
        Select Case xResult
            Case &quot;-3&quot;: Wscript.Echo &quot;Не удалось настроить параметры доступа существующей записи &quot; &amp; UCase(strDomain &amp; &quot;\&quot; &amp; strAccount)
            Case &quot;-2&quot;: Wscript.Echo &quot;Не найдена учётная запись объекта &quot; &amp; UCase(strDomain &amp; &quot;\&quot; &amp; strAccount)
            Case &quot;-1&quot;: Wscript.Echo &quot;Не удалось отключить наследование безопасности у папки &quot; &amp; UCase(strPath)
            Case &quot;0&quot;: Wscript.Echo &quot;Успешное завершение.&quot;
            Case &quot;2&quot;: Wscript.Echo &quot;Доступ запрещён.&quot;
            Case &quot;8&quot;: Wscript.Echo &quot;Неизвестная ошибка.&quot;
            Case &quot;5&quot;, &quot;9&quot;: Wscript.Echo &quot;Для выполнения операции недостаточно полномочий.&quot;
            Case &quot;21&quot;: Wscript.Echo &quot;Заданы недопустимые значения параметров.&quot;
            Case Else: WScript.Echo xResult
        End Select
    Else
        WScript.Echo &quot;Каталог не выбран.&quot;
    End If
    Set objShell = Nothing
    Set objFolder = Nothing
Else
    WScript.Echo &quot;Учётная запись не указана.&quot;
End If
WScript.Quit 0

&#039;======

Function Set_FullAccess(strDom, strComp, strSAN, strDir)
Dim objWMI, objSecSettings, objSD, objACE
Dim xRes, arrACE, objCollection, objItem, strSID
Dim objSID, objTrustee, objNewACE
Dim blnHasACE, i
Const SE_DACL_PROTECTED = 4096
Const ACCESS_ALLOWED_ACE_TYPE = 0
Const FULL_ACCESS = 2032127
&#039;Const READ_WRITE_EXECUTE = 1180095
Const OBJECT_INHERIT_ACE = 1
Const CONTAINER_INHERIT_ACE = 2

On Error Resume Next
xRes = 0
Set objWMI = GetObject(&quot;winmgmts:{impersonationLevel=impersonate}!\\&quot; &amp; strComp &amp; &quot;\root\cimv2&quot;)
If Err.Number = 0 Then
    Set objSecSettings = objWMI.Get(&quot;Win32_LogicalFileSecuritySetting.Path=&#039;&quot; &amp; strDir &amp; &quot;&#039;&quot;)
    If Err.Number = 0 Then
        If objSecSettings.GetSecurityDescriptor(objSD) = 0 Then
            If Not IsNull(objSD.DACL) Then
                If Not CBool(objSD.ControlFlags And SE_DACL_PROTECTED) Then
                    objSD.ControlFlags = objSD.ControlFlags + SE_DACL_PROTECTED
                    xRes = objSecSettings.SetSecurityDescriptor(objSD)
                End If
                If xRes = 0 Then
                    If Len(strDom) &gt; 0 Then
                        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;)
                    Else
                        Set objCollection = objWMI.ExecQuery(&quot;SELECT SID FROM Win32_Account WHERE Name=&#039;&quot; &amp; strSAN &amp; &quot;&#039;&quot;)
                    End If
                    If objCollection.Count &gt; 0 Then
                        For Each objItem In objCollection
                            strSID = UCase(objItem.SID)
                        Next
                        Set objItem = Nothing
                        For Each objACE In objSD.DACL
                            If UCase(objACE.Trustee.SIDString) = strSID Then
                                blnHasACE = True
                                objACE.AceType = ACCESS_ALLOWED_ACE_TYPE
                                objACE.AccessMask = FULL_ACCESS
                            End If
                        Next
                        xRes = objSecSettings.SetSecurityDescriptor(objSD)
                        If xRes = 0 Then
                            If Not blnHasACE Then
                                arrACE = objSD.DACL
                                Set objSID = objWMI.Get(&quot;Win32_SID.SID=&#039;&quot; &amp; strSID &amp; &quot;&#039;&quot;)
                                Set objTrustee = objWMI.Get(&quot;Win32_Trustee&quot;).Spawninstance_()
                                objTrustee.Domain = strDom
                                objTrustee.Name = strSAN
                                objTrustee.SID = objSID.BinaryRepresentation
                                objTrustee.SidLength = objSID.SidLength
                                objTrustee.SIDString = strSID
                                Set objSID = Nothing
                                Set objNewACE = objWMI.Get(&quot;Win32_Ace&quot;).Spawninstance_()
                                objNewACE.AceType  = ACCESS_ALLOWED_ACE_TYPE
                                objNewACE.AceFlags = OBJECT_INHERIT_ACE + CONTAINER_INHERIT_ACE
                                objNewACE.AccessMask = FULL_ACCESS
                                objNewACE.Trustee = objTrustee
                                Set objTrustee = Nothing
                                i = UBound(arrACE) + 1
                                ReDim Preserve arrACE(i)
                                Set arrACE(i) = objNewACE
                                objSD.DACL = arrACE
                                Set objNewACE = Nothing
                                Erase arrACE
                                xRes = objSecSettings.SetSecurityDescriptor(objSD)
                            End If
                        Else
                            xRes = -3
                        End If
                    Else
                        xRes = -2
                    End If
                    Set objCollection = Nothing
                Else
                    xRes = -1
                End If
            Else
                xRes = &quot;Список управления доступом (ACL) к заданному объекту пуст.&quot;
            End If
        Else
            xRes = &quot;Не удалось прочитать дескриптор безопасности объекта.&quot;
        End If
        Set objSD = Nothing
        Set objSecSettings = Nothing
    Else
        xRes = &quot;Ошибка &quot; &amp; CStr(Err.Number) &amp; vbNewLine &amp; Err.Description
        Err.Clear
    End If
Else
    xRes = &quot;Ошибка &quot; &amp; CStr(Err.Number) &amp; vbNewLine &amp; Err.Description
    Err.Clear
End If
Set objWMI = Nothing
On Error GoTo 0
Set_FullAccess = xRes
End Function</code></pre></div><p><strong>Сценарий 2 - назначение доступа на чтение, запись, выполнение:</strong><br /></p><div class="codebox"><pre><code>Dim objWsNet, strDomain, strComputer, strAccount
Dim objShell, objFolder, strPath, xResult

strAccount = InputBox(&quot;Имя учётной записи:&quot;, &quot;Настройка безопасности NTFS&quot;)
If Len(strAccount) &gt; 0 Then
    If StrComp(strAccount, &quot;Система&quot;, vbTextCompare) = 0 Then strAccount = &quot;System&quot;
    Set objShell = CreateObject(&quot;Shell.Application&quot;)
    Set objFolder = objShell.BrowseForFolder(0, &quot;Выбор каталога&quot;, &amp;h10 + &amp;h200, &amp;h11)
    If Not objFolder Is Nothing Then
        strPath = objFolder.Self.Path
        Set objWsNet = CreateObject(&quot;WScript.Network&quot;)
        strComputer = objWsNet.ComputerName
        Set objWsNet = Nothing        
        If StrComp(strAccount, &quot;System&quot;, vbTextCompare) &lt;&gt; 0 And StrComp(strAccount, &quot;Все&quot;, vbTextCompare) &lt;&gt; 0 Then
            strDomain = strComputer
        Else
            strDomain = vbNullString
        End If
        xResult = Set_RWEAccess(strDomain, strComputer, strAccount, strPath)
        If IsNumeric(xResult) Then xResult = CStr(xResult)
        Select Case xResult
            Case &quot;-3&quot;: Wscript.Echo &quot;Не удалось настроить параметры доступа существующей записи &quot; &amp; UCase(strDomain &amp; &quot;\&quot; &amp; strAccount)
            Case &quot;-2&quot;: Wscript.Echo &quot;Не найдена учётная запись объекта &quot; &amp; UCase(strDomain &amp; &quot;\&quot; &amp; strAccount)
            Case &quot;-1&quot;: Wscript.Echo &quot;Не удалось отключить наследование безопасности у папки &quot; &amp; UCase(strPath)
            Case &quot;0&quot;: Wscript.Echo &quot;Успешное завершение.&quot;
            Case &quot;2&quot;: Wscript.Echo &quot;Доступ запрещён.&quot;
            Case &quot;8&quot;: Wscript.Echo &quot;Неизвестная ошибка.&quot;
            Case &quot;5&quot;, &quot;9&quot;: Wscript.Echo &quot;Для выполнения операции недостаточно полномочий.&quot;
            Case &quot;21&quot;: Wscript.Echo &quot;Заданы недопустимые значения параметров.&quot;
            Case Else: WScript.Echo xResult
        End Select
    Else
        WScript.Echo &quot;Каталог не выбран.&quot;
    End If
    Set objShell = Nothing
    Set objFolder = Nothing
Else
    WScript.Echo &quot;Учётная запись не указана.&quot;
End If
WScript.Quit 0

&#039;======

Function Set_RWEAccess(strDom, strComp, strSAN, strDir)
Dim objWMI, objSecSettings, objSD, objACE
Dim xRes, arrACE, objCollection, objItem, strSID
Dim objSID, objTrustee, objNewACE
Dim blnHasACE, i
Const SE_DACL_PROTECTED = 4096
Const ACCESS_ALLOWED_ACE_TYPE = 0
&#039;Const FULL_ACCESS = 2032127
Const READ_WRITE_EXECUTE = 1180095
Const OBJECT_INHERIT_ACE = 1
Const CONTAINER_INHERIT_ACE = 2
Const INHERITED_ACE = 16

On Error Resume Next
xRes = 0
Set objWMI = GetObject(&quot;winmgmts:{impersonationLevel=impersonate}!\\&quot; &amp; strComp &amp; &quot;\root\cimv2&quot;)
If Err.Number = 0 Then
    Set objSecSettings = objWMI.Get(&quot;Win32_LogicalFileSecuritySetting.Path=&#039;&quot; &amp; strDir &amp; &quot;&#039;&quot;)
    If Err.Number = 0 Then
        If objSecSettings.GetSecurityDescriptor(objSD) = 0 Then
            If Not IsNull(objSD.DACL) Then
                If Not CBool(objSD.ControlFlags And SE_DACL_PROTECTED) Then
                    objSD.ControlFlags = objSD.ControlFlags + SE_DACL_PROTECTED
                    xRes = objSecSettings.SetSecurityDescriptor(objSD)
                End If
                If xRes = 0 Then
                    If Len(strDom) &gt; 0 Then
                        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;)
                    Else
                        Set objCollection = objWMI.ExecQuery(&quot;SELECT SID FROM Win32_Account WHERE Name=&#039;&quot; &amp; strSAN &amp; &quot;&#039;&quot;)
                    End If
                    If objCollection.Count &gt; 0 Then
                        For Each objItem In objCollection
                            strSID = UCase(objItem.SID)
                        Next
                        Set objItem = Nothing
                        For Each objACE In objSD.DACL
                            If UCase(objACE.Trustee.SIDString) = strSID Then
                                blnHasACE = True
                                objACE.AceType = ACCESS_ALLOWED_ACE_TYPE
                                objACE.AccessMask = READ_WRITE_EXECUTE
                            End If
                        Next
                        xRes = objSecSettings.SetSecurityDescriptor(objSD)
                        If xRes = 0 Then
                            If Not blnHasACE Then
                                arrACE = objSD.DACL
                                Set objSID = objWMI.Get(&quot;Win32_SID.SID=&#039;&quot; &amp; strSID &amp; &quot;&#039;&quot;)
                                Set objTrustee = objWMI.Get(&quot;Win32_Trustee&quot;).Spawninstance_()
                                objTrustee.Domain = strDom
                                objTrustee.Name = strSAN
                                objTrustee.SID = objSID.BinaryRepresentation
                                objTrustee.SidLength = objSID.SidLength
                                objTrustee.SIDString = strSID
                                Set objSID = Nothing
                                Set objNewACE = objWMI.Get(&quot;Win32_Ace&quot;).Spawninstance_()
                                objNewACE.AceType  = ACCESS_ALLOWED_ACE_TYPE
                                objNewACE.AceFlags = OBJECT_INHERIT_ACE + CONTAINER_INHERIT_ACE
                                objNewACE.AccessMask = READ_WRITE_EXECUTE
                                objNewACE.Trustee = objTrustee
                                Set objTrustee = Nothing
                                i = UBound(arrACE) + 1
                                ReDim Preserve arrACE(i)
                                Set arrACE(i) = objNewACE
                                objSD.DACL = arrACE
                                Set objNewACE = Nothing
                                Erase arrACE
                                xRes = objSecSettings.SetSecurityDescriptor(objSD)
                            End If
                        Else
                            xRes = -3
                        End If
                    Else
                        xRes = -2
                    End If
                    Set objCollection = Nothing
                Else
                    xRes = -1
                End If
            Else
                xRes = &quot;Список управления доступом (ACL) к заданному объекту пуст.&quot;
            End If
        Else
            xRes = &quot;Не удалось прочитать дескриптор безопасности объекта.&quot;
        End If
        Set objSD = Nothing
        Set objSecSettings = Nothing
    Else
        xRes = &quot;Ошибка &quot; &amp; CStr(Err.Number) &amp; vbNewLine &amp; Err.Description
        Err.Clear
    End If
Else
    xRes = &quot;Ошибка &quot; &amp; CStr(Err.Number) &amp; vbNewLine &amp; Err.Description
    Err.Clear
End If
Set objWMI = Nothing
On Error GoTo 0
Set_RWEAccess = xRes
End Function</code></pre></div><p><strong>Сценарий 3 (бонус <img src="//forum.script-coding.com/img/smilies/smile.png" width="15" height="15" /> ) - получение обобщённого полного списка безопасности NTFS указанного каталога (упрощает тестировании предыдущих сценариев):</strong><br /></p><div class="codebox"><pre><code>Dim objWsNet, strComputer
Dim objShell, objFolder, strPath
Dim objWMI, objSecSettings, objSD, objACE
Dim strList, strTemp
Const ACCESS_ALLOWED_ACE_TYPE = &amp;H0
Const ACCESS_DENIED_ACE_TYPE  = &amp;H1
Const INHERITED_ACE = &amp;H10

Set objShell = CreateObject(&quot;Shell.Application&quot;)
Set objFolder = objShell.BrowseForFolder(0, &quot;Выбор каталога&quot;, &amp;h10 + &amp;h200, &amp;h11)
If Not objFolder Is Nothing Then
    strPath = objFolder.Self.Path
    Set objWsNet = CreateObject(&quot;WScript.Network&quot;)
    strComputer = objWsNet.ComputerName
    Set objWsNet = Nothing
    Set objWMI = GetObject(&quot;winmgmts:{impersonationLevel=impersonate}!\\&quot; &amp; strComputer &amp; &quot;\root\cimv2&quot;)
    Set objSecSettings = objWMI.Get(&quot;Win32_LogicalFileSecuritySetting.Path=&#039;&quot; &amp; strPath &amp; &quot;&#039;&quot;)
    If objSecSettings.GetSecurityDescriptor(objSD) = 0 Then
        If Not IsNull(objSD.DACL) Then
            strList = vbNullString
            For Each objACE In objSD.DACL
                If CBool(objACE.AceFlags And INHERITED_ACE) Then
                    strTemp = &quot; - унаследовано; &quot;
                Else
                    strTemp = &quot; - не унаследовано; &quot;
                End If
                If objACE.AceType = ACCESS_ALLOWED_ACE_TYPE Then
                    strTemp = strTemp &amp; &quot;Разрешено с маской&quot;
                Else
                    strTemp = strTemp &amp; &quot;Запрещено с маской&quot;
                End If
                strTemp = strTemp &amp; &quot; -&gt; &quot; &amp; CStr(objACE.AccessMask) &amp; &quot; (&amp;h&quot; &amp; Hex(objACE.AccessMask) &amp; &quot;)&quot;
                strList = strList &amp; objACE.Trustee.Domain &amp; &quot;\&quot; &amp; objACE.Trustee.Name &amp; strTemp &amp; vbNewLine
            Next
            Set objACE = Nothing
            WScript.Echo strList
        Else
            WScript.Echo &quot;Список управления доступом (ACL) к заданному объекту пуст.&quot;
        End If
    Else
        WScript.Echo &quot;Не удалось прочитать дескриптор безопасности объекта.&quot;
    End If
    Set objSD = Nothing
    Set objSecSettings = Nothing
    Set objWMI = Nothing
Else
    WScript.Echo &quot;Каталог не выбран.&quot;
End If
Set objFolder = Nothing
Set objShell = Nothing
WScript.Quit 0</code></pre></div>]]></content>
			<author>
				<name><![CDATA[Dmitrii]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=13351</uri>
			</author>
			<updated>2010-10-08T13:16:12Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=40155#p40155</id>
		</entry>
</feed>
