Die "LDAP-Methode", um dies zu tun, besteht darin, das Basisobjekt mit der GUID (oder SID) abzurufen, die nur das Basisobjekt abruft und keine zusätzlichen Klassendaten anhängt. Von diesem Basisobjekt können Sie jedoch den tatsächlichen "DistinguishedName" für das Benutzerobjekt abrufen. Wenn Sie das Benutzerobjekt mit dem Attribut "DistinguishedName" abrufen, wird ein DirectoryEntry-Objekt (.Net / C # / PowerShell) oder ein iadsUser-Objekt (VBScript) mit vollständigen Klassendaten zurückgegeben, und Sie können alle anderen benötigten Attributdaten abrufen.
Das Problem besteht darin, das ursprüngliche Objekt mit der GUID (oder SID) abzurufen. Einige Quellen sagen, dass Sie die GUID des Zeichenfolgenformats (dh {28c67c50-9778-47a4-a77a-bf56f238a0c4}) in eine Zeichenfolgendarstellung des Byte-Arrays (dh "\ 50 \ 7c \ c6 \ 28 \ 78" konvertieren müssen \ 97 \ a4 \ 47 \ 7a \ a7 \ bf \ 56 \ f2 \ 38 \ a0 \ c4 "), um an LDAP übergeben zu werden. Laut Microsoft-Dokumentation ist dies nicht der Fall. Eine einfache Zeichenfolgendarstellung der GUID / SID ist ausreichend.
Hier ist ein Beispiel, wie Sie über die GUID eine Bindung an das Objekt herstellen und dann das tatsächliche Benutzerobjekt mit vollständigen Klassendaten abrufen können. Powershell zieht tatsächlich das gesamte Objekt, wenn Sie mit der GUID binden. Wenn Sie VBScript verwenden, müssen Sie den zweistufigen Prozess ausführen.
Beachten Sie außerdem, dass, obwohl in den Microsoft-Dokumenten angegeben ist, dass mehrere GUID-Zeichenfolgenformate akzeptabel sind, das einzige, das ich erfolgreich verwenden konnte, das Entfernen der {} - Zeichen ist. ALSO , bitte beachten Sie, das ist nicht ein korrekter „Byte-Array“ string, sondern einfach die GUID - Zeichenfolge von Sonderzeichen gestrippt.
$strGUID = "{28c67c50-9778-47a4-a77a-bf56f238a0c4}" -replace '-|{|}',''
$guid = [ADSI]"LDAP://<GUID=$strGUID>"
$user = [ADSI]$guid.distinguishedName
Der gleiche Prozess kann für eine SID-Bindung verwendet werden. Auf der MSDN-Seite, auf der dies beschrieben wird, heißt es, dass mehrere Fstring-Formate verfügbar sind. Am häufigsten wird jedoch das Format s-1-5 -...-...-...-... verwendet.
#Powershell
$strSID="S-1-5-21-500000003-1000000000-1000000003-1001"
$uSid = [ADSI]"LDAP://<SID=$uSid>"
$user = [ADSI]$user.distinguishedName
* QUERYING *
Wenn Sie eine LDAP-Abfrage ausführen, um das Objekt zu finden (z. B. indem Sie 'objectGUID' mit einem Byte-Array oder 'objectSID' mit einem Byte-Array vergleichen), müssen Sie das "richtige" Byte ausführen. Array-Konvertierung. Es ist wichtig zu beachten, dass das Byte-Array eine andere Reihenfolge als die Zeichenfolgendarstellung hat, da es als DWORD-WORD-WORD-WORD-BYTES für GUID gespeichert ist und die Endian-Reihenfolge berücksichtigt. Das Konvertieren des Byte-Arrays für eine SID weist ähnliche Bedingungen auf.
Es gibt verschiedene Möglichkeiten, die Konvertierung durchzuführen . Technet verfügt über einen einfachen vbScript-Algorithmus . Sie können mit C # / VB.Net auch etwas ausgefalleneres tun, indem Sie die System.Guid oder ein einfaches Skript in PowerShell verwenden (ich muss PowerShell lieben!):
#Powershell
# Creates a new System.GUID object from the supplied string.
# Only need for this example.
$guid = [system.guid]"{28c67c50-9778-47a4-a77a-bf56f238a0c4}"
$out=""
#Formats the array of integers as a backslash-delimited string of Hex values
$guid.ToByteArray() | %{ $out += $("\{0:x2}" -f $_) }
Sie sollten dann in der Lage sein, das Objekt mithilfe eines Standard-LDAP-Filters abzufragen:
(&(objectClass=User)(objectGUID=\50\7c\c6\28\78\97\a4\47\a7\7a\bf\56\f2\38\a0\c4))
... oder was auch immer Sie sonst noch fragen. Dies sollte auch für eine SID funktionieren.