<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title><![CDATA[Серый форум &mdash; VBS: получение списка всех вложенных папок с разрешениями]]></title>
		<link>https://forum.script-coding.com/viewtopic.php?id=7710</link>
		<atom:link href="https://forum.script-coding.com/extern.php?action=feed&amp;tid=7710&amp;type=rss" rel="self" type="application/rss+xml" />
		<description><![CDATA[Недавние сообщения в теме «VBS: получение списка всех вложенных папок с разрешениями».]]></description>
		<lastBuildDate>Fri, 02 Nov 2012 11:38:39 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[Re: VBS: получение списка всех вложенных папок с разрешениями]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=65348#p65348</link>
			<description><![CDATA[<p>Заработало! <span class="postimg"><img src="http://i.smiles2k.net/aiwan_smiles/drinks.gif" alt="http://i.smiles2k.net/aiwan_smiles/drinks.gif" /></span></p>]]></description>
			<author><![CDATA[null@example.com (inock)]]></author>
			<pubDate>Fri, 02 Nov 2012 11:38:39 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=65348#p65348</guid>
		</item>
		<item>
			<title><![CDATA[Re: VBS: получение списка всех вложенных папок с разрешениями]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=65346#p65346</link>
			<description><![CDATA[<div class="quotebox"><cite>inock пишет:</cite><blockquote><p>по подкаталогам вообще не идет...</p></blockquote></div><p>Верно. Приношу извинения, совсем забыл о рекурсии.<br />Новый вариант кода функции:<br /></p><div class="codebox"><pre><code>Function Get_DACLInfo(strDir)
Dim objSecSettings, objSD, objFolder
Dim objEntry, strTemp, strRes, i, j, lngMask, lngTemp
Dim arrFlagValue, arrFlagName, arrGenericValue, arrGenericName
Dim arrSieveGE, arrSieveGW, arrSieveGR, arrTemp
Const SE_DACL_PROTECTED = 4096 &#039;Флаг-признак отключенного режима наследования каталогом безопасности NTFS от &quot;родителя&quot;
&#039;--- Значения универсальных масок
Const GENERIC_ALL = &amp;H10000000
Const GENERIC_EXECUTE = &amp;H20000000
Const GENERIC_WRITE = &amp;H40000000
Const GENERIC_READ = &amp;H80000000
&#039;------
Const ACCESS_ALLOWED_ACE_TYPE = 0 &#039;Флаг-признак записи типа &quot;РАЗРЕШЕНИЕ&quot;
Const ACCESS_DENIED_ACE_TYPE = 1  &#039;Флаг-признак записи типа &quot;ЗАПРЕТ&quot;
Const INHERITED_ACE = 16 &#039;Флаг-признак того, что текущая запись DACL унаследована от родительского каталога
Const FULL_ACCESS = 983551 &#039;Значение маски полного разрешения или запрета
Const FLAG_SYNCHRONIZE = 1048576 &#039;Значение флага синхронизации доступа к объекту файловой системы
                                 &#039;(в версиях ОС &quot;2000/XP&quot;, применим только для записей типа &quot;РАЗРЕШЕНИЕ&quot;)

arrFlagValue = Array(32, 1, 128, 8, 2, 4, 256, 16, 64, 65536, 131072, 262144, 524288)
arrFlagName = Array(&quot;Траверс папок / Выполнение файлов&quot;, _
                    &quot;Содержание папки / Чтение данных&quot;, _
                    &quot;Чтение атрибутов&quot;, _
                    &quot;Чтение дополнительных атрибутов&quot;, _
                    &quot;Создание файлов / Запись данных&quot;, _
                    &quot;Создание папок / Дозапись данных&quot;, _
                    &quot;Запись атрибутов&quot;, _
                    &quot;Запись дополнительных атрибутов&quot;, _
                    &quot;Удаление подпапок и файлов&quot;, _
                    &quot;Удаление&quot;, _
                    &quot;Чтение разрешений&quot;, _
                    &quot;Смена разрешений&quot;, _
                    &quot;Смена владельца&quot;)
                    
arrGenericValue = Array(&amp;H20000000, &amp;H40000000, &amp;H80000000)
arrGenericName = Array(&quot;Выполнение (универсальная маска)&quot;, &quot;Запись (универсальная маска)&quot;, &quot;Чтение (универсальная маска)&quot;)
&#039;--- Вспомогательные массивы, предназначенные для детализации универсальных масок
arrSieveGE = Array(-1, 0, -1, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0)
arrSieveGW = Array(0, 0, 0, 0, -1, -1, -1, -1, 0, 0, -1, 0, 0)
arrSieveGR = Array(0, -1, -1, -1, 0, 0, 0, 0, 0, 0, -1, 0, 0)
&#039;------

On Error Resume Next
Set objSecSettings = objWMI.Get(&quot;Win32_LogicalFileSecuritySetting.Path=&#039;&quot; &amp; strDir &amp; &quot;&#039;&quot;)
If objSecSettings.GetSecurityDescriptor(objSD) = 0 Then
    If Err.Number = 0 Then
        If CBool(objSD.ControlFlags And SE_DACL_PROTECTED) Then
            If Err.Number = 0 Then
                If IsNull(objSD.DACL) Then
                    If Err.Number = 0 Then
                        WScript.Echo strDir &amp; &quot; -&gt; DACL пуст&quot;
                        objFile.WriteLine strDir &amp; &quot; -&gt; DACL пуст&quot;
                    Else
                        WScript.Echo strDir &amp; &quot; -&gt; ошибка &quot; &amp; Err.Number &amp; &quot; чтения DACL&quot; &amp; vbNewLine &amp; Err.Description
                        objFile.WriteLine strDir &amp; &quot; -&gt; ошибка &quot; &amp; Err.Number &amp; &quot; чтения DACL&quot; &amp; vbNewLine &amp; Err.Description
                        Err.Clear
                    End If
                Else
                    &#039;--- Настройка правильного наименования одного из флагов маски доступа в зависимости от версии ОС
                    If intOSVersion &lt; 60 Then arrFlagName(0) = &quot;Обзор папок / Выполнение файлов&quot;
                    &#039;------
                    strRes = vbNullString
                    For Each objEntry In objSD.DACL
                        If StrComp(objEntry.Trustee.Domain, strDomain, vbtextCompare) = 0 Then
                            &#039;--- Определение режима наследования записи и области её действия
                            If CBool(objEntry.AceFlags And INHERITED_ACE) Then
                                strTemp = &quot; (унаследовано; &quot;
                                lngTemp = objEntry.AceFlags - INHERITED_ACE
                            Else
                                strTemp = &quot; (не унаследовано; &quot;
                                lngTemp = objEntry.AceFlags
                                Select Case lngTemp
                                    Case 0: strTemp = strTemp &amp; &quot;действует на: только текущий каталог)&quot;
                                    Case 1: strTemp = strTemp &amp; &quot;действует на: текущий каталог и его файлы)&quot;
                                    Case 2: strTemp = strTemp &amp; &quot;действует на: текущий каталог и его подкаталоги)&quot;
                                    Case 3: strTemp = strTemp &amp; &quot;действует на: текущий каталог, его подкаталоги и файлы)&quot;
                                    Case 9: strTemp = strTemp &amp; &quot;действует на: только файлы текущего каталога)&quot;
                                    Case 10: strTemp = strTemp &amp; &quot;действует на: только подкаталоги текущего каталога)&quot;
                                    Case 11: strTemp = strTemp &amp; &quot;действует на: подкаталоги и файлы текущего каталога)&quot;
                                    Case Else: strTemp = strTemp &amp; &quot;область действия не определена); &quot;
                                End Select
                                strTemp = strTemp &amp; vbNewLine &amp; &quot;---&quot; &amp; vbNewLine
                                &#039;------
                                &#039;--- Определение типа записи
                                If objEntry.AceType = ACCESS_ALLOWED_ACE_TYPE Then
                                    strTemp = strTemp &amp; &quot;РАЗРЕШЕНО:&quot; &amp; vbNewLine
                                ElseIf objEntry.AceType = ACCESS_DENIED_ACE_TYPE Then
                                    strTemp = strTemp &amp; &quot;ЗАПРЕЩЕНО:&quot; &amp; vbNewLine
                                End If
                                &#039;------
                                &#039;--- Определение значения маски &quot;Полный доступ&quot; в зависимости от версии ОС
                                If intOSVersion &lt; 52 Then
                                    lngTemp = FULL_ACCESS + Abs(objEntry.AceType - 1) * FLAG_SYNCHRONIZE
                                    &#039;Выражение FULL_ACCESS + Abs(objEntry.AceType - 1) * FLAG_SYNCHRONIZE
                                    &#039;учитывает разницу между значениями маски &quot;Полный доступ&quot; у записей разных типов
                                    &#039;в ОС версий &quot;2000/XP&quot;
                                Else
                                    lngTemp = FULL_ACCESS + FLAG_SYNCHRONIZE
                                End If
                                &#039;------
                                lngMask = objEntry.AccessMask
                                Select Case Abs(lngMask)
                                    Case lngTemp: strTemp = strTemp &amp; &quot;Полный доступ&quot; &amp; vbNewLine
                                    Case GENERIC_ALL: strTemp = strTemp &amp; &quot;Полный доступ (универсальная маска)&quot; &amp; vbNewLine
                                    Case Else
                                        &#039;--- Детальный анализ маски доступа текущей записи:
                                        &#039;обработка универсальных масок (биты №№ 29 - 31)
                                        If Abs(lngMask) &gt; lngTemp Then
                                            For i = 0 To UBound(arrGenericValue)
                                                If lngMask And arrGenericValue(i) Then
                                                    strTemp = strTemp &amp; arrGenericName(i) &amp; vbNewLine &amp; vbTab &amp; &quot;{&quot; &amp; vbNewLine
                                                    Select Case arrGenericValue(i)
                                                        Case GENERIC_EXECUTE: arrTemp = arrSieveGE
                                                        Case GENERIC_WRITE: arrTemp = arrSieveGW
                                                        Case GENERIC_READ: arrTemp = arrSieveGR
                                                    End Select
                                                    For j = 0 To UBound(arrTemp)
                                                        If arrTemp(j) Then strTemp = strTemp &amp; vbTab &amp; arrFlagName(j) &amp; vbNewLine
                                                    Next
                                                    strTemp = strTemp &amp; vbTab &amp; &quot;}&quot; &amp; vbNewLine
                                                End If
                                            Next
                                        End If
                                        &#039;обработка обычных масок (биты №№ 0 - 20)
                                        For i = 0 To UBound(arrFlagValue)
                                            If lngMask And arrFlagValue(i) Then
                                                strTemp = strTemp &amp; arrFlagName(i) &amp; vbNewLine
                                            End If
                                        Next
                                        &#039;------
                                End Select
                                strTemp = UCase(objEntry.Trustee.Domain &amp; &quot;\&quot; &amp; objEntry.Trustee.Name) &amp; strTemp &amp; &quot;===&quot; &amp; vbNewLine
                                strRes = strRes &amp; strTemp
                            End If
                        End If
                    Next
                    Set objEntry = Nothing
                    If Len(strRes) &gt; 0 Then
                        WScript.Echo strDir &amp; &quot; -&gt; объект обработан&quot;
                        objFile.WriteLine UCase(strDir) &amp; vbNewLine &amp; strRes
                    End If
                    For Each objFolder In objFS.GetFolder(strDir).SubFolders
                        If Err.Number = 0 Then
                            Call Get_DACLInfo(objFolder.Path)
                        Else
                            WScript.Echo objFolder.Path &amp; &quot; -&gt; ошибка &quot; &amp; Err.Number &amp; &quot; обращения к объекту&quot; &amp; vbNewLine &amp; Err.Description
                            objFile.WriteLine objFolder.Path &amp; &quot; -&gt; ошибка &quot; &amp; Err.Number &amp; &quot; обращения к объекту&quot; &amp; vbNewLine &amp; Err.Description
                            Err.Clear
                        End If
                    Next
                    Set objFolder = Nothing
                End If
            Else
                WScript.Echo objFolder.Path &amp; &quot; -&gt; ошибка &quot; &amp; Err.Number &amp; &quot; определения режима наследования&quot; &amp; vbNewLine &amp; Err.Description
                objFile.WriteLine objFolder.Path &amp; &quot; -&gt; ошибка &quot; &amp; Err.Number &amp; &quot; определения режима наследования&quot; &amp; vbNewLine &amp; Err.Description
                Err.Clear
            End If
        Else
            WScript.Echo strDir &amp; &quot; -&gt; объект пропущен&quot;
            For Each objFolder In objFS.GetFolder(strDir).SubFolders
                If Err.Number = 0 Then
                    Call Get_DACLInfo(objFolder.Path)
                Else
                    WScript.Echo objFolder.Path &amp; &quot; -&gt; ошибка &quot; &amp; Err.Number &amp; &quot; обращения к объекту&quot; &amp; vbNewLine &amp; Err.Description
                    objFile.WriteLine objFolder.Path &amp; &quot; -&gt; ошибка &quot; &amp; Err.Number &amp; &quot; обращения к объекту&quot; &amp; vbNewLine &amp; Err.Description
                    Err.Clear
                End If
            Next
            Set objFolder = Nothing
        End If
    Else
        WScript.Echo strDir &amp; &quot; -&gt; ошибка &quot; &amp; Err.Number &amp; &quot; чтения дескриптора безопасности&quot; &amp; vbNewLine &amp; Err.Description
        objFile.WriteLine strDir &amp; &quot; -&gt; ошибка &quot; &amp; Err.Number &amp; &quot; чтения дескриптора безопасности&quot; &amp; vbNewLine &amp; Err.Description
        Err.Clear
    End If
