web-dev-qa-db-fra.com

Récupérer les détails de l'utilisateur à partir d'Active Directory à l'aide de SID

Comment puis-je trouver un utilisateur dans mon annonce quand j'ai son SID. Je ne veux pas compter sur d'autres attributs, car j'essaie de détecter des changements à ceux-ci. Exemple: je reçois un message sur une modification de l'enregistrement d'utilisateur contenant:

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: -

Je veux informer l'utilisateur de la modification. J'ai donc besoin de leur compte-information de la publicité.

10
er4z0r

Feu Windows PowerShell et Run:

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

La sortie devrait ressembler à quelque chose comme ça,

distinguishedName : {CN=John Doe,OU=Domain Admins,OU=People,OU=xxx,DC=xxx}
Path              : LDAP://<SID=S-1-5-21-500000003-1000000000-1000000003-1001>
22
Tim Abell

Le "Way LDAP" de le faire serait de récupérer l'objet de base avec le GUID (ou SID), qui ne récupérera que l'objet de base et ne disposera de données de classe supplémentaires attachées. Toutefois, de Cet objet de base vous pouvez récupérer le "nom distinctif" réel pour l'objet utilisateur. Récupération de l'objet utilisateur à l'aide de l'attribut "distinctionNameName" de retournera un objet répertoire (.NET/C #/POWERSHELL) ou un objet IADSUser (VBScript) avec des données complètes de la classe. et vous permet d'obtenir toutes les autres données d'attribut dont vous avez besoin.

Le problème récupère l'objet initial avec le GUID (ou SID). Certaines sources diront que vous devez convertir le format de chaîne GUID (c.-à-d. {28C67C50 -9778-47A4-A77A-BF56F238A0C4}) dans une représentation de chaîne du tableau d'octets (c.-à-d. "\ 50\7c\c6\28\78\97\A4\47\7a\a7\bf\56\f2\\ 38\a0\c4 ") passer au LDAP. Selon Microsoft Documentation Ce n'est pas le cas. Une simple représentation de chaîne du GUID/SID est suffisante.

Voici un échantillon de la manière dont vous pouvez lier à l'objet via GUID puis récupérer l'objet utilisateur réel avec des données de classe complète. PowerShell tire en réalité l'objet complet si vous liez avec le GUID. Si vous utilisez. Si vous utilisez VBScript, vous auriez alors besoin de faire le processus en deux étapes.

De plus, veuillez noter que, bien que Microsoft Docs affirme que plusieurs formats de chaîne GUID sont acceptables, le seul que j'ai pu utiliser avec succès est de supprimer les caractères {}. [~ # ~] aussi [~ # ~ ~] , veuillez noter que c'est [~ # ~ # ~] une chaîne correcte "Byte-Array", mais simplement le GUID string dépouillé de caractères spéciaux.

$strGUID = "{28c67c50-9778-47a4-a77a-bf56f238a0c4}" -replace '-|{|}',''
$guid = [ADSI]"LDAP://<GUID=$strGUID>"
$user = [ADSI]$guid.distinguishedName

Le même processus peut être utilisé pour une liaison SID. La page MSDN décrivant cela indique qu'il existe plusieurs formats Fstring disponibles, mais le plus courant sera le format S-1-5 -...-...-...-...-...-...

#Powershell
$strSID="S-1-5-21-500000003-1000000000-1000000003-1001"
$uSid = [ADSI]"LDAP://<SID=$uSid>"
$user = [ADSI]$user.distinguishedName

* Interrogation *

Si vous allez effectuer une requête LDAP pour trouver l'objet (par exemple en comparant "ObjectGuid" à un tableau d'octets ou "ObjetsID" à un tableau d'octets), c'est-à-dire lorsque vous devrez faire le "correct" d'octet- conversion de tableau. Il est important de noter que le tableau des octets a une ordonnance différente de la représentation des chaînes, car elle est stockée en tant que Word-Word-Word-octets pour GUID et prend en compte l'ordre endian. Conversion du tableau d'octets pour un SID a des conditions similaires.

Il existe différentes manières d'accomplir la conversion, TechNet a n simple algorithme VBScript . Vous pouvez également faire quelque chose d'amateur avec c #/vb.net à l'aide du système.Guid ou via un script simple dans PowerShell (Gotta Love PowerShell!):

#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 $_) }

Vous devriez alors être capable d'interroger pour l'objet à l'aide d'un filtre LDAP standard:

(&(objectClass=User)(objectGUID=\50\7c\c6\28\78\97\a4\47\a7\7a\bf\56\f2\38\a0\c4))

... ou quoi que ce soit d'autre que vous pouvez interroger. Cela devrait fonctionner aussi bien pour un SID.

4
Ryan Fisher

D'ACCORD. J'ai trouvé un moyen de faire cela via Active Directory. Pour le fabricant ici, c'est le 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

J'espère que cela sera utile aux autres.

2
er4z0r

Utilisez PS:

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