2014-01-13 3 views

ответ

1

Использования WMI для решения SID:

Set wmi = GetObject("winmgmts://./root/cimv2") 

groupname = "..." 

qry = "SELECT * FROM Win32_Group WHERE Name='" & groupname & "'" 
For Each group In wmi.ExecQuery(qry) 
    sid = group.SID 
Next 

If Not IsEmpty(sid) Then 
    WScript.Echo "Group " & groupname & " has SID " & sid & "." 
Else 
    WScript.Echo "SID For group " & groupname & " could not be resolved." 
End If 

Если вам необходимо преобразовать двоичный SIDs используемого в AD я бы предложил вам сделать что-то вроде этого:

Function DecodeSID(binSID) 
    ReDim octets(LenB(binSID)) 

    'convert binary string to octet array 
    For i = 1 To LenB(binSID) 
    octets(i-1) = AscB(MidB(binSID, i, 1)) 
    Next 

    'convert octet array to SID string 
    sid = "S-" & CStr(octets(0)) & "-" & Octet2Str(Array(octets(2), octets(3), _ 
     octets(4), octets(5), octets(6), octets(7))) 
    For i = 8 To (4 * octets(1) + 4) Step 4 
    sid = sid & "-" & OctetArrayToString(Array(octets(i+3), octets(i+2), _ 
      octets(i+1), octets(i))) 
    Next 

    DecodeSID = sid 
End Function 

Function OctetArrayToString(arr) 
    v = 0 
    For i = 0 To UBound(arr) 
    v = v * 256 + arr(i) 
    Next 
    OctetArrayToString = CStr(v) 
End Function 

Для получения дополнительной информации о двоичных идентификаторах SID ee here.

+0

Upvote! Спасибо Ансгар, я всегда хотел получить более короткую версию и ее структуру. – PatricK

0

я забыл, где я получил это, но здесь это:

Set oAD = GetObject(sLDAP) ' sLDAP starts with "LDAP://"  
wscript.echo "SID: " & HexSIDToDec(OctetToHexStr(oAD.Get("objectSid")))) 

Function HexSIDToDec(strSID) 
    ' Function to convert most hex SID values to decimal format. 
    Dim arrbytSID, lngTemp, j 
    ReDim arrbytSID(Len(strSID)/2 - 1) 
    For j = 0 To UBound(arrbytSID) 
     arrbytSID(j) = CInt("&H" & Mid(strSID, 2*j + 1, 2)) 
    Next 
    If (UBound(arrbytSID) = 11) Then 
     HexSIDToDec = "S-" & arrbytSID(0) & "-" & arrbytSID(1) & "-" & arrbytSID(8) 
     Exit Function 
    End If 
    If (UBound(arrbytSID) = 15) Then 
     HexSIDToDec = "S-" & arrbytSID(0) & "-" & arrbytSID(1) & "-" & arrbytSID(8) 
     lngTemp = arrbytSID(15) 
     lngTemp = lngTemp * 256 + arrbytSID(14) 
     lngTemp = lngTemp * 256 + arrbytSID(13) 
     lngTemp = lngTemp * 256 + arrbytSID(12) 
     HexSIDToDec = HexSIDToDec & "-" & CStr(lngTemp) 
     Exit Function 
    End If 
    HexSIDToDec = "S-" & arrbytSID(0) & "-" & arrbytSID(1) & "-" & arrbytSID(8) 
    lngTemp = arrbytSID(15) 
    lngTemp = lngTemp * 256 + arrbytSID(14) 
    lngTemp = lngTemp * 256 + arrbytSID(13) 
    lngTemp = lngTemp * 256 + arrbytSID(12) 
    HexSIDToDec = HexSIDToDec & "-" & CStr(lngTemp) 
    lngTemp = arrbytSID(19) 
    lngTemp = lngTemp * 256 + arrbytSID(18) 
    lngTemp = lngTemp * 256 + arrbytSID(17) 
    lngTemp = lngTemp * 256 + arrbytSID(16) 
    HexSIDToDec = HexSIDToDec & "-" & CStr(lngTemp) 
    lngTemp = arrbytSID(23) 
    lngTemp = lngTemp * 256 + arrbytSID(22) 
    lngTemp = lngTemp * 256 + arrbytSID(21) 
    lngTemp = lngTemp * 256 + arrbytSID(20) 
    HexSIDToDec = HexSIDToDec & "-" & CStr(lngTemp) 
    If (UBound(arrbytSID) > 23) Then 
     lngTemp = arrbytSID(27) 
     lngTemp = lngTemp * 256 + arrbytSID(26) 
     lngTemp = lngTemp * 256 + arrbytSID(25) 
     lngTemp = lngTemp * 256 + arrbytSID(24) 
     HexSIDToDec = HexSIDToDec & "-" & CStr(lngTemp) 
    End If 
End Function 

Function OctetToHexStr(ByVal arrbytOctet) 
    ' Function to convert OctetString (byte array) to Hex string. 
    Dim k 
    OctetToHexStr = "" 
    For k = 1 To Lenb(arrbytOctet) 
     OctetToHexStr = OctetToHexStr & Right("0" & Hex(Ascb(Midb(arrbytOctet, k, 1))), 2) 
    Next 
End Function 
+0

Это работает только для SID объектов AD, а также предполагает, что двоичный SID будет не больше 28 байт, что может не всегда быть истинным. Для получения дополнительной информации о структуре двоичных SID см. [Здесь] (http://blogs.msdn.com/oldnewthing/archive/2004/03/15/89753.aspx). –