Else
    WScript.Echo strDir &amp; &quot; -&gt; не удалось прочитать дескриптор безопасности&quot;
    objFile.WriteLine strDir &amp; &quot; -&gt; не удалось прочитать дескриптор безопасности&quot;
End If
Set objSD = Nothing
Set objSecSettings = Nothing
On Error GoTo 0
End Function</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (Dmitrii)]]></author>
			<pubDate>Fri, 02 Nov 2012 10:49:56 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=65346#p65346</guid>
		</item>
		<item>
			<title><![CDATA[Re: VBS: получение списка всех вложенных папок с разрешениями]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=65342#p65342</link>
			<description><![CDATA[<p><img src="//forum.script-coding.com/img/smilies/smile.png" width="15" height="15" /> Так оно по подкаталогам вообще не идет...</p><div class="codebox"><pre><code>D:\Public\1&gt;find &quot;D:\Public&quot; NTFS-ACCESS2.vbs

---------- NTFS-ACCESS2.VBS
strPath = &quot;D:\Public&quot; &#039;чфхё№ єърцшЄх Ёхры№э&amp;#8730;щ яєЄ№&#039;

D:\Public\1&gt;cscript NTFS-ACCESS2.vbs
Сервер сценариев Windows (Microsoft R) версия 5.8
c Корпорация Майкрософт (Microsoft Corp.), 1996-2001. Все права защищены.

D:\Public -&gt; объект пропущен


Готово.
Журнал работы удалён, потому что он пуст.

D:\Public\1&gt;</code></pre></div><p>Собственно, я выкрутился как смог: включил весь алгоритм определения прав внутрь конструкции If:</p><div class="codebox"><pre><code>If InStr(strDir,&quot;&#039;&quot;) = 0 Then
&#039;   wscript.echo strDir
   Set objSecSettings = objWMI.Get(&quot;Win32_LogicalFileSecuritySetting.Path=&#039;&quot; &amp; strDir &amp; &quot;&#039;&quot;)</code></pre></div><p>и далее по тексту (оно запиналось на файлах и каталогах, в именах которых присутствовал символ &#039;)</p><p>А каталоги, в которых есть ненаследуемые права отфильровал через find &quot;не унаследовано&quot; FoldersDACL.log</p><p>Оно может и не изящно, но чего надо добился <img src="//forum.script-coding.com/img/smilies/smile.png" width="15" height="15" />)</p>]]></description>
			<author><![CDATA[null@example.com (inock)]]></author>
			<pubDate>Fri, 02 Nov 2012 09:59:04 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=65342#p65342</guid>
		</item>
		<item>
			<title><![CDATA[Re: VBS: получение списка всех вложенных папок с разрешениями]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=65341#p65341</link>
			<description><![CDATA[<p><strong>inock</strong>, попробуйте такой вариант:<br /></p><div class="codebox"><pre><code>Public objWMI, objFS, objFile, strDomain, intOSVersion
Dim objWsNet, objCollection, objItem, strPath, strLog
strPath = &quot;X:\Folder&quot; &#039;здесь укажите реальный путь
strLog = &quot;FoldersDACL.log&quot;
Set objWsNet = CreateObject(&quot;WScript.Network&quot;)
strDomain = objWsNet.UserDomain
Set objWsNet = Nothing
Set objFS = CreateObject(&quot;Scripting.FileSystemObject&quot;)
If objFS.FolderExists(strPath) Then
    Set objWMI = GetObject(&quot;winmgmts:\\.\root\cimv2&quot;)
    Set objCollection = objWMI.ExecQuery(&quot;SELECT Version FROM Win32_OperatingSystem&quot;)
    For Each objItem In objCollection
        intOSVersion = CInt(Replace(Left(objItem.Version, 3), &quot;.&quot;, &quot;&quot;))
    Next
    Set objCollection = Nothing
        strLog = objFS.BuildPath(objFS.GetParentFolderName(WScript.ScriptFullName), strLog)
    Set objFile = objFS.CreateTextFile(strLog, True)
    Call Get_DACLInfo(strPath)
    objFile.Close
    Set objFile = Nothing
        If objFS.GetFile(strLog).Size = 0 Then
            On Error Resume Next
            objFS.DeleteFile strLog, True
            If Err.Number = 0 Then
                WScript.Echo vbNewLine &amp; vbNewLine &amp; &quot;Готово.&quot; &amp; vbNewLine &amp; _
                            &quot;Журнал работы удалён, потому что он пуст.&quot;
            Else
                Err.Clear
                WScript.Echo vbNewLine &amp; vbNewLine &amp; &quot;Готово.&quot; &amp; vbNewLine &amp; _
                            &quot;Журнал работы пуст, но удалить его не удалось.&quot;
            End If
        Else
            WScript.Echo vbNewLine &amp; vbNewLine &amp; &quot;Готово.&quot; &amp; vbNewLine &amp; &quot;Журнал работы: &quot; &amp; UCase(strLog)
        End If
    Set objWMI = Nothing
Else
    WScript.Echo &quot;Не найден путь &quot; &amp; UCase(strPath)
End If
Set objFS = Nothing
WScript.Quit 0

&#039;======

Function Get_DACLInfo(strDir)
Dim objSecSettings, objSD, objFolder
Dim objEntry, strTemp, strRes, i, j, lngMask, lngTemp
Dim arrFlagValue, arrFlagName, arrGenericValue, arrGenericName
Dim arrSieveGE, arrSieveGW, arrSieveGR, arrTemp
Const SE_DACL_PROTECTED = 4096 &#039;Флаг-признак отключенного режима наследования каталогом безопасности NTFS от &quot;родителя&quot;
&#039;--- Значения универсальных масок
Const GENERIC_ALL = &amp;H10000000
Const GENERIC_EXECUTE = &amp;H20000000
Const GENERIC_WRITE = &amp;H40000000
Const GENERIC_READ = &amp;H80000000
&#039;------
Const ACCESS_ALLOWED_ACE_TYPE = 0 &#039;Флаг-признак записи типа &quot;РАЗРЕШЕНИЕ&quot;
Const ACCESS_DENIED_ACE_TYPE = 1  &#039;Флаг-признак записи типа &quot;ЗАПРЕТ&quot;
Const INHERITED_ACE = 16 &#039;Флаг-признак того, что текущая запись DACL унаследована от родительского каталога
Const FULL_ACCESS = 983551 &#039;Значение маски полного разрешения или запрета
Const FLAG_SYNCHRONIZE = 1048576 &#039;Значение флага синхронизации доступа к объекту файловой системы
                                 &#039;(в версиях ОС &quot;2000/XP&quot;, применим только для записей типа &quot;РАЗРЕШЕНИЕ&quot;)

arrFlagValue = Array(32, 1, 128, 8, 2, 4, 256, 16, 64, 65536, 131072, 262144, 524288)
arrFlagName = Array(&quot;Траверс папок / Выполнение файлов&quot;, _
                    &quot;Содержание папки / Чтение данных&quot;, _
                    &quot;Чтение атрибутов&quot;, _
                    &quot;Чтение дополнительных атрибутов&quot;, _
                    &quot;Создание файлов / Запись данных&quot;, _
                    &quot;Создание папок / Дозапись данных&quot;, _
                    &quot;Запись атрибутов&quot;, _
                    &quot;Запись дополнительных атрибутов&quot;, _
                    &quot;Удаление подпапок и файлов&quot;, _
                    &quot;Удаление&quot;, _
                    &quot;Чтение разрешений&quot;, _
                    &quot;Смена разрешений&quot;, _
                    &quot;Смена владельца&quot;)
                    
arrGenericValue = Array(&amp;H20000000, &amp;H40000000, &amp;H80000000)
arrGenericName = Array(&quot;Выполнение (универсальная маска)&quot;, &quot;Запись (универсальная маска)&quot;, &quot;Чтение (универсальная маска)&quot;)
&#039;--- Вспомогательные массивы, предназначенные для детализации универсальных масок
arrSieveGE = Array(-1, 0, -1, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0)
arrSieveGW = Array(0, 0, 0, 0, -1, -1, -1, -1, 0, 0, -1, 0, 0)
arrSieveGR = Array(0, -1, -1, -1, 0, 0, 0, 0, 0, 0, -1, 0, 0)
&#039;------

On Error Resume Next
Set objSecSettings = objWMI.Get(&quot;Win32_LogicalFileSecuritySetting.Path=&#039;&quot; &amp; strDir &amp; &quot;&#039;&quot;)
If objSecSettings.GetSecurityDescriptor(objSD) = 0 Then
    If Err.Number = 0 Then
        If CBool(objSD.ControlFlags And SE_DACL_PROTECTED) Then
            If Err.Number = 0 Then
                If IsNull(objSD.DACL) Then
                    If Err.Number = 0 Then
                        WScript.Echo strDir &amp; &quot; -&gt; DACL пуст&quot;
                        objFile.WriteLine strDir &amp; &quot; -&gt; DACL пуст&quot;
                    Else
                        WScript.Echo strDir &amp; &quot; -&gt; ошибка &quot; &amp; Err.Number &amp; &quot; чтения DACL&quot; &amp; vbNewLine &amp; Err.Description
                        objFile.WriteLine strDir &amp; &quot; -&gt; ошибка &quot; &amp; Err.Number &amp; &quot; чтения DACL&quot; &amp; vbNewLine &amp; Err.Description
                        Err.Clear
                    End If
                Else
                    &#039;--- Настройка правильного наименования одного из флагов маски доступа в зависимости от версии ОС
                    If intOSVersion &lt; 60 Then arrFlagName(0) = &quot;Обзор папок / Выполнение файлов&quot;
                    &#039;------
                    strRes = vbNullString
                    For Each objEntry In objSD.DACL
                        If StrComp(objEntry.Trustee.Domain, strDomain, vbtextCompare) = 0 Then
                            &#039;--- Определение режима наследования записи и области её действия
                            If CBool(objEntry.AceFlags And INHERITED_ACE) Then
                                strTemp = &quot; (унаследовано; &quot;
                                lngTemp = objEntry.AceFlags - INHERITED_ACE
                            Else
                                strTemp = &quot; (не унаследовано; &quot;
                                lngTemp = objEntry.AceFlags
                                Select Case lngTemp
                                    Case 0: strTemp = strTemp &amp; &quot;действует на: только текущий каталог)&quot;
                                    Case 1: strTemp = strTemp &amp; &quot;действует на: текущий каталог и его файлы)&quot;
                                    Case 2: strTemp = strTemp &amp; &quot;действует на: текущий каталог и его подкаталоги)&quot;
                                    Case 3: strTemp = strTemp &amp; &quot;действует на: текущий каталог, его подкаталоги и файлы)&quot;
                                    Case 9: strTemp = strTemp &amp; &quot;действует на: только файлы текущего каталога)&quot;
                                    Case 10: strTemp = strTemp &amp; &quot;действует на: только подкаталоги текущего каталога)&quot;
                                    Case 11: strTemp = strTemp &amp; &quot;действует на: подкаталоги и файлы текущего каталога)&quot;
                                    Case Else: strTemp = strTemp &amp; &quot;область действия не определена); &quot;
                                End Select
                                strTemp = strTemp &amp; vbNewLine &amp; &quot;---&quot; &amp; vbNewLine
                                &#039;------
                                &#039;--- Определение типа записи
                                If objEntry.AceType = ACCESS_ALLOWED_ACE_TYPE Then
                                    strTemp = strTemp &amp; &quot;РАЗРЕШЕНО:&quot; &amp; vbNewLine
                                ElseIf objEntry.AceType = ACCESS_DENIED_ACE_TYPE Then
                                    strTemp = strTemp &amp; &quot;ЗАПРЕЩЕНО:&quot; &amp; vbNewLine
                                End If
                                &#039;------
                                &#039;--- Определение значения маски &quot;Полный доступ&quot; в зависимости от версии ОС
                                If intOSVersion &lt; 52 Then
                                    lngTemp = FULL_ACCESS + Abs(objEntry.AceType - 1) * FLAG_SYNCHRONIZE
                                    &#039;Выражение FULL_ACCESS + Abs(objEntry.AceType - 1) * FLAG_SYNCHRONIZE
                                    &#039;учитывает разницу между значениями маски &quot;Полный доступ&quot; у записей разных типов
                                    &#039;в ОС версий &quot;2000/XP&quot;
                                Else
                                    lngTemp = FULL_ACCESS + FLAG_SYNCHRONIZE
                                End If
                                &#039;------
                                lngMask = objEntry.AccessMask
                                Select Case Abs(lngMask)
                                    Case lngTemp: strTemp = strTemp &amp; &quot;Полный доступ&quot; &amp; vbNewLine
                                    Case GENERIC_ALL: strTemp = strTemp &amp; &quot;Полный доступ (универсальная маска)&quot; &amp; vbNewLine
                                    Case Else
                                        &#039;--- Детальный анализ маски доступа текущей записи:
                                        &#039;обработка универсальных масок (биты №№ 29 - 31)
                                        If Abs(lngMask) &gt; lngTemp Then
                                            For i = 0 To UBound(arrGenericValue)
                                                If lngMask And arrGenericValue(i) Then
                                                    strTemp = strTemp &amp; arrGenericName(i) &amp; vbNewLine &amp; vbTab &amp; &quot;{&quot; &amp; vbNewLine
                                                    Select Case arrGenericValue(i)
                                                        Case GENERIC_EXECUTE: arrTemp = arrSieveGE
                                                        Case GENERIC_WRITE: arrTemp = arrSieveGW
                                                        Case GENERIC_READ: arrTemp = arrSieveGR
                                                    End Select
                                                    For j = 0 To UBound(arrTemp)
                                                        If arrTemp(j) Then strTemp = strTemp &amp; vbTab &amp; arrFlagName(j) &amp; vbNewLine
                                                    Next
                                                    strTemp = strTemp &amp; vbTab &amp; &quot;}&quot; &amp; vbNewLine
                                                End If
                                            Next
                                        End If
                                        &#039;обработка обычных масок (биты №№ 0 - 20)
                                        For i = 0 To UBound(arrFlagValue)
                                            If lngMask And arrFlagValue(i) Then
                                                strTemp = strTemp &amp; arrFlagName(i) &amp; vbNewLine
                                            End If
                                        Next
                                        &#039;------
                                End Select
                                strTemp = UCase(objEntry.Trustee.Domain &amp; &quot;\&quot; &amp; objEntry.Trustee.Name) &amp; strTemp &amp; &quot;===&quot; &amp; vbNewLine
                                strRes = strRes &amp; strTemp
                            End If
                        End If
                    Next
                    Set objEntry = Nothing
                    If Len(strRes) &gt; 0 Then
                        WScript.Echo strDir &amp; &quot; -&gt; объект обработан&quot;
                        objFile.WriteLine UCase(strDir) &amp; vbNewLine &amp; strRes
                    End If
                    For Each objFolder In objFS.GetFolder(strDir).SubFolders
                        If Err.Number = 0 Then
                            Call Get_DACLInfo(objFolder.Path)
                        Else
                            WScript.Echo objFolder.Path &amp; &quot; -&gt; ошибка &quot; &amp; Err.Number &amp; &quot; обращения к объекту&quot; &amp; vbNewLine &amp; Err.Description
                            objFile.WriteLine objFolder.Path &amp; &quot; -&gt; ошибка &quot; &amp; Err.Number &amp; &quot; обращения к объекту&quot; &amp; vbNewLine &amp; Err.Description
                            Err.Clear
                        End If
                    Next
                    Set objFolder = Nothing
                End If
            Else
                WScript.Echo objFolder.Path &amp; &quot; -&gt; ошибка &quot; &amp; Err.Number &amp; &quot; определения режима наследования&quot; &amp; vbNewLine &amp; Err.Description
                objFile.WriteLine objFolder.Path &amp; &quot; -&gt; ошибка &quot; &amp; Err.Number &amp; &quot; определения режима наследования&quot; &amp; vbNewLine &amp; Err.Description
                Err.Clear
            End If
        Else
            WScript.Echo strDir &amp; &quot; -&gt; объект пропущен&quot;
        End If
    Else
        WScript.Echo strDir &amp; &quot; -&gt; ошибка &quot; &amp; Err.Number &amp; &quot; чтения дескриптора безопасности&quot; &amp; vbNewLine &amp; Err.Description
        objFile.WriteLine strDir &amp; &quot; -&gt; ошибка &quot; &amp; Err.Number &amp; &quot; чтения дескриптора безопасности&quot; &amp; vbNewLine &amp; Err.Description
        Err.Clear
    End If
Else
    WScript.Echo strDir &amp; &quot; -&gt; не удалось прочитать дескриптор безопасности&quot;
    objFile.WriteLine strDir &amp; &quot; -&gt; не удалось прочитать дескриптор безопасности&quot;
End If
Set objSD = Nothing
Set objSecSettings = Nothing
On Error GoTo 0
End Function</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (Dmitrii)]]></author>
			<pubDate>Fri, 02 Nov 2012 09:30:29 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=65341#p65341</guid>
		</item>
		<item>
			<title><![CDATA[Re: VBS: получение списка всех вложенных папок с разрешениями]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=65336#p65336</link>
			<description><![CDATA[<div class="quotebox"><cite>Dmitrii пишет:</cite><blockquote><p><strong>nostro</strong>, думаю, Вам подойдёт что-то такое (консольный вариант):</p></blockquote></div><p>Мне бы такое точно подошло <img src="//forum.script-coding.com/img/smilies/smile.png" width="15" height="15" /> К сожалению, скрипт сложноват для моего понимания, не могли бы вы подсказать, что в нем надо переписать чтобы:</p><p>1. В лог писались только те каталоги, права на которые не наследуются от родителей. Если же права унаследованы, но просто ничего не пишем.<br />2. Обрабатывались ошибки так, чтобы скрипт не вылетал на полдороге, а продолжал обрабатывать остальные пути:</p><div class="codebox"><pre><code>D:\Public\Common\Папка обмена\Алевтине\2012 - Григорий Лепс - Лучшее (FLAC)\CD 2
 -&gt; объект обработан
D:\Public\Common\Папка обмена\Алевтине\2012 - Григорий Лепс - Лучшее (FLAC)\Cove
rs -&gt; объект обработан
D:\NTFS-ACCESS.vbs(74, 1) SWbemServicesEx: Invalid object path</code></pre></div><p>Спасибо <img src="//forum.script-coding.com/img/smilies/smile.png" width="15" height="15" /></p>]]></description>
			<author><![CDATA[null@example.com (inock)]]></author>
			<pubDate>Fri, 02 Nov 2012 05:07:40 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=65336#p65336</guid>
		</item>
		<item>
			<title><![CDATA[Re: VBS: получение списка всех вложенных папок с разрешениями]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=65042#p65042</link>
			<description><![CDATA[<p><strong>nostro</strong>, думаю, Вам подойдёт что-то такое (консольный вариант):<br /></p><div class="codebox"><pre><code>Public objWMI, objFS, objFile, strDomain, intOSVersion
Dim objWsNet, objCollection, objItem, strPath, strLog
strPath = &quot;X:\Folder&quot; &#039;здесь укажите реальный путь
strLog = &quot;FoldersDACL.log&quot;
Set objWsNet = CreateObject(&quot;WScript.Network&quot;)
strDomain = objWsNet.UserDomain
Set objWsNet = Nothing
Set objFS = CreateObject(&quot;Scripting.FileSystemObject&quot;)
If objFS.FolderExists(strPath) Then
    Set objWMI = GetObject(&quot;winmgmts:\\.\root\cimv2&quot;)
    Set objCollection = objWMI.ExecQuery(&quot;SELECT Version FROM Win32_OperatingSystem&quot;)
    For Each objItem In objCollection
        intOSVersion = CInt(Replace(Left(objItem.Version, 3), &quot;.&quot;, &quot;&quot;))
    Next
    Set objCollection = Nothing
    Set objFile = objFS.CreateTextFile(objFS.BuildPath(objFS.GetParentFolderName(WScript.ScriptFullName), strLog), True)
    Call Get_DACLInfo(strPath)
    objFile.Close
    Set objFile = Nothing
    Set objWMI = Nothing
    WScript.Echo vbNewLine &amp; vbNewLine &amp; &quot;Готово&quot;
Else
    WScript.Echo &quot;Не найден путь &quot; &amp; UCase(strPath)
End If
Set objFS = Nothing
WScript.Quit 0

&#039;======

Function Get_DACLInfo(strDir)
Dim objSecSettings, objSD, objFolder
Dim objEntry, strTemp, strRes, i, j, lngMask, lngTemp
Dim arrFlagValue, arrFlagName, arrGenericValue, arrGenericName
Dim arrSieveGE, arrSieveGW, arrSieveGR, arrTemp
&#039;--- Значения универсальных масок
Const GENERIC_ALL = &amp;H10000000
Const GENERIC_EXECUTE = &amp;H20000000
Const GENERIC_WRITE = &amp;H40000000
Const GENERIC_READ = &amp;H80000000
&#039;------
Const ACCESS_ALLOWED_ACE_TYPE = 0 &#039;Флаг-признак записи типа &quot;РАЗРЕШЕНИЕ&quot;
Const ACCESS_DENIED_ACE_TYPE  = 1 &#039;Флаг-признак записи типа &quot;ЗАПРЕТ&quot;
Const INHERITED_ACE = 16 &#039;Флаг-признак того, что текущая запись DACL унаследована от родительского каталога 
Const FULL_ACCESS = 983551 &#039;Значение маски полного разрешения или запрета
Const FLAG_SYNCHRONIZE = 1048576 &#039;Значение флага синхронизации доступа к объекту файловой системы
                                 &#039;(в версиях ОС &quot;2000/XP&quot;, применим только для записей типа &quot;РАЗРЕШЕНИЕ&quot;)

arrFlagValue = Array(32, 1, 128, 8, 2, 4, 256, 16, 64, 65536, 131072, 262144, 524288)
arrFlagName = Array(&quot;Траверс папок / Выполнение файлов&quot;, _
                    &quot;Содержание папки / Чтение данных&quot;, _
                    &quot;Чтение атрибутов&quot;, _
                    &quot;Чтение дополнительных атрибутов&quot;, _
                    &quot;Создание файлов / Запись данных&quot;, _
                    &quot;Создание папок / Дозапись данных&quot;, _
                    &quot;Запись атрибутов&quot;, _
                    &quot;Запись дополнительных атрибутов&quot;, _
                    &quot;Удаление подпапок и файлов&quot;, _
                    &quot;Удаление&quot;, _
                    &quot;Чтение разрешений&quot;, _
                    &quot;Смена разрешений&quot;, _
                    &quot;Смена владельца&quot;)
                    
arrGenericValue = Array(&amp;H20000000, &amp;H40000000, &amp;H80000000)
arrGenericName = Array(&quot;Выполнение (универсальная маска)&quot;, &quot;Запись (универсальная маска)&quot;, &quot;Чтение (универсальная маска)&quot;)
&#039;--- Вспомогательные массивы, предназначенные для детализации универсальных масок
arrSieveGE = Array(-1, 0, -1, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0)
arrSieveGW = Array(0, 0, 0, 0, -1, -1, -1, -1, 0, 0, -1, 0, 0)
arrSieveGR = Array(0, -1, -1, -1, 0, 0, 0, 0, 0, 0, -1, 0, 0)
&#039;------

Set objSecSettings = objWMI.Get(&quot;Win32_LogicalFileSecuritySetting.Path=&#039;&quot; &amp; strDir &amp; &quot;&#039;&quot;)
If objSecSettings.GetSecurityDescriptor(objSD) = 0 Then
    If IsNull(objSD.DACL) Then
        WScript.Echo strDir &amp; &quot; -&gt; DACL пуст&quot;
        objFile.WriteLine strDir &amp; &quot; -&gt; DACL пуст&quot;
    Else
        &#039;--- Настройка правильного наименования одного из флагов маски доступа в зависимости от версии ОС
        If intOSVersion &lt; 60 Then arrFlagName(0) = &quot;Обзор папок / Выполнение файлов&quot;
        &#039;------
        strRes = vbNullString
        For Each objEntry In objSD.DACL
            If StrComp(objEntry.Trustee.Domain, strDomain, vbtextCompare) = 0 Then
                &#039;--- Определение режима наследования записи и области её действия
                If CBool(objEntry.AceFlags And INHERITED_ACE) Then
                    strTemp = &quot; (унаследовано; &quot;
                    lngTemp = objEntry.AceFlags - INHERITED_ACE
                Else
                    strTemp = &quot; (не унаследовано; &quot;
                    lngTemp = objEntry.AceFlags
                End If
                Select Case lngTemp
                    Case 0: strTemp = strTemp &amp; &quot;действует на: только текущий каталог)&quot;
                    Case 1: strTemp = strTemp &amp; &quot;действует на: текущий каталог и его файлы)&quot;
                    Case 2: strTemp = strTemp &amp; &quot;действует на: текущий каталог и его подкаталоги)&quot;
                    Case 3: strTemp = strTemp &amp; &quot;действует на: текущий каталог, его подкаталоги и файлы)&quot;
                    Case 9: strTemp = strTemp &amp; &quot;действует на: только файлы текущего каталога)&quot;
                    Case 10: strTemp = strTemp &amp; &quot;действует на: только подкаталоги текущего каталога)&quot;
                    Case 11: strTemp = strTemp &amp; &quot;действует на: подкаталоги и файлы текущего каталога)&quot;
                    Case Else: strTemp = strTemp &amp; &quot;область действия не определена); &quot;
                End Select
                strTemp = strTemp &amp; vbNewLine &amp; &quot;---&quot; &amp; vbNewLine
                &#039;------
                &#039;--- Определение типа записи
                If objEntry.AceType = ACCESS_ALLOWED_ACE_TYPE Then
                    strTemp = strTemp &amp; &quot;РАЗРЕШЕНО:&quot; &amp; vbNewLine
                ElseIf objEntry.AceType = ACCESS_DENIED_ACE_TYPE Then
                    strTemp = strTemp &amp; &quot;ЗАПРЕЩЕНО:&quot; &amp; vbNewLine
                End If
                &#039;------
                &#039;--- Определение значения маски &quot;Полный доступ&quot; в зависимости от версии ОС
                If intOSVersion &lt; 52 Then
                    lngTemp = FULL_ACCESS + Abs(objEntry.AceType - 1) * FLAG_SYNCHRONIZE
                    &#039;Выражение FULL_ACCESS + Abs(objEntry.AceType - 1) * FLAG_SYNCHRONIZE
                    &#039;учитывает разницу между значениями маски &quot;Полный доступ&quot; у записей разных типов
                    &#039;в ОС версий &quot;2000/XP&quot;
                Else
                    lngTemp = FULL_ACCESS + FLAG_SYNCHRONIZE
                End If
                &#039;------
                lngMask = objEntry.AccessMask
                Select Case Abs(lngMask)
                    Case lngTemp: strTemp = strTemp &amp; &quot;Полный доступ&quot; &amp; vbNewLine
                    Case GENERIC_ALL: strTemp = strTemp &amp; &quot;Полный доступ (универсальная маска)&quot; &amp; vbNewLine
                    Case Else
                        &#039;--- Детальный анализ маски доступа текущей записи:
                        &#039;обработка универсальных масок (биты №№ 29 - 31)
                        If Abs(lngMask) &gt; lngTemp Then
                            For i = 0 To UBound(arrGenericValue)
                                If lngMask And arrGenericValue(i) Then
                                    strTemp = strTemp &amp; arrGenericName(i) &amp; vbNewLine &amp; vbTab &amp; &quot;{&quot; &amp; vbNewLine
                                    Select Case arrGenericValue(i)
                                        Case GENERIC_EXECUTE: arrTemp = arrSieveGE
                                        Case GENERIC_WRITE: arrTemp = arrSieveGW
                                        Case GENERIC_READ: arrTemp = arrSieveGR
                                    End Select
                                    For j = 0 To UBound(arrTemp)
                                        If arrTemp(j) Then strTemp = strTemp &amp; vbTab &amp; arrFlagName(j) &amp; vbNewLine
                                    Next
                                    strTemp = strTemp &amp; vbTab &amp; &quot;}&quot; &amp; vbNewLine
                                End If
                            Next
                        End If
                        &#039;обработка обычных масок (биты №№ 0 - 20)
                        For i = 0 To UBound(arrFlagValue)
                            If lngMask And arrFlagValue(i) Then
                                strTemp = strTemp &amp; arrFlagName(i) &amp; vbNewLine
                            End If
                        Next
                        &#039;------
                End Select
                strTemp = UCase(objEntry.Trustee.Domain &amp; &quot;\&quot; &amp; objEntry.Trustee.Name) &amp; strTemp &amp; &quot;===&quot; &amp; vbNewLine
                strRes = strRes &amp; strTemp
            End If
        Next
        Set objEntry = Nothing
        If Len(strRes) &gt; 0 Then
            WScript.Echo strDir &amp; &quot; -&gt; объект обработан&quot;
            objFile.WriteLine UCase(strDir) &amp; vbNewLine &amp; strRes
        End If
        For Each objFolder In objFS.GetFolder(strDir).SubFolders
            Call Get_DACLInfo(objFolder.Path)
        Next
        Set objFolder = Nothing
    End If
