Salut,
Je tente un script PS pour sortir les utilisateurs (uid) membre d'un certain groupe (ou) d'un ldap dans lequel je peux taper de manière anonyme depuis une machine qui n'est pas dans l'AD
En shell sous linux, ça me prend une ligne avec ldapsearch et je dois dire que j'ai de la peine à comprendre la procédure avec PS.
Voilà mon code fonctionnel
Code :
- [System.Reflection.Assembly]::Load("System.DirectoryServices.Protocols, version=4.0.0.0, culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" ) | Out-Null
- [System.Reflection.Assembly]::Load("System.Net, version=4.0.0.0, culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" ) | Out-Null
- $myserver=New-Object System.DirectoryServices.Protocols.LdapDirectoryIdentifier("ldap.cogip.com:636" )
- $connection = New-Object System.DirectoryServices.Protocols.LdapConnection($myserver)
- $connection.SessionOptions.SecureSocketLayer = $true;
- $connection.SessionOptions.ProtocolVersion = 3
- $connection.AuthType = [System.DirectoryServices.Protocols.AuthType]::Anonymous
- $connection.Bind()
- $request = new-object System.DirectoryServices.Protocols.SearchRequest
- $request.DistinguishedName = "ou=pif, ou=paf"
- $request.Filter = "(&(ObjectClass=posixAccount)(ou=mongroupe))"
- $request.Attributes.Add("uid" ) | Out-Null
- $mydata = $connection.SendRequest($request);
- foreach ($myuserinfo in $mydata.Entries.Attributes) {
- $username = [string]$myuserinfo["uid"][0] -replace '@.+$',''
- $username
- }
- $connection.Dispose()
|
J'ai passé une demi journée pour réussir à faire fonctionner ce truc, j'ai tenté d'autre méthodes avec un objet System.DirectoryServices.DirectorySearcher mais impossible d'en sortir quoi que ce soit.
Les questions qui se posent sont les suivantes:
Pour les lignes de chargement de modules/libraries
Code :
- [System.Reflection.Assembly]::Load("System.DirectoryServices.Protocols, version=4.0.0.0, culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" ) | Out-Null
- [System.Reflection.Assembly]::Load("System.Net, version=4.0.0.0, culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" ) | Out-Null
|
Que signifie cette syntaxe de [....]::Load... ?
Y a t'il un équivalent avec qqch du genre
Code :
- $mylib = new-object System.Reflection.Assembly.Load("System.Net" )...
|
Ou ça n'a aucun lien ?
Avant d'utiliser Assembly.load, j'utilisais Assembly.LoadWithPartialName mais MS nous dit que c'est obsolète et qu'il faut utiliser Asembly.Load, sans aucune autre info. Par bol j'ai trouvé un gus qui explique le chargement de la librairie en allant fouiller dans les dossier windows pour trouver les versions des lib mais y a t'il une doc qui explique ça quelque part ? Parce qu'à part être devin, j'ai des doutes que les gens comprennent ça du premier coup.
Une fois ma requête lancée, je récupère mon objet "SearchRequest" mais quand j'essaie d'afficher le contenu, c'est relativement incompréhensible.
Code :
- $mydata.Entries| Format-list
|
Me sort un bloc d'info en une ligne donc pas vraiment lisible
J'ai tenté ensuite
Code :
- $mydata.Entries.Attributes | Format-list
|
Mais ça me crache du byte code qqn peut m'expliquer pourquoi ? Ok, certaines personnes ont plusieurs UID (username, username@group2, username@group3) mais c'est quoi l'idée avec cette conversion ?
Et pourquoi le simple fait de forcer le premier élément de l'UID avec $myuserinfo["uid"][0] suffit à afficher ça en "clair" ? Y a t'il une autre méthode ? Je suis tombé sur un bout de code mais le type crée une fonction et son code fait limite 2 pages pour afficher une simple donnée LDAP , ça me parait un peu violent quand même.
Je suis clairement un noob en PS vu que je fais que du shell unix mais je dois dire que la syntaxe de ce langage est n'est vraiment clair et quand on veut faire des trucs un peu particulier du genre taper dans un LDAP depuis une machine non-AD, c'est la foire complète pour trouver du code qui fonctionne.
Merci d'avance pour vos explications
Message édité par darxmurf le 22-07-2024 à 17:27:33
---------------
Des trucs - flickr - Instagram