Abrufen von Benutzerdetails aus Active Directory mithilfe der SID

10

Wie finde ich einen Benutzer in meiner Anzeige, wenn ich seine SID habe? Ich möchte mich nicht auf andere Attribute verlassen, da ich versuche, Änderungen an diesen zu erkennen. Beispiel: Ich erhalte eine Nachricht über eine Änderung des Benutzerdatensatzes, die Folgendes enthält:

Message: User Account Changed:

    Target Account Name:    test12

    Target Domain:  DOMAIN

    Target Account ID:  %{S-1-5-21-3968247570-3627839482-368725868-1110}

    Caller User Name:   Administrator

    Caller Domain:  DOMAIN

    Caller Logon ID:    (0x0,0x62AB1)

    Privileges: -

Ich möchte den Benutzer über die Änderung informieren. Also brauche ich ihre Kontoinformationen von AD.

er4z0r
quelle
Versuchen Sie als Systemadministrator, dies zu tun, oder versuchen Sie, dies progmatisch zu erreichen? Wenn progmatisch, kann ich dann vorschlagen, dass die Frage zurück zu SO verschoben wird?
pipTheGeek
Es ist ein Randfall - wenn Sie Hilfe beim Herausfinden von LDAP \ ADSI-Skripten benötigen, befindet es sich möglicherweise hier, aber es klingt mehr nach Programmierung \ Directory Services-API, die mit mir zusammenhängt. Wenn es bleibt, werde ich eine LDAP \ ADSI-Antwort posten.
Helvick
OK, ich versuche tatsächlich, dies über VBScript zu tun, aber ich wäre an einer Möglichkeit interessiert, dies über andere Befehlszeilentools wie dsquery zu tun
er4z0r

Antworten:

22

Starten Sie Windows PowerShell und führen Sie Folgendes aus:

$strSID="S-1-5-21-500000003-1000000000-1000000003-1001"
$uSid = [ADSI]"LDAP://<SID=$strSID>"
echo $uSid

Die Ausgabe sollte ungefähr so ​​aussehen:

distinguishedName : {CN=John Doe,OU=Domain Admins,OU=People,OU=xxx,DC=xxx}
Path              : LDAP://<SID=S-1-5-21-500000003-1000000000-1000000003-1001>
Tim Abell
quelle
5
Dies funktioniert gut - Sie können es auch als Einzeiler tun:> [ADSI] "LDAP: // <SID = S-1-5-21-500000003-1000000000-1000000003-1001>"
Iain Hallam
4

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.

Ryan Fisher
quelle
BEEINDRUCKEND! Danke für die ausführliche Antwort! Ich werde es mit ADSI versuchen und sehen, ob es dort auch funktioniert. Noch nie zuvor Powershell.
er4z0r
Mein erster Versuch war nicht erfolgreich. Bitte schauen Sie sich meine Bearbeitung an.
er4z0r
Entschuldigung, ich habe keine Zeit für eine vollständige Antwort, aber Ihr Problem ist, dass die ID, die Sie in den Ereignisdaten haben, eine SID ist, keine GUID. Sie können mit der SID keine direkte Bindung an ein Objekt herstellen, aber Sie können das Verzeichnis mit dem objectSid-Attribut durchsuchen.
pipTheGeek
hi pipTheGeek. Es stellt sich heraus, dass ich tatsächlich mit einer SID binden kann. Siehe Antwort für mehr.
er4z0r
1
Cool. Ich mag es zu lernen, ich mag es nicht falsch zu liegen, ich lerne am meisten, wenn ich falsch
liege
2

OK. Ich habe einen Weg gefunden, dies über Active Directory zu tun. Der Vollständigkeit halber hier der Code:

REM Converts the SID into a format, that can be processed by ADSI or WMI
Function NormalizeSid(strSidToNormalize)
  Dim regEx,strReplace
  strReplace=""
  ' Create regular expression.
  Set regEx = New RegExp
  regEx.Global  = True
  regEx.Pattern = "(%|{|})"
  regEx.IgnoreCase = True

  ' Make replacement.
  NormalizeSid = regEx.Replace(strSidToNormalize, strReplace)
End Function

REM Searches for a SID the in the Message that was passed as argument
REM SID returned will be of the  form %{S-1-5-21-3968247570-3627839482-368725868-1110}
REM NOTE: Neither WMI nor ADSI will accept this. Use NormalizeSid like in FindUser
Function FindSidInMessage(Message)
    Dim strAccountRegex
    Dim objRegex
    Dim objMatch
    Dim strSID

    strAccountRegex = "(\%\{S\-[,0-9,\-]*\})"
    Set objRegex    = new RegExp
    objRegex.Pattern= strAccountRegex

    for each objMatch in objRegex.Execute(Message)
            REM Wscript.StdOut.writeLine "Found an Account ID: " & objMatch.value
            strSID=objMatch.value
    next

    FindSidInMessage=strSID
End Function 

REM Searches Directory for the User matching the SID passed as parameter
Function FindUser(userSID)
    Dim normalizedSID
    Dim objUser

    normalizedSID=NormalizeSid(userSID)
    Wscript.Echo "SID after escaping: " & normalizedSID

    Wscript.StdOut.writeLine "Querying AD to retrieve user-data" 
    Set objUser = GetObject("LDAP://<SID="& normalizedSID & ">")
    FindUser=objUser.EmailAddress
End Function

Hoffe, dass dies für andere nützlich sein wird.

er4z0r
quelle
1

Verwenden Sie PS:

$SID = "S-X-X-XX-XXXXXXXXXX-XXXXXXXXXX-XXXXXXXXXX-XXXX"
Get-ADObject -IncludeDeletedObjects -Filter * -Properties * | where{$_.objectSid -eq $SID}
Ahtyam
quelle