<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title type="html"><![CDATA[Серый форум &mdash; VBScript: Сохранить DACL общего ресурса]]></title>
	<link rel="self" href="https://forum.script-coding.com/extern.php?action=feed&amp;tid=7008&amp;type=atom" />
	<updated>2012-04-03T03:33:47Z</updated>
	<generator>PunBB</generator>
	<id>https://forum.script-coding.com/viewtopic.php?id=7008</id>
		<entry>
			<title type="html"><![CDATA[Re: VBScript: Сохранить DACL общего ресурса]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=58764#p58764" />
			<content type="html"><![CDATA[<p>Не буду с вами спорить, ваш метод надежнее, если честно мне просто лень было обработку для массива добавить <img src="//forum.script-coding.com/img/smilies/smile.png" width="15" height="15" /></p>]]></content>
			<author>
				<name><![CDATA[Vasek]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=27769</uri>
			</author>
			<updated>2012-04-03T03:33:47Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=58764#p58764</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: VBScript: Сохранить DACL общего ресурса]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=58730#p58730" />
			<content type="html"><![CDATA[<p>Я если о чём и спорю, так лишь о том, насколько надёжно полагаться на автозаполнение свойства <strong><span style="color: blue">SID</span></strong> класса <span style="color: blue">Win32_Trustee</span>.<br />С моей точки зрения,- ненадёжно. Поэтому я, как уже указывал, предпочитаю по возможности избегать в сценариях таких решений.<br />Вот, собственно, и всё.</p>]]></content>
			<author>
				<name><![CDATA[Dmitrii]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=13351</uri>
			</author>
			<updated>2012-04-02T05:22:51Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=58730#p58730</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: VBScript: Сохранить DACL общего ресурса]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=58551#p58551" />
			<content type="html"><![CDATA[<p>Вообщем я так понял мы просто начали спорить про разные методы для которых на вход нужно подать разные параметры для правильной работы. Вы так не считаете?</p>]]></content>
			<author>
				<name><![CDATA[Vasek]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=27769</uri>
			</author>
			<updated>2012-03-29T12:20:51Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=58551#p58551</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: VBScript: Сохранить DACL общего ресурса]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=58550#p58550" />
			<content type="html"><![CDATA[<p>Да пардон увидел в wbemtest что в SetShareInfo есть Access но внутрь не заглянул, странно там в обоих методах есть object:Win32_SecurityDescriptor, о вроде нашел отличия в методе&nbsp; SetShareInfo в заполнении параметра Access обязательно нужно указывать свойство &quot;BinaryRepresentation&quot; а вот в методе SetSecurityDescriptor это не обязательно, как раз из-за этого это параметр и генерируется сам. К сожалению такой ОС у меня под рукой нет &quot;ОС 2000 Pro + SP4&quot;. На остальных ОС мой пример работает.<br />&nbsp; &nbsp; У вас мой последний пример не работает?</p>]]></content>
			<author>
				<name><![CDATA[Vasek]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=27769</uri>
			</author>
			<updated>2012-03-29T12:17:20Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=58550#p58550</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: VBScript: Сохранить DACL общего ресурса]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=58548#p58548" />
			<content type="html"><![CDATA[<div class="quotebox"><cite>Vasek пишет:</cite><blockquote><p>В вашем примере вы подразумеваете что общая папка есть или нет...</p></blockquote></div><p>Есть.</p><div class="quotebox"><cite>Vasek пишет:</cite><blockquote><p>... Если общая папка не создана зачем вы патаетесь ее найти...</p></blockquote></div><p>Затем, что имею привычку проверять наличие объекта перед попыткой выполнения с ним каких-либо действий.</p><div class="quotebox"><cite>Vasek пишет:</cite><blockquote><p>... я использую другие методы...</p></blockquote></div><p>В данном случае это неважно. Было лишь продемонстрировано утверждение о том, что есть ситуации, в которых автогенерация значения свойства <strong><span style="color: blue">SID</span></strong> класса <span style="color: blue">Win32_Trustee</span> может и не выполняться.<br />Я, например, предпочитаю по возможности такие ситуации учитывать.</p><div class="quotebox"><cite>Vasek пишет:</cite><blockquote><p>... метод &quot;SetShareInfo&quot; не для этого нужен...</p></blockquote></div><p>На основании чего сделан такой вывод?</p><br /><div class="quotebox"><cite>Vasek пишет:</cite><blockquote><p>... в этом методе нет входного параметра дескриптора безопасности который вы ему подставляете...</p></blockquote></div><p>Ошибаетесь: <a href="http://msdn.microsoft.com/ru-ru/library/aa393598">SetShareInfo method of the Win32_Share Class</a></p><br /><div class="quotebox"><cite>Vasek пишет:</cite><blockquote><p>И еще без контрольного флага дискриптор не запишется...</p></blockquote></div><p>Вновь ошибаетесь.<br />Добавьте оператор <strong><span style="color: green">objSD.ControlFlags = 32772</span></strong> перед или после оператора <span style="color: green">objSD.DACL = Array(objACE)</span>, но оставьте закомментированным оператор <span style="color: green">objTrustee.SID = objSID.BinaryRepresentation</span>.<br />Результат работы сценария не изменится.</p><div class="quotebox"><cite>Vasek пишет:</cite><blockquote><p>Ваш пример в рабочем состоянии...</p></blockquote></div><p>Мой пример вполне работоспособен в своём исходном виде, но с действующим оператором<br /><strong><span style="color: blue">objTrustee.SID = objSID.BinaryRepresentation</span></strong>.<br />Это многократно проверено на практике для набора ОС 2000 Pro + SP4/XP Pro + SP3/2003R2 + SP1(2)/2008 + SP1(2)/7 Pro + SP1.<br />Если исключить указанный оператор из кода, то работоспособность сценария сохранится без изменений на &quot;осях&quot;, более новых, чем&nbsp; 2003R2.<br />В 2000 система не сможет добавить в DACL заданную запись (сообщит, что соответствующая &quot;учётка&quot; не найдена), но добавит &quot;умолчальные&quot; записи локальной системы и группы локальных администраторов.<br />В XP - 2003 - DACL станет пустым (о чём и будет сообщено).</p>]]></content>
			<author>
				<name><![CDATA[Dmitrii]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=13351</uri>
			</author>
			<updated>2012-03-29T11:31:51Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=58548#p58548</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: VBScript: Сохранить DACL общего ресурса]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=58541#p58541" />
			<content type="html"><![CDATA[<p>alexii, Dmitrii,<br />Хороший у вас форум. Спасибо что тратите на меня свое время. Спасибо что помогаете.</p>]]></content>
			<author>
				<name><![CDATA[Vasek]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=27769</uri>
			</author>
			<updated>2012-03-29T08:22:44Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=58541#p58541</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: VBScript: Сохранить DACL общего ресурса]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=58539#p58539" />
			<content type="html"><![CDATA[<p>Dmitrii,</p><p>1.&nbsp; В вашем примере вы подразумеваете что общая папка есть или нет. Если общая папка не создана зачем вы патаетесь ее найти. Если есть то я использую другие методы&nbsp; SetSecurityDescriptor метод &quot;SetShareInfo&quot; не для этого нужен, а именно у вас SetShareInfo(Null, Null, objSD) - расписываю входные показатели wbemtest SetShareInfo(Access,Discription,MaximumAllowed) - даже если они не по алфавиту в этом методе нет входного параметра дескриптора безопасности который вы ему подставляете. А вот у метода SetSecurityDescriptor как раз на вход есть параметр &quot;Descriptor&quot;. И еще без контрольного флага дискриптор не запишется objSD.ControlFlags.</p><p>Ваш пример в рабочем состоянии:<br /></p><div class="codebox"><pre><code>
Dim objWMI, objCollection, objItem, objWSNet, objFS
Dim objSD, objSID, objTrustee, objACE, objShare
Dim strDomain, strComputer, strUser, strUserSID, blnHasACE
Const FULL_ACCESS = 2032127
Const ACCESS_ALLOWED = 0
Const strShareName = &quot;Temp&quot;
Const strSharePath = &quot;C:\Temp&quot;
 
Set objWSNet = CreateObject(&quot;WScript.Network&quot;)
strDomain = objWSNet.UserDomain
strComputer = objWSNet.ComputerName
strUser = objWSNet.UserName
Set objWSNet = Nothing
Set objFS = CreateObject(&quot;Scripting.FileSystemObject&quot;)
If objFS.FolderExists(strSharePath) Then
    Set objWMI = GetObject(&quot;winmgmts:{impersonationLevel=impersonate}!\\&quot; &amp; strComputer &amp; &quot;\root\CIMV2&quot;)
    Set objCollection = objWMI.ExecQuery(&quot;SELECT SID FROM Win32_UserAccount WHERE Domain=&#039;&quot; &amp; strDomain &amp; &quot;&#039; AND Name=&#039;&quot; &amp; strUser &amp; &quot;&#039;&quot;)
    If objCollection.Count &gt; 0 Then
        For Each objItem In objCollection
            strUserSID = objItem.SID
        Next
        Set objCollection = Nothing
        Set objSID = objWMI.Get(&quot;Win32_SID.SID=&#039;&quot; &amp; strUserSID &amp; &quot;&#039;&quot;)
        Set objTrustee = objWMI.Get(&quot;Win32_Trustee&quot;).SpawnInstance_
        objTrustee.Domain = strDomain
        objTrustee.Name = strUser
        &#039;objTrustee.SID = objSID.BinaryRepresentation
        objTrustee.SidLength = objSID.SidLength
        objTrustee.SIDString = strUserSID
        Set objSID = Nothing                            
        Set objACE = objWMI.Get(&quot;Win32_Ace&quot;).SpawnInstance_
        objACE.AccessMask = FULL_ACCESS
        objACE.AceFlags = 3
        objACE.AceType = ACCESS_ALLOWED
        objACE.Trustee = objTrustee
        Set objTrustee = Nothing
        Set objSD = objWMI.Get(&quot;Win32_SecurityDescriptor&quot;).SpawnInstance_
        objSD.DACL = Array(objACE)
&#039;        Set objACE = Nothing
		

		
&#039;        On Error Resume Next
        Set objShare = objWMI.Get(&quot;Win32_Share.Name=&#039;&quot; &amp; strShareName &amp; &quot;&#039;&quot;)
        If Err.Number = 0 Then

			objSD.ControlFlags = 32772
		
			Set objShareSecSetting = objWMI.Get(&quot;Win32_LogicalShareSecuritySetting.Name=&#039;&quot; + strShareName + &quot;&#039;&quot;)
		
			returnval = objShareSecSetting.SetSecurityDescriptor(objSD)

            &#039;intResult = objShare.SetShareInfo(Null, Null, objSD)
            Select Case intResult
                Case 0
                    Wscript.Echo &quot;DACL для SMB-разрешения изменён.&quot;
                    Set objSecSettings = objWMI.Get(&quot;Win32_LogicalShareSecuritySetting.Name=&#039;&quot; &amp; strShareName &amp; &quot;&#039;&quot;)
                    If Err.Number = 0 Then
                        If objSecSettings.GetSecurityDescriptor(objSD) = 0 Then
                            If IsNull(objSD.DACL) Then
                                WScript.Echo &quot;Список управления доступом пуст.&quot;
                            Else
                                For Each objACE In objSD.DACL
                                    If StrComp(objACE.Trustee.Domain, strDomain, vbTextCompare) = 0 AND StrComp(objACE.Trustee.Name, strUser, vbTextCompare) = 0 Then
                                        WScript.Echo UCase(objACE.Trustee.Domain &amp; &quot;\&quot; &amp; objACE.Trustee.Name) &amp; vbNewLine &amp; objACE.Trustee.SIDString
                                        If IsArray(objACE.Trustee.SID) Then
                                            WScript.Echo &quot;Размерность массива objACE.Trustee.SID = [ &quot; &amp; LBound(objACE.Trustee.SID) &amp; &quot; - &quot; &amp; UBound(objACE.Trustee.SID) &amp; &quot; ]&quot;
                                        Else
                                            WScript.Echo &quot;Значение свойства objACE.Trustee.SID не определено.&quot;
                                        End If
                                        blnHasACE = True
                                        Exit For
                                    End If
                                Next
                                If Not blnHasACE Then WScript.Echo &quot;Запись объекта &quot; &amp; UCase(strDomain &amp; &quot;\&quot; &amp; strUser) &amp; &quot; не найдена.&quot;
                            End If
                        Else
                            WScript.Echo &quot;Не удалось прочитать дескриптор безопасности.&quot;
                        End If
                    Else
                        WScript.Echo &quot;Ошибка &quot; &amp; Err.Number &amp; vbNewLine &amp; Err.Description
                        Err.Clear
                    End If
                Case 2: Wscript.Echo &quot;Доступ к объекту запрещён.&quot;
                Case 8: Wscript.Echo &quot;Неизвестная ошибка.&quot;
                Case 9: Wscript.Echo &quot;Неверное имя.&quot;
                Case 10: Wscript.Echo &quot;Неверный уровень.&quot;
                Case 21: Wscript.Echo &quot;Неверный параметр.&quot;
                Case 22: Wscript.Echo &quot;Попытка создания дубликата ресурса.&quot;
                Case 23: Wscript.Echo &quot;Перенаправленный путь.&quot;
                Case 24: Wscript.Echo &quot;Неизвестное устройство или путь.&quot;
                Case 25: Wscript.Echo &quot;Сетевое имя не найдено.&quot;
            End Select
            Set objShare = Nothing
        Else
            Err.Clear
            Wscript.Echo &quot;Объект типа ОБЩАЯ ПАПКА не найден.&quot;
        End If
        On Error GoTo 0
        Set objSD = Nothing
    Else
        Wscript.Echo &quot;Не обнаружена учётная запись пользователя &quot; &amp; UCase(strUser)
    End If
Else
    WScript.Echo &quot;Путь &quot; &amp; UCase(strSharePath) &amp; &quot; не найден.&quot;
End If
Set objWMI = Nothing
Set objFS = Nothing
WScript.Quit 0</code></pre></div><p>Пишите с вами интересно пообщаться.</p>]]></content>
			<author>
				<name><![CDATA[Vasek]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=27769</uri>
			</author>
			<updated>2012-03-29T07:53:56Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=58539#p58539</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: VBScript: Сохранить DACL общего ресурса]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=58531#p58531" />
			<content type="html"><![CDATA[<div class="quotebox"><cite>Vasek пишет:</cite><blockquote><p>1. В селдующий раз буду точнее задавать название теме.</p></blockquote></div><p><span style="color: Green">Не стоит ждать следующего раза, можно сделать сие прямо сейчас. Под каждым Вашим сообщением есть ссылка «Редактировать», в том числе и под самым первым сообщением темы. При его редактировании станет возможным изменение заголовка темы в нужную сторону.</span></p>]]></content>
			<author>
				<name><![CDATA[alexii]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=1844</uri>
			</author>
			<updated>2012-03-29T02:25:01Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=58531#p58531</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: VBScript: Сохранить DACL общего ресурса]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=58514#p58514" />
			<content type="html"><![CDATA[<div class="quotebox"><cite>Vasek пишет:</cite><blockquote><p>... несколько сценариев нужно для того чтобы восстановить DACL более раннего своего состояния, бывает спахватишся а он переписался...</p></blockquote></div><p>Для этого, как раз, вполне достаточно хранить несколько файлов с данными, а обрабатывать их одним универсальным сценарием. Впрочем, это лишь мои личные предпочтения.</p><div class="quotebox"><cite>Vasek пишет:</cite><blockquote><p>4. По поводу &quot;соответствующих объектов может уже не существовать&quot; - пусть остаются не олицетворенные SID &lt;...&gt;<br />5. Если есть записаная целая структура &lt;...&gt; зачем лечить &lt;...&gt; если можно быстро восстановить.</p></blockquote></div><p>Дело, разумеется, хозяйское. Но Вы не учитываете того, что не всегда приемлем подобный подход, а сценарий выкладываете в общее пользование без соответствующих комментариев.<br />Советую их сделать, чтобы какому-нибудь начинающему &quot;сисадмину&quot; в один злосчастный момент не стало весьма досадно за то, что он не учёл этих деталей при использовании данной технологии.</p><div class="quotebox"><cite>Vasek пишет:</cite><blockquote><p>3. По поводу uint8 SID, на сколько я помню он генерировался при создании экземпляра автоматически...</p></blockquote></div><p>Это утверждение для ряда ситуаций является ложным. Например, XP и 2003 (включая R2) такую автогенерацию выполняют не всегда. Приведу сценарий, результат работы которого на указанных версиях ОС иллюстрирует моё утверждение.<br /></p><div class="codebox"><pre><code>
Dim objWMI, objCollection, objItem, objWSNet, objFS
Dim objSD, objSID, objTrustee, objACE, objShare
Dim strDomain, strComputer, strUser, strUserSID, blnHasACE
Const FULL_ACCESS = 2032127
Const ACCESS_ALLOWED = 0
Const strShareName = &quot;Temp&quot;
Const strSharePath = &quot;C:\Temp&quot;

Set objWSNet = CreateObject(&quot;WScript.Network&quot;)
strDomain = objWSNet.UserDomain
strComputer = objWSNet.ComputerName
strUser = objWSNet.UserName
Set objWSNet = Nothing
Set objFS = CreateObject(&quot;Scripting.FileSystemObject&quot;)
If objFS.FolderExists(strSharePath) Then
	Set objWMI = GetObject(&quot;winmgmts:{impersonationLevel=impersonate}!\\&quot; &amp; strComputer &amp; &quot;\root\CIMV2&quot;)
	Set objCollection = objWMI.ExecQuery(&quot;SELECT SID FROM Win32_UserAccount WHERE Domain=&#039;&quot; &amp; strDomain &amp; &quot;&#039; AND Name=&#039;&quot; &amp; strUser &amp; &quot;&#039;&quot;)
	If objCollection.Count &gt; 0 Then
		For Each objItem In objCollection
			strUserSID = objItem.SID
		Next
		Set objCollection = Nothing
		Set objSID = objWMI.Get(&quot;Win32_SID.SID=&#039;&quot; &amp; strUserSID &amp; &quot;&#039;&quot;)
		Set objTrustee = objWMI.Get(&quot;Win32_Trustee&quot;).SpawnInstance_
		objTrustee.Domain = strDomain
		objTrustee.Name = strUser
		&#039;objTrustee.SID = objSID.BinaryRepresentation
		objTrustee.SidLength = objSID.SidLength
		objTrustee.SIDString = strUserSID
		Set objSID = Nothing							
		Set objACE = objWMI.Get(&quot;Win32_Ace&quot;).SpawnInstance_
		objACE.AccessMask = FULL_ACCESS
		objACE.AceFlags = 3
		objACE.AceType = ACCESS_ALLOWED
		objACE.Trustee = objTrustee
		Set objTrustee = Nothing
		Set objSD = objWMI.Get(&quot;Win32_SecurityDescriptor&quot;).SpawnInstance_
		objSD.DACL = Array(objACE)
        Set objACE = Nothing
		On Error Resume Next
		Set objShare = objWMI.Get(&quot;Win32_Share.Name=&#039;&quot; &amp; strShareName &amp; &quot;&#039;&quot;)
        If Err.Number = 0 Then
            intResult = objShare.SetShareInfo(Null, Null, objSD)
            Select Case intResult
                Case 0
					Wscript.Echo &quot;DACL для SMB-разрешения изменён.&quot;
					Set objSecSettings = objWMI.Get(&quot;Win32_LogicalShareSecuritySetting.Name=&#039;&quot; &amp; strShareName &amp; &quot;&#039;&quot;)
					If Err.Number = 0 Then
						If objSecSettings.GetSecurityDescriptor(objSD) = 0 Then
							If IsNull(objSD.DACL) Then
								WScript.Echo &quot;Список управления доступом пуст.&quot;
							Else
								For Each objACE In objSD.DACL
									If StrComp(objACE.Trustee.Domain, strDomain, vbTextCompare) = 0 AND StrComp(objACE.Trustee.Name, strUser, vbTextCompare) = 0 Then
										WScript.Echo UCase(objACE.Trustee.Domain &amp; &quot;\&quot; &amp; objACE.Trustee.Name) &amp; vbNewLine &amp; objACE.Trustee.SIDString
										If IsArray(objACE.Trustee.SID) Then
											WScript.Echo &quot;Размерность массива objACE.Trustee.SID = [ &quot; &amp; LBound(objACE.Trustee.SID) &amp; &quot; - &quot; &amp; UBound(objACE.Trustee.SID) &amp; &quot; ]&quot;
										Else
											WScript.Echo &quot;Значение свойства objACE.Trustee.SID не определено.&quot;
										End If
										blnHasACE = True
										Exit For
									End If
								Next
								If Not blnHasACE Then WScript.Echo &quot;Запись объекта &quot; &amp; UCase(strDomain &amp; &quot;\&quot; &amp; strUser) &amp; &quot; не найдена.&quot;
							End If
						Else
							WScript.Echo &quot;Не удалось прочитать дескриптор безопасности.&quot;
						End If
					Else
						WScript.Echo &quot;Ошибка &quot; &amp; Err.Number &amp; vbNewLine &amp; Err.Description
						Err.Clear
					End If
                Case 2: Wscript.Echo &quot;Доступ к объекту запрещён.&quot;
                Case 8: Wscript.Echo &quot;Неизвестная ошибка.&quot;
                Case 9: Wscript.Echo &quot;Неверное имя.&quot;
                Case 10: Wscript.Echo &quot;Неверный уровень.&quot;
                Case 21: Wscript.Echo &quot;Неверный параметр.&quot;
                Case 22: Wscript.Echo &quot;Попытка создания дубликата ресурса.&quot;
                Case 23: Wscript.Echo &quot;Перенаправленный путь.&quot;
                Case 24: Wscript.Echo &quot;Неизвестное устройство или путь.&quot;
                Case 25: Wscript.Echo &quot;Сетевое имя не найдено.&quot;
            End Select
            Set objShare = Nothing
        Else
			Err.Clear
            Wscript.Echo &quot;Объект типа ОБЩАЯ ПАПКА не найден.&quot;
        End If
		On Error GoTo 0
        Set objSD = Nothing
	Else
		Wscript.Echo &quot;Не обнаружена учётная запись пользователя &quot; &amp; UCase(strUser)
	End If
Else
	WScript.Echo &quot;Путь &quot; &amp; UCase(strSharePath) &amp; &quot; не найден.&quot;
End If
Set objWMI = Nothing
Set objFS = Nothing
WScript.Quit 0</code></pre></div>]]></content>
			<author>
				<name><![CDATA[Dmitrii]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=13351</uri>
			</author>
			<updated>2012-03-28T12:13:22Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=58514#p58514</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: VBScript: Сохранить DACL общего ресурса]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=58487#p58487" />
			<content type="html"><![CDATA[<p>Спасибо за советы, <br />1. В селдующий раз буду точнее задавать название теме.<br />2. По поводу избыточного способа решения задачи это было сделано не только для разрабочика но и для рядового специалиста, чтобы у него не составило не какого труда разобраться со готовым сценарием, несколько сценариев нужно для того чтобы восстановить DACL более раннего своего состояния, бывает спахватишся а он переписался <img src="//forum.script-coding.com/img/smilies/smile.png" width="15" height="15" />.<br />3. По поводу uint8 SID, на сколько я помню он генерировался при создании экземпляра автоматически.<br />4. По поводу &quot;соответствующих объектов может уже не существовать&quot; - пусть остаются не олицетворенные SID это мне кажется проще делать ручками или дополнительным сценарием. Здесь цель восстановить предыдущее состояние и не чего не потерять.<br />5. Если есть записаная целая структура, прощее ее восстановить с нуля(создается новый DACL), бывает что все общие папки есть а доступа нет, не однократно сталкивался с такой проблемой, перезагружаешь службу сервер ситуация остается таже(конечно зависит от Шифровалки), зачем лечить(найти ошибку которую сделала шифровалка в DACL очень сложо) если можно быстро восстановить.</p>]]></content>
			<author>
				<name><![CDATA[Vasek]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=27769</uri>
			</author>
			<updated>2012-03-28T01:48:04Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=58487#p58487</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: VBScript: Сохранить DACL общего ресурса]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=58429#p58429" />
			<content type="html"><![CDATA[<div class="quotebox"><cite>Dmitrii пишет:</cite><blockquote><p>1. Фраза &quot;... резервные копии общих ресурсов на сервере...&quot; вводит в заблуждение. Ожидается, что предложенный сценарий будет выполнять копирование содержимого папок общего доступа…</p></blockquote></div><p>Точно! Я именно так и понял.</p>]]></content>
			<author>
				<name><![CDATA[alexii]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=1844</uri>
			</author>
			<updated>2012-03-26T23:12:58Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=58429#p58429</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: VBScript: Сохранить DACL общего ресурса]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=58392#p58392" />
			<content type="html"><![CDATA[<p>Проверил на XP Pro+SP3 (впрочем, не особенно тщательно). Работает.<br />Однако предложу несколько советов.</p><p>1. Фраза &quot;... резервные копии общих ресурсов на сервере...&quot; вводит в заблуждение. Ожидается, что предложенный сценарий будет выполнять копирование содержимого папок общего доступа, а на деле выполняется сохранение информации о составе и DACL SMB-разрешений этих папок.</p><p>2. По-моему, Вы выбрали избыточный способ решения задачи.<br />Думается, что вполне достаточно иметь один сценарий восстановления набора (и, соответственно, DACL) общих ресурсов, которому в качестве входных данных &quot;скармливать&quot; сохранённые в виде файла данные заведомо известной структуры. Причём все необходимые сведения о каждой папке я бы постарался уместить в одной строке.</p><p>3. SID записей в ACL (а, следовательно, и их байтовые длины) сохранять не стоит, т.к. соответствующих объектов может уже не существовать на момент процедуры восстановления. Здесь вполне достаточно иметь пару значений в формате &quot;Domain\Name&quot;, для которой уже и получать &quot;на лету&quot; необходимые сведения о SID. Такой подход вполне можно использовать даже по отношению к &quot;хорошо известным идентификаторам безопасности&quot;.<br />Можно, конечно, применить и комбинированный вариант.</p><p>4. Вы забыли, что для корректно созданного экземпляра класса &quot;Win32_Trustee&quot; следовало бы заполнить свойство<br /><strong>uint8 <span style="color: blue">SID</span>[]</strong>.</p><p>5. В процессе восстановления я бы не стал предварительно удалять всю информацию о существующей на текущий момент структуре общих папок. Думается, что корректнее будет восстановить лишь то, что отсутствует (ну, может быть, ещё проверить корректность ACL действующих ресурсов).<br />Впрочем, вариант &quot;всё удалить, а потом заново создать&quot;, конечно, проще.</p>]]></content>
			<author>
				<name><![CDATA[Dmitrii]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=13351</uri>
			</author>
			<updated>2012-03-26T12:11:17Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=58392#p58392</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[VBScript: Сохранить DACL общего ресурса]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=58390#p58390" />
			<content type="html"><![CDATA[<p>Предлагаю для тестирования сценарий, с помощью которого можно делать резервные копии общих ресурсов на сервере. Иногда бывает так что зашифрованный диск подключается, а общие ресурсы не восстанавливаются. Для нормальной работы потребуется создать папки для сохранения файлов резервных копий, в моем примере это c:\scripts\shares\&quot; + dir + &quot;\<br />&nbsp; &nbsp; dir - это 1.Пн;2.Вт;3.Ср;4.Чт;5.Пт;6.Сб;7.ВС<br />Создать задание выполнения этого сценария ежедневно - cscript c:\scripts\shares_backup.vbs</p><p>Сценари shares_backup.vbs<br /></p><div class="codebox"><pre><code>
WeekDayNumber = WeekDay(Now, vbMonday)

If WeekDayNumber = 1 Then
	dir=&quot;1.Пн&quot;
ElseIf WeekDayNumber = 2 Then
	dir=&quot;2.Вт&quot;
ElseIf WeekDayNumber = 3 Then
	dir=&quot;3.Ср&quot;
ElseIf WeekDayNumber = 4 Then
	dir=&quot;4.Чт&quot;
ElseIf WeekDayNumber = 5 Then
	dir=&quot;5.Пт&quot;
ElseIf WeekDayNumber = 6 Then
	dir=&quot;6.Сб&quot;
ElseIf WeekDayNumber = 7 Then
	dir=&quot;7.ВС&quot;
End If

Set fso = WScript.CreateObject(&quot;Scripting.FileSystemObject&quot;)
Set oWMI = GetObject(&quot;winmgmts:&quot;)
Set oShares = oWMI.ExecQuery(&quot;select Name,Path from Win32_Share where Type=0&quot;) 
Set OpenLogFile = Fso.OpenTextFile(&quot;c:\scripts\shares\&quot; + dir + &quot;\Recover_Shares.vbs&quot;,2,True,-2)

n = 0
On Error Resume Next
For Each oShare In oShares

	Set oShareSecSetting = GetObject(&quot;winmgmts:Win32_LogicalShareSecuritySetting.Name=&#039;&quot; + oShare.Name + &quot;&#039;&quot;) 
	iRC = oShareSecSetting.GetSecurityDescriptor(oSecurityDescriptor) 
	aDACL = oSecurityDescriptor.DACL
	myArray = myArray + &quot;,&quot; + Chr(34) + oShare.Name + Chr(34)
	myArray1 = myArray1 + &quot;,&quot; + cstr(oSecurityDescriptor.ControlFlags)
	myArray10 = myArray10 + &quot;,&quot; + Chr(34) + oShare.Path + Chr(34)
	myArray2 = &quot;&quot;
	myArray3 = &quot;&quot;
	myArray4 = &quot;&quot;
	myArray5 = &quot;&quot;
	myArray6 = &quot;&quot;
	myArray7 = &quot;&quot;
	myArray8 = &quot;&quot;

	For Each oAce In aDACL
		myArray2 = myArray2 + &quot;,&quot; + cstr(oAce.AccessMask)
		myArray3 = myArray3 + &quot;,&quot; + cstr(oAce.AceType)
		myArray4 = myArray4 + &quot;,&quot; + cstr(oAce.AceFlags)
		Set oTrustee = oAce.Trustee
		If not isNull(oTrustee.Domain) Then
			myArray5 = myArray5 + &quot;,&quot; + Chr(34) + oTrustee.Domain + Chr(34)
		Else
			myArray5 = myArray5 + &quot;,&quot; + Chr(34) + &quot;Null&quot; + Chr(34)
		End If
		If not isNull(oTrustee.Name) Then
			myArray6 = myArray6 + &quot;,&quot; + Chr(34) + oTrustee.Name + Chr(34)
		Else 
			myArray6 = myArray6 + &quot;,&quot; + Chr(34) + &quot;Null&quot; + Chr(34)
		End If
		myArray7 = myArray7 + &quot;,&quot; + cstr(oAce.Trustee.SidLength)
		myArray8 = myArray8 + &quot;,&quot; + Chr(34) + oAce.Trustee.SIDString + Chr(34)
		myArray9 = myArray9 + &quot;,&quot; + Chr(34) + oAce.Trustee.SIDString + Chr(34)
	Next
	
	myArrayA = Mid(myArray,2,len(myArray) - 1)
	myArrayA1 = Mid(myArray1,2,len(myArray1) - 1)
	myArrayA10 = Mid(myArray10,2,len(myArray10) - 1)
	myArrayA2 = Mid(myArray2,2,len(myArray2) - 1)
	myArrayA3 = Mid(myArray3,2,len(myArray3) - 1)
	myArrayA4 = Mid(myArray4,2,len(myArray4) - 1)
	myArrayA5 = Mid(myArray5,2,len(myArray5) - 1)
	myArrayA6 = Mid(myArray6,2,len(myArray6) - 1)
	myArrayA7 = Mid(myArray7,2,len(myArray7) - 1)
	myArrayA8 = Mid(myArray8,2,len(myArray8) - 1)
	myArrayU = myArrayU + &quot;,ArrAMask&quot; + cstr(n)
	myArrayU1 = myArrayU1 + &quot;,ArrAType&quot; + cstr(n)
	myArrayU2 = myArrayU2 + &quot;,ArrAFlags&quot; + cstr(n)
	myArrayU3 = myArrayU3 + &quot;,ArrADom&quot; + cstr(n)
	myArrayU4 = myArrayU4 + &quot;,ArrAName&quot; + cstr(n)
	myArrayU5 = myArrayU5 + &quot;,ArrATrSidL&quot; + cstr(n)
	myArrayU6 = myArrayU6 + &quot;,ArrATrSIDStr&quot; + cstr(n)
	OpenLogFile.WriteLine &quot;ArrAMask&quot; + cstr(n) + &quot; = Array(&quot; + myArrayA2 + &quot;)&quot;
	OpenLogFile.WriteLine &quot;ArrAType&quot; + cstr(n) + &quot; = Array(&quot; + myArrayA3 + &quot;)&quot;
	OpenLogFile.WriteLine &quot;ArrAFlags&quot; + cstr(n) + &quot; = Array(&quot; + myArrayA4 + &quot;)&quot;
	OpenLogFile.WriteLine &quot;ArrADom&quot; + cstr(n) + &quot; = Array(&quot; + myArrayA5 + &quot;)&quot;
	OpenLogFile.WriteLine &quot;ArrAName&quot; + cstr(n) + &quot; = Array(&quot; + myArrayA6 + &quot;)&quot;
	OpenLogFile.WriteLine &quot;ArrATrSidL&quot; + cstr(n) + &quot; = Array(&quot; + myArrayA7 + &quot;)&quot;
	OpenLogFile.WriteLine &quot;ArrATrSIDStr&quot; + cstr(n) + &quot; = Array(&quot; + myArrayA8 + &quot;)&quot; + VbCrLf
	n = n + 1
	
Next

OpenLogFile.WriteLine &quot;myArrayF = Array(&quot; + Mid(myArrayU,2,len(myArrayU) - 1) + &quot;)&quot;
OpenLogFile.WriteLine &quot;myArrayF1 = Array(&quot; + Mid(myArrayU1,2,len(myArrayU1) - 1) + &quot;)&quot;
OpenLogFile.WriteLine &quot;myArrayF2 = Array(&quot; + Mid(myArrayU2,2,len(myArrayU2) - 1) + &quot;)&quot;
OpenLogFile.WriteLine &quot;myArrayF3 = Array(&quot; + Mid(myArrayU3,2,len(myArrayU3) - 1) + &quot;)&quot;
OpenLogFile.WriteLine &quot;myArrayF4 = Array(&quot; + Mid(myArrayU4,2,len(myArrayU4) - 1) + &quot;)&quot;
OpenLogFile.WriteLine &quot;myArrayF5 = Array(&quot; + Mid(myArrayU5,2,len(myArrayU5) - 1) + &quot;)&quot;
OpenLogFile.WriteLine &quot;myArrayF6 = Array(&quot; + Mid(myArrayU6,2,len(myArrayU6) - 1) + &quot;)&quot;
OpenLogFile.WriteLine &quot;ArrName = Array(&quot; + myArrayA + &quot;)&quot;
OpenLogFile.WriteLine &quot;ArrPath = Array(&quot; + myArrayA10 + &quot;)&quot;
OpenLogFile.WriteLine &quot;ArrCtrlF = Array(&quot; + myArrayA1 + &quot;)&quot;
OpenLogFile.WriteLine VbCr
OpenLogFile.WriteLine &quot;Set objWMIService = GetObject(&quot; + Chr(34) + &quot;winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2&quot; + Chr(34) + &quot;)&quot; + VbCrLf
OpenLogFile.WriteLine &quot;On Error Resume Next&quot; + VbCrLf
OpenLogFile.WriteLine &quot;Set Shares = objWMIService.ExecQuery(&quot; + Chr(34) + &quot;SELECT Name FROM Win32_Share Where Type=0&quot; + Chr(34) + &quot;)&quot; + VbCrLf
OpenLogFile.WriteLine &quot;For Each Share in Shares&quot; + VbCrLf
OpenLogFile.WriteLine VbTab + &quot;Share.Delete()&quot; + VbCrLf
OpenLogFile.WriteLine &quot;Next&quot; + VbCrLf
OpenLogFile.WriteLine &quot;for x = 0 to UBound(ArrName)&quot; + VbCrLf
OpenLogFile.WriteLine&quot;Set objSecDescriptor = objWMIService.Get(&quot; + Chr(34) + &quot;Win32_SecurityDescriptor&quot; + Chr(34) + &quot;).Spawninstance_()&quot; + VbCrLf
OpenLogFile.WriteLine &quot;objSecDescriptor.ControlFlags = ArrCtrlF(x)&quot; + VbCrLf
OpenLogFile.WriteLine &quot;Set objNewShare = objWMIService.Get(&quot; + Chr(34) + &quot;Win32_Share&quot; + Chr(34) + &quot;)&quot; + VbCrLf
OpenLogFile.WriteLine &quot;objNewShare.Create ArrPath(x), ArrName(x), 0, max,,,objSecDescriptor&quot; + VbCrLf
OpenLogFile.WriteLine &quot;Set objDictionary = CreateObject(&quot; + Chr(34) + &quot;Scripting.Dictionary&quot; + Chr(34) + &quot;)&quot; + VbCrLf
OpenLogFile.WriteLine VbTab + &quot;for y = 0 to UBound(myArrayF(x))&quot; + VbCrLf
OpenLogFile.WriteLine VbTab + &quot;Set objShareSecSetting = objWMIService.Get(&quot; + Chr(34) + &quot;Win32_LogicalShareSecuritySetting.Name=&#039;&quot; + Chr(34) + &quot; &quot; + Chr(43) + &quot; ArrName(x) &quot; + Chr(43) + &quot; &quot; + Chr(34) + &quot;&#039;&quot; + Chr(34) + &quot;)&quot; + VbCrLf
OpenLogFile.WriteLine VbTab + VbTab + &quot;set ACE = SetACE(myArrayF(x)(y), myArrayF2(x)(y),myArrayF1(x)(y), SetTrustee(myArrayF3(x)(y),myArrayF4(x)(y),myArrayF5(x)(y),myArrayF6(x)(y)))&quot; + VbCrLf
OpenLogFile.WriteLine VbTab + VbTab + &quot;If not isNull(objSecDescriptor.DACL) Then&quot; + VbCrLf
OpenLogFile.WriteLine VbTab + VbTab + VbTab + &quot;For i = LBound(objSecDescriptor.DACL) to UBound(objSecDescriptor.DACL)&quot; + VbCrLf
OpenLogFile.WriteLine VbTab + VbTab + VbTab + VbTab + &quot;objDictionary.Add i, objSecDescriptor.DACL(i)&quot; + VbCrLf
OpenLogFile.WriteLine VbTab + VbTab + VbTab + &quot;Next&quot; + VbCrLf
OpenLogFile.WriteLine VbTab + VbTab + VbTab + &quot;objDictionary.Add y, ACE&quot; + VbCrLf
OpenLogFile.WriteLine VbTab + VbTab + &quot;Else&quot; + VbCrLf
OpenLogFile.WriteLine VbTab + VbTab + VbTab + &quot;objDictionary.Add y, ACE&quot; + VbCrLf
OpenLogFile.WriteLine VbTab + VbTab + &quot;End If&quot; + VbCrLf
OpenLogFile.WriteLine VbTab + &quot;Next&quot; + VbCrLf
OpenLogFile.WriteLine VbTab + &quot;objSecDescriptor.DACL = objDictionary.Items&quot; + VbCrLf
OpenLogFile.WriteLine VbTab + &quot;returnval = objShareSecSetting.SetSecurityDescriptor(objSecDescriptor)&quot; + VbCrLf
OpenLogFile.WriteLine VbTab + &quot;Set objDictionary = nothing&quot; + VbCrLf
OpenLogFile.WriteLine &quot;Next&quot;
OpenLogFile.WriteLine VbCr
OpenLogFile.WriteLine &quot;Function SetTrustee(strDomain, strName, SidL, SidS)&quot; + VbCrLf
OpenLogFile.WriteLine VbTab + &quot;set objTrustee = getObject(&quot; + Chr(34) + &quot;Winmgmts:{impersonationlevel=impersonate}!root/cimv2:Win32_Trustee&quot; + Chr(34) + &quot;).Spawninstance_&quot; + VbCrLf
OpenLogFile.WriteLine VbTab + &quot;objTrustee.Domain = strDomain&quot; + VbCrLf
OpenLogFile.WriteLine VbTab + &quot;objTrustee.Name = strName&quot; + VbCrLf
OpenLogFile.WriteLine VbTab + &quot;objTrustee.SidLength = SidL&quot; + VbCrLf
OpenLogFile.WriteLine VbTab + &quot;objTrustee.SIDString = SidS&quot; + VbCrLf
OpenLogFile.WriteLine VbTab + &quot;set SetTrustee = objTrustee&quot; + VbCrLf
OpenLogFile.WriteLine &quot;End Function&quot;
OpenLogFile.WriteLine VbCr
OpenLogFile.WriteLine &quot;Function SetACE(AccessMask, AceFlags, AceType, objTrustee)&quot; + VbCrLf
OpenLogFile.WriteLine VbTab + &quot;set objACE = getObject(&quot; + Chr(34) + &quot;Winmgmts:{impersonationlevel=impersonate}!root/cimv2:Win32_Ace&quot; + Chr(34) + &quot;).Spawninstance_&quot; + VbCrLf
OpenLogFile.WriteLine VbTab + &quot;objACE.AccessMask = AccessMask&quot; + VbCrLf
OpenLogFile.WriteLine VbTab + &quot;objACE.AceFlags = AceFlags&quot; + VbCrLf
OpenLogFile.WriteLine VbTab + &quot;objACE.AceType = AceType&quot; + VbCrLf
OpenLogFile.WriteLine VbTab + &quot;objACE.Trustee = objTrustee&quot; + VbCrLf
OpenLogFile.WriteLine VbTab + &quot;set SetACE = objACE&quot; + VbCrLf
OpenLogFile.WriteLine &quot;End Function&quot; + VbCrLf
OpenLogFile.WriteLine &quot;Wscript.Echo &quot; + Chr(34) + &quot;Завершено восстановление общих ресурсов&quot; + Chr(34) + VbCrLf
OpenLogFile.WriteLine &quot;Wscript.quit&quot;</code></pre></div><p>Примечания.<br />Если будут реализованы все условия, сценарий будет создавать(перезаписывать) в каждой папке дня недели файл Recover_Shares.vbs, в котором будет храниться вся информация о ресурсах на время после запуска задания по расписанию. Если после подключения диска общие ресурсы не восстановятся то можно будет запустить этот файл для восстановления общих ресурсов.<br />Работа сценария проверена в: <br />XP Pro SP3, server 2003 Std/Ent R2 SP2, server 2008 Std/Ent sp2, server 2008 Std R2 sp1<br />Все ОС русской редакции</p>]]></content>
			<author>
				<name><![CDATA[Vasek]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=27769</uri>
			</author>
			<updated>2012-03-26T10:53:45Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=58390#p58390</id>
		</entry>
</feed>
