<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title><![CDATA[Серый форум &mdash; VBS: Прочитать DACL разрешения у сетевой папки]]></title>
		<link>https://forum.script-coding.com/viewtopic.php?id=5420</link>
		<atom:link href="https://forum.script-coding.com/extern.php?action=feed&amp;tid=5420&amp;type=rss" rel="self" type="application/rss+xml" />
		<description><![CDATA[Недавние сообщения в теме «VBS: Прочитать DACL разрешения у сетевой папки».]]></description>
		<lastBuildDate>Fri, 28 Jan 2011 14:32:27 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[Re: VBS: Прочитать DACL разрешения у сетевой папки]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=44489#p44489</link>
			<description><![CDATA[<p>Вот заготовка, которую можете &quot;доводить до ума&quot;.<br />Алгоритм работы этого сценария не вполне соответствует тому, что я предлагал в предыдущем сообщении.<br />Его достоинство (по сравнению с предыдущим алгоритмом) - отсутствие необходимости подключать сетевую папку как диск.<br />Недостаток - требуются полномочия локального администратора на том файловом сервере, где находится папка.<br /></p><div class="codebox"><pre><code>Dim objWMI, objCollection, objItem
Dim strSharePath, strShareServer, strShareName, strShareTarget
Dim objSecSettings, objSD, objACE, arrACE
Dim objDict, objUser, arrTemp, strList, strTemp, xRes
Const ACCESS_ALLOWED_ACE_TYPE = 0
Const ACCESS_DENIED_ACE_TYPE = 1
Const SE_DACL_PROTECTED = 4096
Const CREATE_FILE_WRITE_DATA = &amp;H2
Const GENERIC_WRITE = &amp;H40000000

strSharePath = &quot;\\fileserver\Имя_ресурса&quot;
arrTemp = Split(Replace(strSharePath, &quot;\\&quot;, &quot;&quot;), &quot;\&quot;, -1, vbTextCompare)
strShareServer = arrTemp(0)
strShareName = arrTemp(1)
Erase arrTemp
On Error Resume Next
Set objWMI = GetObject(&quot;winmgmts:{impersonationLevel=impersonate}!\\&quot; &amp; strShareServer &amp; &quot;\root\CIMV2&quot;)
If Err.Number = 0 Then
    Set objCollection = objWMI.ExecQuery(&quot;SELECT Path FROM Win32_Share WHERE Name=&#039;&quot; &amp; strShareName &amp; &quot;&#039;&quot;)
    If objCollection.Count &gt; 0 Then
        For Each objItem In objCollection
            &#039;Wscript.Echo &quot;Ресурс &quot; &amp; UCase(strSharePath) &amp; &quot; -&gt; &quot; &amp; objItem.Path
            strShareTarget = objItem.Path
        Next
        Set objItem = Nothing
        Set objSecSettings = objWMI.Get(&quot;Win32_LogicalFileSecuritySetting.Path=&#039;&quot; &amp; strShareTarget &amp; &quot;&#039;&quot;)
        If Err.Number = 0 Then
            If objSecSettings.GetSecurityDescriptor(objSD) = 0 Then
                If Not IsNull(objSD.DACL) Then
                    Set objDict = CreateObject(&quot;Scripting.Dictionary&quot;)
                    objDict.CompareMode = 1
                    For Each objACE In objSD.DACL
                        strTemp = objACE.Trustee.Domain &amp; &quot;/&quot; &amp; objACE.Trustee.Name
                        If Not objDict.Exists(strTemp) Then
                            If objACE.AceType = ACCESS_ALLOWED_ACE_TYPE Then
                                If CBool(objACE.AccessMask And CREATE_FILE_WRITE_DATA Or _
                                    objACE.AccessMask And GENERIC_WRITE) Then
                                    objDict.Add strTemp, True
                                Else
                                    objDict.Add strTemp, False
                                End If
                            End If
                        End If
                    Next
                    For Each strTemp In objDict.Keys
                        Set objUser = GetObject(&quot;WinNT://&quot; &amp; strTemp &amp; &quot;,user&quot;)
                        If Err.Number = 0 Then
                            If objDict.Item(strTemp) Then
                                strList = strList &amp; strTemp &amp; &quot; -&gt; пишет&quot; &amp; vbNewLine
                                &#039;Настроить членство пользователя в группе AD
                            Else
                                strList = strList &amp; strTemp &amp; &quot; -&gt; читает&quot; &amp; vbNewLine
                                &#039;Настроить членство пользователя в группе AD
                            End If
                        Else
                            Err.Clear
                            objDict.Remove (strTemp)
                        End If
                    Next
                    Set objUser = Nothing
                    WScript.Echo strList
                    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
                        arrACE = objSD.DACL
                        For Each objACE In arrACE
                            strTemp = objACE.Trustee.Domain &amp; &quot;/&quot; &amp; objACE.Trustee.Name
                            If objDict.Exists(strTemp) Then objACE.AccessMask = 0
                            &#039;Убрать (или изменить) проверку условия в вышележащем операторе
                        Next
                        Set objACE = Nothing
                        &#039;Сформировать новые ACE для групп и добавить их в DACL
                        xRes = objSecSettings.SetSecurityDescriptor(objSD)
                        Select Case xRes
                            Case 0: xRes = &quot;Успешное завершение.&quot;
                            Case 2: xRes = &quot;Доступ запрещён.&quot;
                            Case 5, 9: xRes = &quot;Для выполнения операции недостаточно полномочий.&quot;
                            Case 21: xRes = &quot;Заданы недопустимые значения параметров.&quot;
                            Case Else: xRes = &quot;Неизвестная ошибка с кодом: &quot; &amp; xRes
                        End Select
                    Else
                        xRes = &quot;Не удалось отключить наследование безопасности для каталога &quot; &amp; UCase(strShareTarget)
                    End If
                    Set objDict = Nothing
                    WScript.Echo xRes
                Else
                    WScript.Echo &quot;Список управления доступом к каталогу &quot; &amp; UCase(strShareTarget) &amp; &quot; пуст.&quot;
                End If
            Else
                WScript.Echo &quot;Не удалось прочитать дескриптор безопасности каталога &quot; &amp; UCase(strShareTarget)
            End If
            Set objSD = Nothing
        Else
            WScript.Echo &quot;Ошибка &quot; &amp; CStr(Err.Number) &amp; vbNewLine &amp; Err.Description
            Err.Clear
        End If
        Set objSecSettings = Nothing
    Else
        WScript.Echo &quot;Не найден ресурс &quot; &amp; UCase(strSharePath)
    End If
    Set objCollection = Nothing
Else
    WScript.Echo &quot;Ошибка &quot; &amp; CStr(Err.Number) &amp; vbNewLine &amp; Err.Description
    Err.Clear
End If
Set objWMI = Nothing
WScript.Quit 0</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (Dmitrii)]]></author>
			<pubDate>Fri, 28 Jan 2011 14:32:27 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=44489#p44489</guid>
		</item>
		<item>
			<title><![CDATA[Re: VBS: Прочитать DACL разрешения у сетевой папки]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=44451#p44451</link>
			<description><![CDATA[<div class="quotebox"><cite>Rialto пишет:</cite><blockquote><p>... не могу получить DACL для сетевой папки вида \\fs01\board</p></blockquote></div><p>Из моей практики следует, что при использовании UNC-путей в WMI-запросах, действительно, возникают сложности.<br />Поэтому я предпочитаю добавлять в сценарии (если возможно, конечно) процедуру подключения удалённого ресурса в качестве сетевого диска (с последующим отключением, разумеется).</p><div class="quotebox"><cite>Rialto пишет:</cite><blockquote><p>... не могу придумать алгоритм...</p></blockquote></div><p>В самом общем виде он может быть таков:<br />- проверка наличия папки общего доступа и её временное &quot;мапирование&quot;;<br />- создание пары объектов класса <strong><span style="color: blue">Dictionary</span></strong> (один - для списка &quot;читающих&quot; пользователей, второй - &quot;пишущих&quot;);<br />- просмотр всех ACE папки с внесением данных о нужных записях в один из словарей;<br />- просмотр каждого из сформированных словарей с добавлением данных о пользователях в соответствующую группу;<br />- вторичный просмотр всех ACE папки с назначением всем исключаемым записям нулевой маски доступа и добавлением записей для групп с соответствующими им масками.</p><p>Примечание: нулевые маски доступа записям можно назначить не на последнем, а на третьем шаге.</p>]]></description>
			<author><![CDATA[null@example.com (Dmitrii)]]></author>
			<pubDate>Thu, 27 Jan 2011 14:25:45 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=44451#p44451</guid>
		</item>
		<item>
			<title><![CDATA[Re: VBS: Прочитать DACL разрешения у сетевой папки]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=44418#p44418</link>
			<description><![CDATA[<p>Ну для начала я не могу придумать алгоритм, поэтому и прошу помощи.<br />А по ссылки не могу получить DACL для сетевой папки вида \\fs01\board</p>]]></description>
			<author><![CDATA[null@example.com (Rialto)]]></author>
			<pubDate>Wed, 26 Jan 2011 12:17:46 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=44418#p44418</guid>
		</item>
		<item>
			<title><![CDATA[Re: VBS: Прочитать DACL разрешения у сетевой папки]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=44415#p44415</link>
			<description><![CDATA[<div class="quotebox"><cite>Rialto пишет:</cite><blockquote><p>... Вот эту тему <a href="http://forum.script-coding.com/viewtopic.php?id=5142">http://forum.script-coding.com/viewtopic.php?id=5142</a> видел, но не смог применить для моего случая.</p></blockquote></div><p>Что именно не получается?</p>]]></description>
			<author><![CDATA[null@example.com (Dmitrii)]]></author>
			<pubDate>Wed, 26 Jan 2011 11:59:43 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=44415#p44415</guid>
		</item>
		<item>
			<title><![CDATA[VBS: Прочитать DACL разрешения у сетевой папки]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=44414#p44414</link>
			<description><![CDATA[<p>Добрый день, подскажите пожалуйста.<br />Задача такая:<br />Есть файловый сервер с разшаренными сетевыми папками, на каждую папку выставлены NTFS ограничения для доменных пользователей (или изменения или только чтение)<br />Есть группы в AD названы так же как и папки но с префиксом -R (для чтения) или -W (для записи)<br />Например если есть папка \\fs01\board, то в AD есть две группы board-R и board-W (группы уже существуют)</p><p>Необходимо прочитать NTFS права (DACL) у каждой папки и внести пользователей в соответствующую группу в AD, а так же удалить все NTFS права на папку и добавить группы соответствующие названию папки. <br />Например если пользователь DOMAIN\I.Ivanov имел доступ на запись в папку board, то он должен стать членом группы board-W в AD, а если пользователь DOMAIN\P.Petrov имел доступ на чтение в папку board, то он должен стать членом группы board-R в AD, так же необходимо удалить все NTFS права на папку board и добавить в NTFS права группу DOMAIN\board-R с правами &quot;чтение&quot; и группу DOMAIN\board-W с правами &quot;запись&quot;</p><p>Папок порядка 150 штук, хочется этот процесс автоматизировать</p><p>Подскажите алгоритм и если возможно, помогите с кодом. Вот эту тему <a href="http://forum.script-coding.com/viewtopic.php?id=5142">http://forum.script-coding.com/viewtopic.php?id=5142</a> видел, но не смог применить для моего случая.</p>]]></description>
			<author><![CDATA[null@example.com (Rialto)]]></author>
			<pubDate>Wed, 26 Jan 2011 11:56:21 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=44414#p44414</guid>
		</item>
	</channel>
</rss>
