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é.
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>
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.
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.
Utilisez PS:
$SID = "S-X-X-XX-XXXXXXXXXX-XXXXXXXXXX-XXXXXXXXXX-XXXX"
Get-ADObject -IncludeDeletedObjects -Filter * -Properties * | where{$_.objectSid -eq $SID}