Else
    WScript.Echo strDir &amp; &quot; -&gt; не удалось прочитать дескриптор безопасности&quot;
    objFile.WriteLine strDir &amp; &quot; -&gt; не удалось прочитать дескриптор безопасности&quot;
End If
Set objSD = Nothing
Set objSecSettings = Nothing
End Function</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (Dmitrii)]]></author>
			<pubDate>Tue, 23 Oct 2012 12:03:59 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=65042#p65042</guid>
		</item>
		<item>
			<title><![CDATA[Re: VBS: получение списка всех вложенных папок с разрешениями]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=65041#p65041</link>
			<description><![CDATA[<p>Приведите пример с гипотетическим Continue.</p>]]></description>
			<author><![CDATA[null@example.com (alexii)]]></author>
			<pubDate>Tue, 23 Oct 2012 12:00:54 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=65041#p65041</guid>
		</item>
		<item>
			<title><![CDATA[Re: VBS: получение списка всех вложенных папок с разрешениями]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=65040#p65040</link>
			<description><![CDATA[<div class="quotebox"><cite>alexii пишет:</cite><blockquote><div class="quotebox"><blockquote><p>Скажите, в VBS есть что-то типа Continue при выполнении цикла, чтобы при определенном условии цикл ничего не делал, но переходил на следующую итерацию?</p></blockquote></div><p>Нет. Просто используйте условие, чтобы пропускать должную часть кода.</p></blockquote></div><p>Стесняюсь своей безграмотности, но как? Я просто не часто вынужден писать на VBS, так что многих простых и очевидных для других вещей не знаю...</p>]]></description>
			<author><![CDATA[null@example.com (nostro)]]></author>
			<pubDate>Tue, 23 Oct 2012 11:37:35 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=65040#p65040</guid>
		</item>
		<item>
			<title><![CDATA[Re: VBS: получение списка всех вложенных папок с разрешениями]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=65032#p65032</link>
			<description><![CDATA[<div class="quotebox"><blockquote><p>Скажите, в VBS есть что-то типа Continue при выполнении цикла, чтобы при определенном условии цикл ничего не делал, но переходил на следующую итерацию?</p></blockquote></div><p>Нет. Просто используйте условие, чтобы пропускать должную часть кода.</p>]]></description>
			<author><![CDATA[null@example.com (alexii)]]></author>
			<pubDate>Tue, 23 Oct 2012 09:49:40 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=65032#p65032</guid>
		</item>
		<item>
			<title><![CDATA[Re: VBS: получение списка всех вложенных папок с разрешениями]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=65027#p65027</link>
			<description><![CDATA[<p>Спасибо! Вот, что получилось:<br /></p><div class="codebox"><pre><code>Option Explicit

Dim rootFolder, objFSO
Dim subFolder
Dim objShell, objFolder, strPath
Dim objWsNet, strDomain, strComputer, blnIsDomain, intOSVersion
Dim objWMI, objCollection, objItem, objSecSettings, objSD
Dim strAccount, strSID, strList
Dim intHasAccount &#039;Флаг-признак режима работы:
                  &#039;-1 - не составлять список, т.к. указанная &quot;учётка&quot; не найдена;
                  &#039;0  - составлять полный список;
                  &#039;1  - составлять частичный список (только для указанной &quot;учётки&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;)
    strDomain = objWsNet.UserDomain
    strComputer = objWsNet.ComputerName
    Set objWsNet = Nothing
    If StrComp(strDomain, strComputer, vbTextCompare) &lt;&gt; 0 Then blnIsDomain = True
    Set objWMI = GetObject(&quot;winmgmts:{impersonationLevel=impersonate}!\\&quot; &amp; strComputer &amp; &quot;\root\cimv2&quot;)
    &#039;--- Определение версии ОС
    Set objCollection = objWMI.ExecQuery(&quot;SELECT Version FROM Win32_OperatingSystem&quot;)
    For Each objItem In objCollection
        intOSVersion = CInt(Replace(Left(objItem.Version, 3), &quot;.&quot;, &quot;&quot;))
    Next
    Set objItem = Nothing
    &#039;------
    strAccount = Trim(InputBox(&quot;Имя пользователя или группы&quot; &amp; vbNewLine &amp; _
                                &quot;(при составлении полного списка -&quot; &amp; vbNewLine &amp; _
                                &quot;не указывать):&quot;, &quot;Проверка настроек безопасности NTFS&quot;))
    intHasAccount = 0
    If Len(strAccount) &gt; 0 Then
        strAccount = Replace(strAccount, &quot;&quot;&quot;&quot;, &quot;&quot;)
        &#039;--- Настройка правильного наименования &quot;учётки&quot; локальной ОС в зависимости от версии ОС
        If intOSVersion &lt; 61 Then
            strAccount = Replace(strAccount, &quot;Система&quot;, &quot;System&quot;, 1, -1, vbTextCompare)
        Else
            strAccount = Replace(strAccount, &quot;System&quot;, &quot;Система&quot;, 1, -1, vbTextCompare)
        End If
        &#039;------
        If StrComp(strAccount, &quot;System&quot;, vbTextCompare) = 0 Or StrComp(strAccount, &quot;Система&quot;, vbTextCompare) = 0 Or _
            StrComp(strAccount, &quot;Все&quot;, vbTextCompare) = 0 Then
            strDomain = vbNullString
        Else
            If blnIsDomain Then
                If MsgBox(&quot;Задана доменная учётная запись?&quot;, vbYesNo + vbQuestion, &quot;Проверка настроек безопасности NTFS&quot;) = vbNo Then
                    strDomain = strComputer
                End If
            Else
                strDomain = strComputer
            End If
        End If
        &#039;--- Поиск заданной &quot;учётки&quot; на локальном компьютере или в Active Directory
        If Len(strDomain) &gt; 0 Then
            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;)
        Else
            Set objCollection = objWMI.ExecQuery(&quot;SELECT SID FROM Win32_Account WHERE Name=&#039;&quot; &amp; strAccount &amp; &quot;&#039;&quot;)
        End If
        &#039;------
        If objCollection.Count &gt; 0 Then
            intHasAccount = 1
            &#039;--- Определение SID заданной &quot;учётки&quot;
            For Each objItem In objCollection
                strSID = UCase(objItem.SID)
            Next
            &#039;------
        Else
            intHasAccount = -1
        End If
    End If
    Set objFSO = CreateObject(&quot;Scripting.FileSystemObject&quot;)
    ShowSubFolders objFSO.GetFolder(strPath)
    Sub ShowSubFolders(Folder)
         For Each Subfolder in Folder.SubFolders
          WScript.Echo Subfolder.Path
              If intHasAccount &gt;=0 Then
                Set objSecSettings = objWMI.Get(&quot;Win32_LogicalFileSecuritySetting.Path=&#039;&quot; &amp; Subfolder.Path &amp; &quot;&#039;&quot;)
                If objSecSettings.GetSecurityDescriptor(objSD) = 0 Then &#039;Чтение содержимого дескриптора безопасности каталога
                    strList = vbNullString
                    If Not IsNull(objSD.DACL) Then &#039;Проверка наличия хотя бы одной записи в DACL каталога
                        Call Get_DACLInfo(objSD.DACL, strList, intHasAccount, strSID, intOSVersion)
                        If Len(strList) &gt; 0 Then
                            WScript.Echo strList &#039;Вывод на экран
                            Dim fso, tf
                              Set fso = CreateObject(&quot;Scripting.FileSystemObject&quot;)
                              Set tf = fso.OpenTextFile(&quot;d:\1.csv&quot;, 8)
                              tf.WriteLine(strList)
                            tf.Close
                        Else
                            WScript.Echo &quot;В DACL не обнаружено ни одной записи для объекта &quot; &amp; UCase(strDomain &amp; &quot;\&quot; &amp; strAccount)
                        End If
                    Else
                        WScript.Echo &quot;Список управления доступом к каталогу &quot; &amp; UCase(strPath) &amp; &quot; пуст.&quot;
                    End If
                Else
                    WScript.Echo &quot;Не удалось прочитать дескриптор безопасности каталога &quot; &amp; UCase(strPath)
                End If
              Else
                WScript.Echo &quot;Учётная запись объекта &quot; &amp; UCase(strDomain &amp; &quot;\&quot; &amp; strAccount) &amp; &quot; не найдена.&quot;
              End If
         ShowSubFolders Subfolder
         Next
    End Sub 
    Set objSecSettings = Nothing
    Set objCollection = Nothing
    Set objWMI = Nothing
Else
    WScript.Echo &quot;Каталог не выбран.&quot;
End If
Set objFolder = Nothing
Set objShell = Nothing
WScript.Quit 0

&#039;======

Function Get_DACLInfo(arrACE(), strRes, intMode, strAccSID, intVer)
Dim objEntry, strTemp, i, j, lngMask, lngTemp
Dim arrFlagValue, arrFlagName, arrGenericValue, arrGenericName
Dim arrSieveGE, arrSieveGW, arrSieveGR, arrTemp
Const PART_MODE = 1 &#039;Флаг-признак составления частичного списка
&#039;--- Значения универсальных масок
Const GENERIC_ALL = &amp;H10000000
Const GENERIC_EXECUTE = &amp;H20000000
Const GENERIC_WRITE = &amp;H40000000
Const GENERIC_READ = &amp;H80000000
&#039;------
Const ACCESS_ALLOWED_ACE_TYPE = 0 &#039;Флаг-признак записи типа &quot;РАЗРЕШЕНИЕ&quot;
Const ACCESS_DENIED_ACE_TYPE  = 1 &#039;Флаг-признак записи типа &quot;ЗАПРЕТ&quot;
Const INHERITED_ACE = 16 &#039;Флаг-признак того, что текущая запись DACL унаследована от родительского каталога 
Const FULL_ACCESS = 983551 &#039;Значение маски полного разрешения или запрета
Const FLAG_SYNCHRONIZE = 1048576 &#039;Значение флага синхронизации доступа к объекту файловой системы
                                 &#039;(в версиях ОС &quot;2000/XP&quot;, применим только для записей типа &quot;РАЗРЕШЕНИЕ&quot;)

&#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)
arrFlagValue = Array(32, 1, 128, 8, 2, 4, 256, 16, 64, 65536, 131072, 262144, 524288)
arrFlagName = Array(&quot;Траверс папок / Выполнение файлов, &quot;, _
                    &quot;Содержание папки / Чтение данных, &quot;, _
                    &quot;Чтение атрибутов, &quot;, _
                    &quot;Чтение дополнительных атрибутов, &quot;, _
                    &quot;Создание файлов / Запись данных, &quot;, _
                    &quot;Создание папок / Дозапись данных, &quot;, _
                    &quot;Запись атрибутов, &quot;, _
                    &quot;Запись дополнительных атрибутов, &quot;, _
                    &quot;Удаление подпапок и файлов, &quot;, _
                    &quot;Удаление, &quot;, _
                    &quot;Чтение разрешений, &quot;, _
                    &quot;Смена разрешений, &quot;, _
                    &quot;Смена владельца, &quot;)
                    
arrGenericValue = Array(&amp;H20000000, &amp;H40000000, &amp;H80000000)
&#039;arrGenericValue = Array(536870912, 1073741824, 2147483648)
arrGenericName = Array(&quot;Выполнение (универсальная маска)&quot;, &quot;Запись (универсальная маска)&quot;, &quot;Чтение (универсальная маска)&quot;)
&#039;--- Вспомогательные массивы, предназначенные для детализации универсальных масок
arrSieveGE = Array(-1, 0, -1, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0)
arrSieveGW = Array(0, 0, 0, 0, -1, -1, -1, -1, 0, 0, -1, 0, 0)
arrSieveGR = Array(0, -1, -1, -1, 0, 0, 0, 0, 0, 0, -1, 0, 0)
&#039;------

&#039;--- Настройка правильного наименования одного из флагов маски доступа в зависимости от версии ОС
If intVer &lt; 60 Then
    arrFlagName(0) = &quot;Обзор папок / Выполнение файлов&quot;
End If
&#039;------
For Each objEntry In arrACE
    &#039;--- Определение режима наследования записи и области её действия
    If CBool(objEntry.AceFlags And INHERITED_ACE) Then
        strTemp = &quot; (унаследовано, &quot;
        lngTemp = objEntry.AceFlags - INHERITED_ACE
    Else
        strTemp = &quot; (не унаследовано, &quot;
        lngTemp = objEntry.AceFlags
    End If
    Select Case lngTemp
        Case 0: strTemp = strTemp &amp; &quot;действует на: только текущий каталог)&quot;
        Case 1: strTemp = strTemp &amp; &quot;действует на: текущий каталог и его файлы)&quot;
        Case 2: strTemp = strTemp &amp; &quot;действует на: текущий каталог и его подкаталоги)&quot;
        Case 3: strTemp = strTemp &amp; &quot;действует на: текущий каталог, его подкаталоги и файлы)&quot;
        Case 9: strTemp = strTemp &amp; &quot;действует на: только файлы текущего каталога)&quot;
        Case 10: strTemp = strTemp &amp; &quot;действует на: только подкаталоги текущего каталога)&quot;
        Case 11: strTemp = strTemp &amp; &quot;действует на: подкаталоги и файлы текущего каталога)&quot;
        Case Else: strTemp = strTemp &amp; &quot;область действия не определена); &quot;
    End Select
    strTemp = strTemp &amp; &quot; | &quot;
    &#039;--- Определение типа записи
    If objEntry.AceType = ACCESS_ALLOWED_ACE_TYPE Then
        strTemp = strTemp &amp; &quot;РАЗРЕШЕНО: &quot;
    ElseIf objEntry.AceType = ACCESS_DENIED_ACE_TYPE Then
        strTemp = strTemp &amp; &quot;ЗАПРЕЩЕНО: &quot;
    End If
    &#039;--- Определение значения маски &quot;Полный доступ&quot; в зависимости от версии ОС
    If intVer &lt; 52 Then
        lngTemp = FULL_ACCESS + Abs(objEntry.AceType - 1) * FLAG_SYNCHRONIZE
        &#039;Выражение FULL_ACCESS + Abs(objEntry.AceType - 1) * FLAG_SYNCHRONIZE
        &#039;учитывает разницу между значениями маски &quot;Полный доступ&quot; у записей разных типов
        &#039;в ОС версий &quot;2000/XP&quot;
    Else
        lngTemp = FULL_ACCESS + FLAG_SYNCHRONIZE
    End If
    &#039;------
    lngMask = objEntry.AccessMask
    Select Case Abs(lngMask)
        Case lngTemp: strTemp = strTemp &amp; &quot;Полный доступ&quot;
        Case GENERIC_ALL: strTemp = strTemp &amp; &quot;Полный доступ (универсальная маска)&quot;
        Case Else
            &#039;--- Детальный анализ маски доступа текущей записи:
            &#039;обработка универсальных масок (биты №№ 29 - 31)
            If Abs(lngMask) &gt; lngTemp Then
                For i = 0 To UBound(arrGenericValue)
                    If lngMask And arrGenericValue(i) Then
                        strTemp = strTemp &amp; arrGenericName(i) &amp; &quot; { &quot;
                        Select Case arrGenericValue(i)
                            Case GENERIC_EXECUTE: arrTemp = arrSieveGE
                            Case GENERIC_WRITE: arrTemp = arrSieveGW
                            Case GENERIC_READ: arrTemp = arrSieveGR
                        End Select
                        For j = 0 To UBound(arrTemp)
                            If arrTemp(j) Then strTemp = strTemp &amp; arrFlagName(j)
                        Next
                        strTemp = strTemp &amp; &quot; } &quot;
                    End If
                Next
            End If
            &#039;обработка обычных масок (биты №№ 0 - 20)
            For i = 0 To UBound(arrFlagValue)
                If lngMask And arrFlagValue(i) Then
                    strTemp = strTemp &amp; arrFlagName(i)
                End If
            Next
            &#039;------
    End Select
    strTemp = UCase(Subfolder.Path &amp; &quot; | &quot; &amp; objEntry.Trustee.Domain &amp; &quot;\&quot; &amp; objEntry.Trustee.Name &amp; &quot; | &quot;) &amp; strTemp &amp; vbNewLine
    If intMode = PART_MODE Then
        If StrComp(UCase(objEntry.Trustee.SIDString), strAccSID, vbTextCompare) = 0 Then
            strRes = strRes &amp; strTemp
        End If
    Else
        strRes = strRes &amp; strTemp
    End If
Next
End Function</code></pre></div><p>И это работает!<br />Теперь получил новое дополнение - надо, чтобы из выборки исключались встроенные учетки, вроде BUILTIN и NT AUTHORITY...<br />Из кода я понял, что за это отвечает параметр objEntry.Trustee.Domain, вопрос теперь в том, что я затупаю с организацией цикла... Скажите, в VBS есть что-то типа Continue при выполнении цикла, чтобы при определенном условии цикл ничего не делал, но переходил на следующую итерацию?</p>]]></description>
			<author><![CDATA[null@example.com (nostro)]]></author>
			<pubDate>Tue, 23 Oct 2012 06:49:40 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=65027#p65027</guid>
		</item>
		<item>
			<title><![CDATA[Re: VBS: получение списка всех вложенных папок с разрешениями]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=64998#p64998</link>
			<description><![CDATA[<div class="quotebox"><cite>nostro пишет:</cite><blockquote><p>Самый актуальный вопрос - как сделать это не только для выбранной папки, но и для всех вложенных папок на всех уровнях вложенности...</p></blockquote></div><p>Код, конечно, не слабый. Ковырять нет времени. Схема рекурсии примерно такая:</p><div class="codebox"><pre><code>Set objShell = CreateObject(&quot;Shell.Application&quot;)
Set FSO = CreateObject(&quot;Scripting.FileSystemObject&quot;)

Set objFolder = objShell.BrowseForFolder(0, &quot;Выбор каталога&quot;, 17, objShell.NameSpace(&amp;H11))

ForFolder objFolder.Self.Path

Sub ForFolder(Fold)
  For Each Folder In FSO.GetFolder(Fold).SubFolders
    ForFolder Folder
  Next
  Folder = Fold
  MsgBox Folder &#039; или свой код с переменными данными
End Sub</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (Flasher)]]></author>
			<pubDate>Mon, 22 Oct 2012 16:47:51 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=64998#p64998</guid>
		</item>
		<item>
			<title><![CDATA[Re: VBS: получение списка всех вложенных папок с разрешениями]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=64958#p64958</link>
			<description><![CDATA[<div class="quotebox"><cite>Flasher пишет:</cite><blockquote><div class="quotebox"><cite>nostro пишет:</cite><blockquote><p>Как получить список разрешений для одной папки я нашел</p></blockquote></div><p>Тогда предлагаю выложить реализацию. Рекурсию сделать не проблема.</p></blockquote></div><p>Реализация получения списка разрешений для одной папки взята из вот этого примера: http://forum.script-coding.com/viewtopic.php?id=5142<br />Что получилось:<br /></p><div class="codebox"><pre><code>Option Explicit

Dim objShell, objFolder, strPath
Dim objWsNet, strDomain, strComputer, blnIsDomain, intOSVersion
Dim objWMI, objCollection, objItem, objSecSettings, objSD
Dim strAccount, strSID, strList
Dim intHasAccount &#039;Флаг-признак режима работы:
                  &#039;-1 - не составлять список, т.к. указанная &quot;учётка&quot; не найдена;
                  &#039;0  - составлять полный список;
                  &#039;1  - составлять частичный список (только для указанной &quot;учётки&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;)
    strDomain = objWsNet.UserDomain
    strComputer = objWsNet.ComputerName
    Set objWsNet = Nothing
    If StrComp(strDomain, strComputer, vbTextCompare) &lt;&gt; 0 Then blnIsDomain = True
    Set objWMI = GetObject(&quot;winmgmts:{impersonationLevel=impersonate}!\\&quot; &amp; strComputer &amp; &quot;\root\cimv2&quot;)
    &#039;--- Определение версии ОС
    Set objCollection = objWMI.ExecQuery(&quot;SELECT Version FROM Win32_OperatingSystem&quot;)
    For Each objItem In objCollection
        intOSVersion = CInt(Replace(Left(objItem.Version, 3), &quot;.&quot;, &quot;&quot;))
    Next
    Set objItem = Nothing
    &#039;------
    strAccount = Trim(InputBox(&quot;Имя пользователя или группы&quot; &amp; vbNewLine &amp; _
                                &quot;(при составлении полного списка -&quot; &amp; vbNewLine &amp; _
                                &quot;не указывать):&quot;, &quot;Проверка настроек безопасности NTFS&quot;))
    intHasAccount = 0
    If Len(strAccount) &gt; 0 Then
        strAccount = Replace(strAccount, &quot;&quot;&quot;&quot;, &quot;&quot;)
        &#039;--- Настройка правильного наименования &quot;учётки&quot; локальной ОС в зависимости от версии ОС
        If intOSVersion &lt; 61 Then
            strAccount = Replace(strAccount, &quot;Система&quot;, &quot;System&quot;, 1, -1, vbTextCompare)
        Else
            strAccount = Replace(strAccount, &quot;System&quot;, &quot;Система&quot;, 1, -1, vbTextCompare)
        End If
        &#039;------
        If StrComp(strAccount, &quot;System&quot;, vbTextCompare) = 0 Or StrComp(strAccount, &quot;Система&quot;, vbTextCompare) = 0 Or _
            StrComp(strAccount, &quot;Все&quot;, vbTextCompare) = 0 Then
            strDomain = vbNullString
        Else
            If blnIsDomain Then
                If MsgBox(&quot;Задана доменная учётная запись?&quot;, vbYesNo + vbQuestion, &quot;Проверка настроек безопасности NTFS&quot;) = vbNo Then
                    strDomain = strComputer
                End If
            Else
                strDomain = strComputer
            End If
        End If
        &#039;--- Поиск заданной &quot;учётки&quot; на локальном компьютере или в Active Directory
        If Len(strDomain) &gt; 0 Then
            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;)
        Else
            Set objCollection = objWMI.ExecQuery(&quot;SELECT SID FROM Win32_Account WHERE Name=&#039;&quot; &amp; strAccount &amp; &quot;&#039;&quot;)
        End If
        &#039;------
        If objCollection.Count &gt; 0 Then
            intHasAccount = 1
            &#039;--- Определение SID заданной &quot;учётки&quot;
            For Each objItem In objCollection
                strSID = UCase(objItem.SID)
            Next
            &#039;------
        Else
            intHasAccount = -1
        End If
    End If
    If intHasAccount &gt;=0 Then
        Set objSecSettings = objWMI.Get(&quot;Win32_LogicalFileSecuritySetting.Path=&#039;&quot; &amp; strPath &amp; &quot;&#039;&quot;)
        If objSecSettings.GetSecurityDescriptor(objSD) = 0 Then &#039;Чтение содержимого дескриптора безопасности каталога
            strList = vbNullString
            If Not IsNull(objSD.DACL) Then &#039;Проверка наличия хотя бы одной записи в DACL каталога
                Call Get_DACLInfo(objSD.DACL, strList, intHasAccount, strSID, intOSVersion)
                If Len(strList) &gt; 0 Then
                    WScript.Echo strList &#039;Вывод на экран
                Else
                    WScript.Echo &quot;В DACL не обнаружено ни одной записи для объекта &quot; &amp; UCase(strDomain &amp; &quot;\&quot; &amp; strAccount)
                End If
            Else
                WScript.Echo &quot;Список управления доступом к каталогу &quot; &amp; UCase(strPath) &amp; &quot; пуст.&quot;
            End If
        Else
            WScript.Echo &quot;Не удалось прочитать дескриптор безопасности каталога &quot; &amp; UCase(strPath)
        End If
    Else
        WScript.Echo &quot;Учётная запись объекта &quot; &amp; UCase(strDomain &amp; &quot;\&quot; &amp; strAccount) &amp; &quot; не найдена.&quot;
    End If
    Set objSecSettings = Nothing
    Set objCollection = Nothing
    Set objWMI = Nothing
Else
    WScript.Echo &quot;Каталог не выбран.&quot;
End If
Set objFolder = Nothing
Set objShell = Nothing
WScript.Quit 0

&#039;======

Function Get_DACLInfo(arrACE(), strRes, intMode, strAccSID, intVer)
Dim objEntry, strTemp, i, j, lngMask, lngTemp
Dim arrFlagValue, arrFlagName, arrGenericValue, arrGenericName
Dim arrSieveGE, arrSieveGW, arrSieveGR, arrTemp
Const PART_MODE = 1 &#039;Флаг-признак составления частичного списка
&#039;--- Значения универсальных масок
Const GENERIC_ALL = &amp;H10000000
Const GENERIC_EXECUTE = &amp;H20000000
Const GENERIC_WRITE = &amp;H40000000
Const GENERIC_READ = &amp;H80000000
&#039;------
Const ACCESS_ALLOWED_ACE_TYPE = 0 &#039;Флаг-признак записи типа &quot;РАЗРЕШЕНИЕ&quot;
Const ACCESS_DENIED_ACE_TYPE  = 1 &#039;Флаг-признак записи типа &quot;ЗАПРЕТ&quot;
Const INHERITED_ACE = 16 &#039;Флаг-признак того, что текущая запись DACL унаследована от родительского каталога 
Const FULL_ACCESS = 983551 &#039;Значение маски полного разрешения или запрета
Const FLAG_SYNCHRONIZE = 1048576 &#039;Значение флага синхронизации доступа к объекту файловой системы
                                 &#039;(в версиях ОС &quot;2000/XP&quot;, применим только для записей типа &quot;РАЗРЕШЕНИЕ&quot;)

&#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)
arrFlagValue = Array(32, 1, 128, 8, 2, 4, 256, 16, 64, 65536, 131072, 262144, 524288)
arrFlagName = Array(&quot;Траверс папок / Выполнение файлов&quot;, _
                    &quot;Содержание папки / Чтение данных&quot;, _
                    &quot;Чтение атрибутов&quot;, _
                    &quot;Чтение дополнительных атрибутов&quot;, _
                    &quot;Создание файлов / Запись данных&quot;, _
                    &quot;Создание папок / Дозапись данных&quot;, _
                    &quot;Запись атрибутов&quot;, _
                    &quot;Запись дополнительных атрибутов&quot;, _
                    &quot;Удаление подпапок и файлов&quot;, _
                    &quot;Удаление&quot;, _
                    &quot;Чтение разрешений&quot;, _
                    &quot;Смена разрешений&quot;, _
                    &quot;Смена владельца&quot;)
                    
arrGenericValue = Array(&amp;H20000000, &amp;H40000000, &amp;H80000000)
&#039;arrGenericValue = Array(536870912, 1073741824, 2147483648)
arrGenericName = Array(&quot;Выполнение (универсальная маска)&quot;, &quot;Запись (универсальная маска)&quot;, &quot;Чтение (универсальная маска)&quot;)
&#039;--- Вспомогательные массивы, предназначенные для детализации универсальных масок
arrSieveGE = Array(-1, 0, -1, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0)
arrSieveGW = Array(0, 0, 0, 0, -1, -1, -1, -1, 0, 0, -1, 0, 0)
arrSieveGR = Array(0, -1, -1, -1, 0, 0, 0, 0, 0, 0, -1, 0, 0)
&#039;------

&#039;--- Настройка правильного наименования одного из флагов маски доступа в зависимости от версии ОС
If intVer &lt; 60 Then
    arrFlagName(0) = &quot;Обзор папок / Выполнение файлов&quot;
End If
&#039;------
For Each objEntry In arrACE
    &#039;--- Определение режима наследования записи и области её действия
    If CBool(objEntry.AceFlags And INHERITED_ACE) Then
        strTemp = &quot; (унаследовано; &quot;
        lngTemp = objEntry.AceFlags - INHERITED_ACE
    Else
        strTemp = &quot; (не унаследовано; &quot;
        lngTemp = objEntry.AceFlags
    End If
    Select Case lngTemp
        Case 0: strTemp = strTemp &amp; &quot;действует на: только текущий каталог)&quot;
        Case 1: strTemp = strTemp &amp; &quot;действует на: текущий каталог и его файлы)&quot;
        Case 2: strTemp = strTemp &amp; &quot;действует на: текущий каталог и его подкаталоги)&quot;
        Case 3: strTemp = strTemp &amp; &quot;действует на: текущий каталог, его подкаталоги и файлы)&quot;
        Case 9: strTemp = strTemp &amp; &quot;действует на: только файлы текущего каталога)&quot;
        Case 10: strTemp = strTemp &amp; &quot;действует на: только подкаталоги текущего каталога)&quot;
        Case 11: strTemp = strTemp &amp; &quot;действует на: подкаталоги и файлы текущего каталога)&quot;
        Case Else: strTemp = strTemp &amp; &quot;область действия не определена); &quot;
    End Select
    strTemp = strTemp &amp; &quot; | &quot;
    &#039;strTemp = strTemp &amp; vbNewLine &amp; &quot;---&quot; &amp; vbNewLine
    &#039;------
    &#039;--- Определение типа записи
    If objEntry.AceType = ACCESS_ALLOWED_ACE_TYPE Then
        strTemp = strTemp &amp; &quot;РАЗРЕШЕНО: &quot;
    ElseIf objEntry.AceType = ACCESS_DENIED_ACE_TYPE Then
        strTemp = strTemp &amp; &quot;ЗАПРЕЩЕНО: &quot;
    End If
    &#039;------
    &#039;--- Определение значения маски &quot;Полный доступ&quot; в зависимости от версии ОС
    If intVer &lt; 52 Then
        lngTemp = FULL_ACCESS + Abs(objEntry.AceType - 1) * FLAG_SYNCHRONIZE
        &#039;Выражение FULL_ACCESS + Abs(objEntry.AceType - 1) * FLAG_SYNCHRONIZE
        &#039;учитывает разницу между значениями маски &quot;Полный доступ&quot; у записей разных типов
        &#039;в ОС версий &quot;2000/XP&quot;
    Else
        lngTemp = FULL_ACCESS + FLAG_SYNCHRONIZE
    End If
    &#039;------
    lngMask = objEntry.AccessMask
    Select Case Abs(lngMask)
        Case lngTemp: strTemp = strTemp &amp; &quot;Полный доступ&quot; &amp; vbNewLine
        Case GENERIC_ALL: strTemp = strTemp &amp; &quot;Полный доступ (универсальная маска)&quot; &amp; vbNewLine
        Case Else
            &#039;--- Детальный анализ маски доступа текущей записи:
            &#039;обработка универсальных масок (биты №№ 29 - 31)
            If Abs(lngMask) &gt; lngTemp Then
                For i = 0 To UBound(arrGenericValue)
                    If lngMask And arrGenericValue(i) Then
                        strTemp = strTemp &amp; arrGenericName(i) &amp; vbNewLine &amp; vbTab &amp; &quot;{&quot; &amp; vbNewLine
                        Select Case arrGenericValue(i)
                            Case GENERIC_EXECUTE: arrTemp = arrSieveGE
                            Case GENERIC_WRITE: arrTemp = arrSieveGW
                            Case GENERIC_READ: arrTemp = arrSieveGR
                        End Select
                        For j = 0 To UBound(arrTemp)
                            If arrTemp(j) Then strTemp = strTemp &amp; vbTab &amp; arrFlagName(j) &amp; vbNewLine
                        Next
                        strTemp = strTemp &amp; vbTab &amp; &quot;}&quot; &amp; vbNewLine
                    End If
                Next
            End If
            &#039;обработка обычных масок (биты №№ 0 - 20)
            For i = 0 To UBound(arrFlagValue)
                If lngMask And arrFlagValue(i) Then
                    strTemp = strTemp &amp; arrFlagName(i) &amp; vbNewLine
                End If
            Next
            &#039;------
    End Select
    strTemp = UCase(strPath &amp; &quot; | &quot; &amp; objEntry.Trustee.Domain &amp; &quot;\&quot; &amp; objEntry.Trustee.Name &amp; &quot; | &quot;) &amp; strTemp &amp; vbNewLine
    If intMode = PART_MODE Then
        If StrComp(UCase(objEntry.Trustee.SIDString), strAccSID, vbTextCompare) = 0 Then
            strRes = strRes &amp; strTemp
        End If
    Else
        strRes = strRes &amp; strTemp
    End If
