Attribute für AD User : objectSID
Das AD-Attribut objectSid enthält die Security ID (SID) des betreffenden Accounts. Nur so genannte Security Principals (User und Computer Accounts sowie Sicherheitsgruppen) besitzen eine SID. Sie spielt eine wichtige Rolle bei der Vergabe und Zuweisung von Berechtigungen.
objectSID
| LDAP Name | objectSID |
| Datentyp | Octetstring (max 28) |
| Multivalue (Array) | No |
| System Flags | 0x12 |
| Search Flags | 0x09 |
| Im Global Catalog? | Ja |
| Attribute ID | 1.2.840.113556.1.4.146 |
| AD DB Attributname | Object-Sid |
| ADSI datatype | 8 - Octet String |
| LDAP syntax | 2.5.5.17 - String(Sid) |
| Wird verwendet in ... | > W2K |
| Schema Doku | Microsoft - MSDN |
In allen Rechtelisten (Access Control Lists - ACL) werden bei der Vergabe von Berechtigungen an Benutzer nicht deren Namen, sondern lediglich deren SIDs eingetragen. Das gilt für Berechtigungen in der gesamten Domäne: Für Objektrechte im Verzeichnis genauso wie für NTFS-Dateiberechtigungen auf einem Memberserver der Domäne. Auf diese Weise bleiben bei einer Umbenennung des Account die Berechtigungen erhalten.
Microsoft Security IDs
liegen in binärer Form vor (die entsprechenden Attribute haben als LDAP Syntax "Octet String") und müssen somit erst decodiert werden, um sie in die gewohnte lesbare Form zu bringen, z.B.
S-1-5-21-2611707862-2219215769-354220275-1137
Dies ist die Schreibweise einer Beispiel-SID in der Notation der Security Descriptor Definition Language (SDDL). Typischerweise setzt sich die SID eines Active Directory Benutzers
setzt sich immer aus zwei Bestandteilen zusammen: Dem Domänenanteil (der bei allen SIDs innerhalb einer Domäne konstant bleibt) und dem Realitven SID-Anteil (der so genannten RID). Die RID ist immer der letzte Ziffernblock hinter dem letzten Minuszeichen, in unserem Beispiel also 1137.
Alle weiteren Details zum technischen Aufbau und dem Umgang mit SIDs sind im SelfADSI Artikel "Microsoft SID Attribute" enthalten. Dort können Sie sehen, wie man nach Objekten mit einer bestimmten SID sucht, oder welche anderen wichtigen Attribute ebenfalls SID-Werte enthalten. An dieser Stelle sei nur kurz gezeigt, wie man die SID eines Benutzers ausliest und als SDDL String darstellt:
'Sie müssen hier andere Namen und Anmeldedaten aus Ihrer eigene Umgebung angeben!
Set obj = GetObject("LDAP://cn=Foeckeler,cn=Users,dc=cerrotorre,dc=de")
pureSidData = OctetToHexStr(obj.objectSid)
sDDLSidStr = HexStrToSID(pureSidData)
WScript.Echo obj.cn
WScript.Echo pureSidData
WScript.Echo sDDLSidStr
Function HexStrToSID(strSid)
'wandelt einen SID Hex String in Rohform in den entsprechenden SID String (SDDL) um
ReDim data(Len(strSid)/2 - 1)
For i = 0 To UBound(data)
data(i) = CInt("&H" & Mid(strSid, 2*i + 1, 2))
Next
HexStrToSID = "S-" & data(0) & "-" & Byte6ToLong(data(2), data(3), data(4), data(5), data(6), data(7))
blockCount = data(1)
For i = 0 To blockCount - 1
offset = 8 + 4*i
HexStrToSID = HexStrToSID & "-" & Byte4ToLong(data(offset+3), data(offset+2), data(offset+1), data(offset))
Next
End Function
'_________________________________________________________________________________________ Hilfsfunktionen
Function OctetToHexStr(var_octet)
'wandelt reine Binärdaten (Byte-Array) in einen String mit den Hexadezimalwerten um.
OctetToHexStr = ""
For n = 1 To lenb(var_octet)
OctetToHexStr = OctetToHexStr & Right("0" & hex(ascb(midb(var_octet, n, 1))), 2)
Next
End Function
Function Byte4ToLong(ByVal b1, ByVal b2, ByVal b3, ByVal b4)
'wandelt 4 Bytes in den entsprechenden Long-Wert um
Byte4ToLong = b1
Byte4ToLong = Byte4ToLong * 256 + b2
Byte4ToLong = Byte4ToLong * 256 + b3
Byte4ToLong = Byte4ToLong * 256 + b4
End Function
Function Byte6ToLong(ByVal b1, ByVal b2, ByVal b3, ByVal b4, ByVal b5, ByVal b6)
'wandelt 6 Bytes in den entsprechenden Long-Wert um
Byte6ToLong = b1
Byte6ToLong = Byte6ToLong * 256 + b2
Byte6ToLong = Byte6ToLong * 256 + b3
Byte6ToLong = Byte6ToLong * 256 + b4
Byte6ToLong = Byte6ToLong * 256 + b5
Byte6ToLong = Byte6ToLong * 256 + b6
End Function

