<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title type="html"><![CDATA[Серый форум &mdash; VBS: изменение DACL записей для папки.]]></title>
	<link rel="self" href="https://forum.script-coding.com/extern.php?action=feed&amp;tid=7730&amp;type=atom" />
	<updated>2012-11-01T12:46:02Z</updated>
	<generator>PunBB</generator>
	<id>https://forum.script-coding.com/viewtopic.php?id=7730</id>
		<entry>
			<title type="html"><![CDATA[Re: VBS: изменение DACL записей для папки.]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=65308#p65308" />
			<content type="html"><![CDATA[<p>Поместил сюда: <a href="http://forum.script-coding.com/viewtopic.php?pid=65307#p65307">VBS &amp; WMI: замена объекта класса Win32_Truste в DACL каталога</a>.</p>]]></content>
			<author>
				<name><![CDATA[Dmitrii]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=13351</uri>
			</author>
			<updated>2012-11-01T12:46:02Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=65308#p65308</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: VBS: изменение DACL записей для папки.]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=65277#p65277" />
			<content type="html"><![CDATA[<p><strong>Dmitrii</strong>, поместите, пожалуйста, и в Коллекцию.</p>]]></content>
			<author>
				<name><![CDATA[alexii]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=1844</uri>
			</author>
			<updated>2012-10-30T20:58:59Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=65277#p65277</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: VBS: изменение DACL записей для папки.]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=65209#p65209" />
			<content type="html"><![CDATA[<p>Не знаю, каков алгоритм работы утилиты <em>SetACL.exe</em>, но уверен, что заменой одного лишь SID дело не ограничивается. Вероятно, она меняет у заданной записи весь объект класса <span style="color: blue">Win32_Trustee</span>.<br />Вот пример того, как такое действие можно выполнить с помощью сценария:<br /></p><div class="codebox"><pre><code>Dim objWsNet, objFS, objWMI
Dim strDomain, strBaseFolder, blnContinue, xResult
Dim strAccountOld, strSIDOld, strAccountNew, strSIDNew

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

&#039;======

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

On Error Resume Next
xRes = 0
Set objSecSettings = objWMIServ.Get(&quot;Win32_LogicalFileSecuritySetting.Path=&#039;&quot; &amp; strDir &amp; &quot;&#039;&quot;)
If Err.Number = 0 Then
    If objSecSettings.GetSecurityDescriptor(objSD) = 0 Then
        If Not IsNull(objSD.DACL) Then
            If Not CBool(objSD.ControlFlags And SE_DACL_PROTECTED) Then blnHasInherited = True
            arrACE = Array(): i = -1: arrLines = Array(): j = -1
            &#039;--- Просмотр исходного DACL и поиск записей,
            &#039;    SID которых соответствует заменяемой &quot;учётке&quot;
            For Each objItem In objSD.DACL
                If Not CBool(objItem.AceFlags And INHERITED_ACE) Then
                    If UCase(objItem.Trustee.SIDString) = strSID1 Then
                        j = j + 1
                        ReDim Preserve arrLines(j)
                        arrLines(j) = i + 1
                    End If
                    i = i + 1
                    ReDim Preserve arrACE(i)
                    Set arrACE(i) = objItem
                End If
            Next
            Set objItem = Nothing
            &#039;------
            If j &gt;= 0 Then
                If blnHasInherited Then
                    &#039;--- Отключение наследования настроек безопасности от &quot;родителя&quot;
                    objSD.ControlFlags = objSD.ControlFlags + SE_DACL_PROTECTED
                    xRes = objSecSettings.SetSecurityDescriptor(objSD)
                    &#039;------
                End If
                If xRes = 0 Then
                    &#039;--- Замена объекта класса &quot;Win32_Trustee&quot; у обрабатываемых записей
                    For j = 0 To UBound(arrLines)
                        Set objSID = objWMI.Get(&quot;Win32_SID.SID=&#039;&quot; &amp; strSID2 &amp; &quot;&#039;&quot;)
                        Set objTrustee = objWMIServ.Get(&quot;Win32_Trustee&quot;).Spawninstance_
                        objTrustee.Domain = strDom
                        objTrustee.Name = strSAN2
                        objTrustee.SID = objSID.BinaryRepresentation
                        objTrustee.SidLength = objSID.SidLength
                        objTrustee.SIDString = strSID2
                        Set objSID = Nothing
                        arrACE(arrLines(j)).Trustee = objTrustee
                        Set objTrustee = Nothing
                    Next
                    &#039;------
                    objSD.DACL = arrACE &#039;собственно изменение DACL
                    Erase arrACE: Erase arrLines
                    &#039;--- Включение наследования настроек безопасности от &quot;родителя&quot;, если первоначально оно было включено
                    If blnHasInherited Then objSD.ControlFlags = objSD.ControlFlags - SE_DACL_PROTECTED
                    &#039;------
                    &#039;--- Итоговое сохраненение изменений, внесённых в дескриптор безопасности
                    xRes = objSecSettings.SetSecurityDescriptor(objSD)
                    Select Case xRes
                        Case 0: xRes = &quot;успешное завершение&quot;
                        Case 2: xRes = &quot;не удалось сохранить изменения DACL (доступ запрещён)&quot;
                        Case 5, 9: xRes = &quot;не удалось сохранить изменения DACL (для выполнения операции недостаточно полномочий)&quot;
                        Case 21: xRes = &quot;не удалось сохранить изменения DACL (заданы недопустимые значения параметров)&quot;
                        Case Else: xRes = &quot;не удалось сохранить изменения DACL (неизвестная ошибка)&quot;
                    End Select
                    &#039;------
                Else
                    xRes = &quot;не удалось отключить наследование безопасности&quot;
                End If
            Else
                xRes = &quot;не обнаружено не унаследованных записей исходного объекта&quot;
            End If
        Else
            xRes = &quot;список управления доступом пуст&quot;
        End If
    Else
        xRes = &quot;не удалось прочитать дескриптор безопасности объекта&quot;
    End If
    Set objSD = Nothing
    Set objSecSettings = Nothing
Else
    xRes = &quot;ошибка &quot; &amp; CStr(Err.Number) &amp; vbNewLine &amp; Err.Description
    Err.Clear
End If
On Error GoTo 0
Change_Trustee = xRes
End Function</code></pre></div>]]></content>
			<author>
				<name><![CDATA[Dmitrii]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=13351</uri>
			</author>
			<updated>2012-10-29T11:40:20Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=65209#p65209</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: VBS: изменение DACL записей для папки.]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=65160#p65160" />
			<content type="html"><![CDATA[<div class="quotebox"><blockquote><p>данная утилита позволяет сменить SID учетки не трогая разрешения.</p></blockquote></div><p>Вы путаете. Она <em>может</em> убрать разрешения для одной учётной записи и добавить аналогичные для другой.</p>]]></content>
			<author>
				<name><![CDATA[alexii]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=1844</uri>
			</author>
			<updated>2012-10-26T21:42:09Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=65160#p65160</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: VBS: изменение DACL записей для папки.]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=65138#p65138" />
			<content type="html"><![CDATA[<p>Все, вопрос решил утилитой для командной строки - SetACL.exe, данная утилита позволяет сменить SID учетки не трогая разрешения. Всем огромное спасибо!</p>]]></content>
			<author>
				<name><![CDATA[nostro]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=27296</uri>
			</author>
			<updated>2012-10-26T13:05:02Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=65138#p65138</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: VBS: изменение DACL записей для папки.]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=65134#p65134" />
			<content type="html"><![CDATA[<div class="quotebox"><cite>nostro пишет:</cite><blockquote><p>... Чтобы выгрузить список в файл, спокойно его обработать в том же экселе...</p></blockquote></div><p>Что именно хотите сделать?<br /></p><div class="quotebox"><cite>nostro пишет:</cite><blockquote><p>... а потом восстановить разрешения?</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>2012-10-26T06:43:40Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=65134#p65134</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: VBS: изменение DACL записей для папки.]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=65133#p65133" />
			<content type="html"><![CDATA[<p>А нет ли какого-то аналога icacls? Чтобы выгрузить список в файл, спокойно его обработать в том же экселе, а потом восстановить разрешения?</p>]]></content>
			<author>
				<name><![CDATA[nostro]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=27296</uri>
			</author>
			<updated>2012-10-26T05:24:10Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=65133#p65133</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: VBS: изменение DACL записей для папки.]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=65115#p65115" />
			<content type="html"><![CDATA[<p>Нельзя.</p>]]></content>
			<author>
				<name><![CDATA[Dmitrii]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=13351</uri>
			</author>
			<updated>2012-10-25T15:56:18Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=65115#p65115</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[VBS: изменение DACL записей для папки.]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=65091#p65091" />
			<content type="html"><![CDATA[<p>Доброго времени суток! Скажите, я вот нашел скрипт по изменению DACL записей для папки:<br /><a href="http://forum.script-coding.com/viewtopic.php?id=5142">http://forum.script-coding.com/viewtopic.php?id=5142</a><br />Но там берется учетная запись и для неё изменяются права доступа. Нельзя ли как-то не трогая права изменить учетку (например с domain1\usr1 на domain2\user-1)?</p>]]></content>
			<author>
				<name><![CDATA[nostro]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=27296</uri>
			</author>
			<updated>2012-10-25T13:23:16Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=65091#p65091</id>
		</entry>
</feed>
