1

Тема: VBScript: смена владельца папки

Скрипт назначает владельцем заданной папки (в примере - "C:\Test") текущего пользователя.

Dim objFS, objWSNet, strDomain, strComputer, strUser
Dim objWMI, objCollection, objItem, strUserSID
Dim objSecSettings, objSD, intResult
Const strPath = "C:\Test"
Const strPathWMI = "C:\\Test"
Set objFS = CreateObject("Scripting.FileSystemObject")
If objFS.FolderExists(strPath) Then
    Set objWSNet = CreateObject("WScript.Network")
    strDomain = objWSNet.UserDomain
    strComputer = objWSNet.ComputerName
    strUser = objWSNet.UserName
    Set objWSNet = Nothing
    Set objWMI = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strComputer & "\root\CIMV2")
    Set objCollection = objWMI.ExecQuery("SELECT SID FROM Win32_Account WHERE Name='" & strUser & "' AND Domain='" & strDomain & "'")
    If objCollection.Count > 0 Then
        For Each objItem In objCollection
            strUserSID = objItem.SID
        Next
        Set objItem = Nothing
        Set objSecSettings = objWMI.Get("Win32_LogicalFileSecuritySetting.Path='" & strPathWMI & "'")
        If objSecSettings.GetSecurityDescriptor(objSD) = 0 Then
            If StrComp(strUserSID, objSD.Owner.SIDString, vbTextCompare) = 0 Then
                WScript.Echo "Пользователь " & UCase(strUser) & " - уже владелец папки " & UCase(strPath)
            Else
                'WScript.Echo "Пользователь " & UCase(strUser) & " - не владелец папки " & UCase(strPath)
                Set objSID = objWMI.Get("Win32_SID.SID='" & strUserSID & "'")
                objSD.Owner.Domain = strDomain
                objSD.Owner.Name = strUser
                objSD.Owner.SID = objSID.BinaryRepresentation
                objSD.Owner.SidLength = objSID.SidLength
                objSD.Owner.SIDString = strUserSID
                Set objSID = Nothing
                intResult = objSecSettings.SetSecurityDescriptor(objSD)
                Select Case intResult
                    Case 0: WScript.Echo "Успешная смена владельца."
                    Case 2: WScript.Echo "Отсутствует доступ к необходимой информации."
                    Case 9: WScript.Echo "Для выполнения операции нет достаточных прав."
                    Case 21: WScript.Echo "Заданы недопустимые значения параметров."
                    Case Else: WScript.Echo "Неизвестная ошибка."
                End Select
                'If StrComp(strUserSID, objSD.Owner.SIDString, vbTextCompare) = 0 Then
                '    WScript.Echo "Пользователь " & UCase(strUser) & " - теперь владелец папки " & UCase(strPath)
                'Else
                '    WScript.Echo "Пользователь " & UCase(strUser) & " - опять не владелец папки " & UCase(strPath)
                'End If
            End If
        Else
            WScript.Echo "Не удалось прочитать дескриптор безопасности объекта."
        End If
        Set objSD = Nothing
        Set objSecSettings = Nothing
    Else
        WScript.Echo "Не обнаружена учётная запись пользователя " & UCase(strUser)
    End If
    Set objCollection = Nothing
    Set objWMI = Nothing
Else
    WScript.Echo "Объект " & UCase(strPath) & " не обнаружен."
End If
Set objFS = Nothing

Примечания:
- для нормальной работы сценария необходимо, чтобы ни политика безопасности домена, ни безопасность NTFS не препятствовали заданному пользователю становиться владельцем объекта;
- работоспособность сценария проверена для Windows 2000 Pro/XP Pro/2003.
Автор скрипта - Dmitrii.

Предложения в русском языке начинаются с большой буквы и заканчиваются точкой.
В названии ветки всегда должен быть указан язык программирования или среда исполнения скрипта, если это возможно.