Тема: VBScript: Сохранить DACL общего ресурса
Предлагаю для тестирования сценарий, с помощью которого можно делать резервные копии общих ресурсов на сервере. Иногда бывает так что зашифрованный диск подключается, а общие ресурсы не восстанавливаются. Для нормальной работы потребуется создать папки для сохранения файлов резервных копий, в моем примере это c:\scripts\shares\" + dir + "\
dir - это 1.Пн;2.Вт;3.Ср;4.Чт;5.Пт;6.Сб;7.ВС
Создать задание выполнения этого сценария ежедневно - cscript c:\scripts\shares_backup.vbs
Сценари shares_backup.vbs
WeekDayNumber = WeekDay(Now, vbMonday)
If WeekDayNumber = 1 Then
dir="1.Пн"
ElseIf WeekDayNumber = 2 Then
dir="2.Вт"
ElseIf WeekDayNumber = 3 Then
dir="3.Ср"
ElseIf WeekDayNumber = 4 Then
dir="4.Чт"
ElseIf WeekDayNumber = 5 Then
dir="5.Пт"
ElseIf WeekDayNumber = 6 Then
dir="6.Сб"
ElseIf WeekDayNumber = 7 Then
dir="7.ВС"
End If
Set fso = WScript.CreateObject("Scripting.FileSystemObject")
Set oWMI = GetObject("winmgmts:")
Set oShares = oWMI.ExecQuery("select Name,Path from Win32_Share where Type=0")
Set OpenLogFile = Fso.OpenTextFile("c:\scripts\shares\" + dir + "\Recover_Shares.vbs",2,True,-2)
n = 0
On Error Resume Next
For Each oShare In oShares
Set oShareSecSetting = GetObject("winmgmts:Win32_LogicalShareSecuritySetting.Name='" + oShare.Name + "'")
iRC = oShareSecSetting.GetSecurityDescriptor(oSecurityDescriptor)
aDACL = oSecurityDescriptor.DACL
myArray = myArray + "," + Chr(34) + oShare.Name + Chr(34)
myArray1 = myArray1 + "," + cstr(oSecurityDescriptor.ControlFlags)
myArray10 = myArray10 + "," + Chr(34) + oShare.Path + Chr(34)
myArray2 = ""
myArray3 = ""
myArray4 = ""
myArray5 = ""
myArray6 = ""
myArray7 = ""
myArray8 = ""
For Each oAce In aDACL
myArray2 = myArray2 + "," + cstr(oAce.AccessMask)
myArray3 = myArray3 + "," + cstr(oAce.AceType)
myArray4 = myArray4 + "," + cstr(oAce.AceFlags)
Set oTrustee = oAce.Trustee
If not isNull(oTrustee.Domain) Then
myArray5 = myArray5 + "," + Chr(34) + oTrustee.Domain + Chr(34)
Else
myArray5 = myArray5 + "," + Chr(34) + "Null" + Chr(34)
End If
If not isNull(oTrustee.Name) Then
myArray6 = myArray6 + "," + Chr(34) + oTrustee.Name + Chr(34)
Else
myArray6 = myArray6 + "," + Chr(34) + "Null" + Chr(34)
End If
myArray7 = myArray7 + "," + cstr(oAce.Trustee.SidLength)
myArray8 = myArray8 + "," + Chr(34) + oAce.Trustee.SIDString + Chr(34)
myArray9 = myArray9 + "," + 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 + ",ArrAMask" + cstr(n)
myArrayU1 = myArrayU1 + ",ArrAType" + cstr(n)
myArrayU2 = myArrayU2 + ",ArrAFlags" + cstr(n)
myArrayU3 = myArrayU3 + ",ArrADom" + cstr(n)
myArrayU4 = myArrayU4 + ",ArrAName" + cstr(n)
myArrayU5 = myArrayU5 + ",ArrATrSidL" + cstr(n)
myArrayU6 = myArrayU6 + ",ArrATrSIDStr" + cstr(n)
OpenLogFile.WriteLine "ArrAMask" + cstr(n) + " = Array(" + myArrayA2 + ")"
OpenLogFile.WriteLine "ArrAType" + cstr(n) + " = Array(" + myArrayA3 + ")"
OpenLogFile.WriteLine "ArrAFlags" + cstr(n) + " = Array(" + myArrayA4 + ")"
OpenLogFile.WriteLine "ArrADom" + cstr(n) + " = Array(" + myArrayA5 + ")"
OpenLogFile.WriteLine "ArrAName" + cstr(n) + " = Array(" + myArrayA6 + ")"
OpenLogFile.WriteLine "ArrATrSidL" + cstr(n) + " = Array(" + myArrayA7 + ")"
OpenLogFile.WriteLine "ArrATrSIDStr" + cstr(n) + " = Array(" + myArrayA8 + ")" + VbCrLf
n = n + 1
Next
OpenLogFile.WriteLine "myArrayF = Array(" + Mid(myArrayU,2,len(myArrayU) - 1) + ")"
OpenLogFile.WriteLine "myArrayF1 = Array(" + Mid(myArrayU1,2,len(myArrayU1) - 1) + ")"
OpenLogFile.WriteLine "myArrayF2 = Array(" + Mid(myArrayU2,2,len(myArrayU2) - 1) + ")"
OpenLogFile.WriteLine "myArrayF3 = Array(" + Mid(myArrayU3,2,len(myArrayU3) - 1) + ")"
OpenLogFile.WriteLine "myArrayF4 = Array(" + Mid(myArrayU4,2,len(myArrayU4) - 1) + ")"
OpenLogFile.WriteLine "myArrayF5 = Array(" + Mid(myArrayU5,2,len(myArrayU5) - 1) + ")"
OpenLogFile.WriteLine "myArrayF6 = Array(" + Mid(myArrayU6,2,len(myArrayU6) - 1) + ")"
OpenLogFile.WriteLine "ArrName = Array(" + myArrayA + ")"
OpenLogFile.WriteLine "ArrPath = Array(" + myArrayA10 + ")"
OpenLogFile.WriteLine "ArrCtrlF = Array(" + myArrayA1 + ")"
OpenLogFile.WriteLine VbCr
OpenLogFile.WriteLine "Set objWMIService = GetObject(" + Chr(34) + "winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2" + Chr(34) + ")" + VbCrLf
OpenLogFile.WriteLine "On Error Resume Next" + VbCrLf
OpenLogFile.WriteLine "Set Shares = objWMIService.ExecQuery(" + Chr(34) + "SELECT Name FROM Win32_Share Where Type=0" + Chr(34) + ")" + VbCrLf
OpenLogFile.WriteLine "For Each Share in Shares" + VbCrLf
OpenLogFile.WriteLine VbTab + "Share.Delete()" + VbCrLf
OpenLogFile.WriteLine "Next" + VbCrLf
OpenLogFile.WriteLine "for x = 0 to UBound(ArrName)" + VbCrLf
OpenLogFile.WriteLine"Set objSecDescriptor = objWMIService.Get(" + Chr(34) + "Win32_SecurityDescriptor" + Chr(34) + ").Spawninstance_()" + VbCrLf
OpenLogFile.WriteLine "objSecDescriptor.ControlFlags = ArrCtrlF(x)" + VbCrLf
OpenLogFile.WriteLine "Set objNewShare = objWMIService.Get(" + Chr(34) + "Win32_Share" + Chr(34) + ")" + VbCrLf
OpenLogFile.WriteLine "objNewShare.Create ArrPath(x), ArrName(x), 0, max,,,objSecDescriptor" + VbCrLf
OpenLogFile.WriteLine "Set objDictionary = CreateObject(" + Chr(34) + "Scripting.Dictionary" + Chr(34) + ")" + VbCrLf
OpenLogFile.WriteLine VbTab + "for y = 0 to UBound(myArrayF(x))" + VbCrLf
OpenLogFile.WriteLine VbTab + "Set objShareSecSetting = objWMIService.Get(" + Chr(34) + "Win32_LogicalShareSecuritySetting.Name='" + Chr(34) + " " + Chr(43) + " ArrName(x) " + Chr(43) + " " + Chr(34) + "'" + Chr(34) + ")" + VbCrLf
OpenLogFile.WriteLine VbTab + VbTab + "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)))" + VbCrLf
OpenLogFile.WriteLine VbTab + VbTab + "If not isNull(objSecDescriptor.DACL) Then" + VbCrLf
OpenLogFile.WriteLine VbTab + VbTab + VbTab + "For i = LBound(objSecDescriptor.DACL) to UBound(objSecDescriptor.DACL)" + VbCrLf
OpenLogFile.WriteLine VbTab + VbTab + VbTab + VbTab + "objDictionary.Add i, objSecDescriptor.DACL(i)" + VbCrLf
OpenLogFile.WriteLine VbTab + VbTab + VbTab + "Next" + VbCrLf
OpenLogFile.WriteLine VbTab + VbTab + VbTab + "objDictionary.Add y, ACE" + VbCrLf
OpenLogFile.WriteLine VbTab + VbTab + "Else" + VbCrLf
OpenLogFile.WriteLine VbTab + VbTab + VbTab + "objDictionary.Add y, ACE" + VbCrLf
OpenLogFile.WriteLine VbTab + VbTab + "End If" + VbCrLf
OpenLogFile.WriteLine VbTab + "Next" + VbCrLf
OpenLogFile.WriteLine VbTab + "objSecDescriptor.DACL = objDictionary.Items" + VbCrLf
OpenLogFile.WriteLine VbTab + "returnval = objShareSecSetting.SetSecurityDescriptor(objSecDescriptor)" + VbCrLf
OpenLogFile.WriteLine VbTab + "Set objDictionary = nothing" + VbCrLf
OpenLogFile.WriteLine "Next"
OpenLogFile.WriteLine VbCr
OpenLogFile.WriteLine "Function SetTrustee(strDomain, strName, SidL, SidS)" + VbCrLf
OpenLogFile.WriteLine VbTab + "set objTrustee = getObject(" + Chr(34) + "Winmgmts:{impersonationlevel=impersonate}!root/cimv2:Win32_Trustee" + Chr(34) + ").Spawninstance_" + VbCrLf
OpenLogFile.WriteLine VbTab + "objTrustee.Domain = strDomain" + VbCrLf
OpenLogFile.WriteLine VbTab + "objTrustee.Name = strName" + VbCrLf
OpenLogFile.WriteLine VbTab + "objTrustee.SidLength = SidL" + VbCrLf
OpenLogFile.WriteLine VbTab + "objTrustee.SIDString = SidS" + VbCrLf
OpenLogFile.WriteLine VbTab + "set SetTrustee = objTrustee" + VbCrLf
OpenLogFile.WriteLine "End Function"
OpenLogFile.WriteLine VbCr
OpenLogFile.WriteLine "Function SetACE(AccessMask, AceFlags, AceType, objTrustee)" + VbCrLf
OpenLogFile.WriteLine VbTab + "set objACE = getObject(" + Chr(34) + "Winmgmts:{impersonationlevel=impersonate}!root/cimv2:Win32_Ace" + Chr(34) + ").Spawninstance_" + VbCrLf
OpenLogFile.WriteLine VbTab + "objACE.AccessMask = AccessMask" + VbCrLf
OpenLogFile.WriteLine VbTab + "objACE.AceFlags = AceFlags" + VbCrLf
OpenLogFile.WriteLine VbTab + "objACE.AceType = AceType" + VbCrLf
OpenLogFile.WriteLine VbTab + "objACE.Trustee = objTrustee" + VbCrLf
OpenLogFile.WriteLine VbTab + "set SetACE = objACE" + VbCrLf
OpenLogFile.WriteLine "End Function" + VbCrLf
OpenLogFile.WriteLine "Wscript.Echo " + Chr(34) + "Завершено восстановление общих ресурсов" + Chr(34) + VbCrLf
OpenLogFile.WriteLine "Wscript.quit"Примечания.
Если будут реализованы все условия, сценарий будет создавать(перезаписывать) в каждой папке дня недели файл Recover_Shares.vbs, в котором будет храниться вся информация о ресурсах на время после запуска задания по расписанию. Если после подключения диска общие ресурсы не восстановятся то можно будет запустить этот файл для восстановления общих ресурсов.
Работа сценария проверена в:
XP Pro SP3, server 2003 Std/Ent R2 SP2, server 2008 Std/Ent sp2, server 2008 Std R2 sp1
Все ОС русской редакции

