Die Powershell bietet keine direkte Möglichkeit auf LDAP-Server zuzugreifen und damit Abfragen (oder auch Änderungen) zu machen.
Es gibt zwar die Active-Directory-Commandlets, aber die sind nur sehr bedingt dazu geeignet um auf andere LDAP-Server (wie OpenDJ, OpenLDAP, ApacheDS) zuzugreifen.
Aber .NET to the Rescue, es gibt ja auch die Klassen rund um System.Directory.Services.Protocols mit denen man sich da etwas basteln kann.
Als ersten Schritt muss man der Powershell natürlich sagen, welche Assembly man da nun auf einmal verwenden will: Add-Type -AssemblyName 'System.DirectoryServices.Protocols, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'
Um sich nun mit einem Server zu verbinden (mit einer LDAPConnection) braucht man vorher noch zwei Sachen:
- Das entsprechende NetworkCredentialfür einen LDAP-Bind (falls man keinen Anonyme-Authentifizierung verwenden will)
- Einen LdapDirectoryIdentifierder beschreibt unter welcher Adresse und Port der LDAP-Server erreichbar ist.
Wenn man das ganze nun in etwas Code gießt sieht das so ähnlich aus:
|
1 2 3 4 5 6 |
Add-Type -AssemblyName 'System.DirectoryServices.Protocols, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' $credential = New-Object -TypeName System.Net.NetworkCredential -ArgumentList ($user, $password) $directoryIdentifier = New-Object -TypeName System.DirectoryServices.Protocols.LdapDirectoryIdentifier -ArgumentList ($server, $port) $connection = New-Object -TypeName System.DirectoryServices.Protocols.LdapConnection -ArgumentList ($directoryIdentifier, $credential, [DirectoryServices.Protocols.AuthType]::Basic) $connection.SessionOptions.ProtocolVersion = 3 $connection.Bind() |
Im nächsten Teil werden wir einmal eine einfache Abfrage versuchen…