Next
End Function</code></pre></div><p>Самый актуальный вопрос - как сделать это не только для выбранной папки, но и для всех вложенных папок на всех уровнях вложенности...</p>]]></description>
			<author><![CDATA[null@example.com (nostro)]]></author>
			<pubDate>Mon, 22 Oct 2012 06:23:38 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=64958#p64958</guid>
		</item>
		<item>
			<title><![CDATA[Re: VBS: получение списка всех вложенных папок с разрешениями]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=64882#p64882</link>
			<description><![CDATA[<div class="quotebox"><cite>nostro пишет:</cite><blockquote><p>Как получить список разрешений для одной папки я нашел</p></blockquote></div><p>Тогда предлагаю выложить реализацию. Рекурсию сделать не проблема.</p>]]></description>
			<author><![CDATA[null@example.com (Flasher)]]></author>
			<pubDate>Sat, 20 Oct 2012 11:05:15 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=64882#p64882</guid>
		</item>
		<item>
			<title><![CDATA[Re: VBS: получение списка всех вложенных папок с разрешениями]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=64865#p64865</link>
			<description><![CDATA[<p>cacls папка\*</p><br /><p>cmd /q /c &quot;for /r &quot;c:\&quot;&nbsp; %x in (.) do cacls &quot;%~x&quot; 2&gt;&amp;1&quot; &gt; xxx</p>]]></description>
			<author><![CDATA[null@example.com (smaharbA)]]></author>
			<pubDate>Fri, 19 Oct 2012 13:20:46 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=64865#p64865</guid>
		</item>
		<item>
			<title><![CDATA[VBS: получение списка всех вложенных папок с разрешениями]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=64864#p64864</link>
			<description><![CDATA[<p>Начальством дана задача:<br />Получить разрешения из вкладки &quot;Security&quot; для корневой папки и всех подпапок (т.е. если корневая папка сам диск - то для всех папок на диске, и для папок, и для вложенных в них папок, и для папок, вложенных во вложенные папки) и записать все полученное добро в CSV-файл...<br />Как получить список разрешений для одной папки я нашел, а вот как получить список этого добра со ВСЕХ папок, да как это в файл запихнуть, да чтобы экселем открывалось... Буду премного благодарен за любую помощь.</p>]]></description>
			<author><![CDATA[null@example.com (nostro)]]></author>
			<pubDate>Fri, 19 Oct 2012 13:17:28 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=64864#p64864</guid>
		</item>
	</channel>
</rss>
