PowerShell und LDAP, GC
Seit es die Windows AD Commandlets mit "Get-ADUser" und anderen Commandlets gibt, könnten sie es als überflüssig ansehen, per LDAP direkt die Domaincontroller abzufragen. Die AD-Commandlets nutzen ja nicht mal die LDAP-Ports 389/TCP, 636/TLS, oder 3268/TCP für den GC sondern einen "WebService", der vom DC für die Clients bereit gestellt wird. Das ist einfach, "Cloud-Tauglich" aber nicht immer schnell.
Beachten Sie zu den Feinheiten zu ADSI auch die Seite ADSI und LDAP
Diese Seite beschränkt sich auf Code-Beispiele für PowerShell, auf die ich selbst ach immer mal wieder zurückgreifen.
ADSI und PowerShell
Natürlich kann man auch per PowerShell über das ADSI-Kürzel direkt auf Objekte zugreifen.
$objUser = [adsi]"LDAP://cn=User1,ou=Anwender,dc=msxfaq,dc=de"
Wichtig ist hier die genaue Schreibweise mit LDAP in Großbuchstaben und "//"-Zeichen. Ein paar sehr gute Anleitungen gibt es auf:
-
PowerShell Beispiele
Weitere Samples zu LDAP-Suchen mit PowerShell - PowerShell Tutorial 12 – Part 1: Active Directory Management
http://www.PowerShellpro.com/PowerShell-tutorial-introduction/PowerShell-tutorial-active-directory/ - Mastering PowerShell in your Lunch Break
Day 6: ADSI Connecting to Domains/Computers and Binding to Objects
http://PowerShelllive.com/blogs/lunch/archive/2007/04/04/day-6-adsi-connecting-to-domains-computers-and-binding-to-objects.aspx - Mastering PowerShell in your Lunch Break
Day 7: Manage Users
http://PowerShelllive.com/blogs/lunch/archive/2007/04/05/day-7-manage-Users.aspx - Using System.DirectoryServices to Search the Active Directory
http://msdn.microsoft.com/en-us/library/ms973834.aspx - Example Code für Ranging with IDirectorySearch
http://msdn.microsoft.com/en-us/library/aa705924(VS.85).aspx - Use Active Directory Cmdlets with PowerShell to Find Users
http://blogs.technet.com/b/heyscriptingguy/archive/2011/08/29/use-active-directory-cmdlets-with-PowerShell-to-find-Users.aspx
GC Suche mit Powershell
Für die Powershell habe ich auch ein Beispiel. Hier ist ein Codeschnipsel, mit dem ich einfach den GC finde und befrage und danach zu jedem Objekt ein Feld ausgeben lasse
$root = [system.directoryservices.activedirectory.forest]::getcurrentforest().rootdomain.name $objSearcher = New-Object System.DirectoryServices.DirectorySearcher([ADSI]"GC://$root") #$objSearcher = New-Object System.DirectoryServices.DirectorySearcher([ADSI]"GC://$root",$sourceUser,$sourcepass) $objSearcher.PageSize = 1000 $objSearcher.Filter = "(&(mail=*))" $objSearcher.PropertiesToLoad.Add("mail") | Out-Null $objSearcher.PropertiesToLoad.Add("ProxyAddresses") | Out-Null $colResults = $objSearcher.FindAll() foreach ($objResult in $colResults) { $mail = $objResult.properties.mail[0] write-host "Processing $mail" $adobject = [adsi]$objResult.path write-host "Bound " + $adobject.displayname }
Natürlich kann man mit dem Directory Searcher auch "schmutzig" programmieren und mit einer Zeile ein Objekt instanziieren, Suchbedingungen vorgeben und das Ergebnis erhalten:
(New-Object System.DirectoryServices.DirectorySearcher("Samaccountname=Administrator")).findone()
Schauen Sie sich einfach die verschiedenen Overloads für die Instanzierung des Objekts an. Interessant ist in dem Zuge auch ein weiterer Accelerator, der den Code noch weiter verkürzt.
([adsisearcher]"Samaccountname=Administrator").findone()
Allerdings nutzt dieser Searcher dann wieder nur die Default Domäne des angemeldeten Benutzers und keinen GC. Um dies zu ändern, muss man aber nun New-Object verwenden, da ADSISEARCHER keine erweiterten Konstruktoren kann.
(New-Object System.DirectoryServices.DirectorySearcher([ADSI]"GC://servername","Samaccountname=Administrator")).findone()
So geht es dann auch schnell und relativ schmutzig. Zugegeben, ein Zugriff per Get-ADUser aus den Windows 2008 Commandlets ist strukturierter aber leider auch viel langsamer, da diese Commandlets die Active Directory Web Services nutzen. Aber dafür funktionieren Sie auch über HTTP/HTTPS und benötigen keine direkte LDAP-Verbindung.
-
DirectorySearcher-Konstruktor
http://msdn.microsoft.com/de-de/library/system.directoryservices.directorysearcher.directorysearcher(v=vs.80).aspx - RSAT AD-PowerShell
- Use the PowerShell [adsiSearcher] Type Accelerator
to Search Active Directory
http://blogs.technet.com/b/heyscriptingguy/archive/2010/08/24/use-the-PowerShell-adsisearcher-type-accelerator-to-search-active-directory.aspx - Hey, Scripting Guy! How Can I Search Active Directory from Within Windows PowerShell? http://blogs.technet.com/b/heyscriptingguy/archive/2009/03/17/how-can-i-search-active-directory-from-within-windows-powershell.aspx
- PowerShell Tutorial 12 : Part 1: Active Directory Management
http://www.PowerShellpro.com/PowerShell-tutorial-introduction/PowerShell-tutorial-active-directory/ - Using System.DirectoryServices to Search the Active
Directory
http://msdn.microsoft.com/en-us/library/ms973834.aspx - Example Code für Ranging with IDirectorySearch
http://msdn.microsoft.com/en-us/library/aa705924(VS.85).aspx - PowerShell and ADSI
http://blogs.msdn.com/b/arulk/archive/2006/07/25/678137.aspx
Schreiben und AD-Replikation
Sie können natürlich per PowerShell auch schreiben. Ich kenne alleine drei Optionen
- Native per LDAP/ADSI
Die nutzen einfach das [ADSI]-Objekt - Module ActiveDirectory (addsadministration)
Diese Modul erlaubt über entsprechende Commandlets die Manipulation von LDAP-Daten. - Produkt-Modules
Exchange und Skype for Business bringen natürlich eigene PowerShell-Module zur Verwaltung ihrer Objekte mit, die aber auch Objekte anlegen und löschen können. Gerade Exchange ist das sehr früh (2007) vorgeprescht und kennt neben "New-Mailbox" auch ein "New-User". Leider hat Exchange kein eigenes Präfix vorgesehen, was für Verwirrung sorgen kann.
Anders als beim Lesen müssen Sie beim Schreiben aber die AD-Replikation beachten. Wer z.B. mit einem Commandlet ein Objekt anlegt oder ändert und kurz darauf im gleichen Skript das Objekte wieder liest, könnte veraltete Daten sehen. Mit jedem Aufruf kann nämlich ein anderer Domaincontroller zum Einsatz kommen. Sie müssen also die AD-Replikation abwarten oder immer den gleichen DC nutzen.
Ich mache es daher so, dass ich vor der Änderung an einem Objekt mit das Objekt und einen dazu passenden Domaincontroller der Domäne hole und in einer Variablen speichere. Bei jedem Aufruf gebe ich dann immer den gleichen DC über den Parameter "-DomainController $dcname" vor, der bei den meisten Commandlets vorhanden ist.
Weitere Links
Sehr viele Beispiele und Tools auf dieser Webseite nutzen VBScript und ADSI, um bestimmte Tätigkeiten durchzuführen.
-
PS RSAT
Per PowerShell AD-Objekte verwalten CheckExObjects -
addsadministration
https://docs.microsoft.com/en-us/powershell/module/addsadministration/?view=win10-ps - CheckTracking
- Windows Hilfsprogramme - LDIFDE
- Active Directory Service Interfaces Overview
www.Microsoft.com/adsi - ADSI: Search Filter Syntax
https://msdn.microsoft.com/en-us/library/aa746475(v=vs.85).aspx -
Property Sets in Exchange Server 2007
http://blogs.technet.com/b/exchange/archive/2006/09/14/428922.aspx - RFC 2254, A String Representation of LDAP Search Filters"
- Microsoft® Windows® 2000 - Scripting-Handbuch (Teil 1)
Scripting-Konzepte und -Technologien zur Systemadministration
Kapitel 5- ADSI
http://www.Microsoft.com/germany/technet/datenbank/articles/600361.mspx - SelfADSI
http://www.cerrotorre.de/selfadsi/selfadsi.htm
http://www.selfadsi.de/selfadsi/selfadsi-ldapfilter.htm
http://www.selfadsi.de/User-attributes.htm
http://www.selfadsi.de/group-attributes.htm
http://www.selfadsi.de/selfadsi/selfadsi-att55mbx.htm Exchange 5.5. Felder
SelfADSI - Das LDAP / ADSI Scripting Tutorial Objekt-Attribute lesen
http://www.selfadsi.de/read.htm - ADSI mit Beispielcode und XLS-Übersichten der Attribute
http://www.rlmueller.net/ - AD-Automaten - mit VBScript das Active Directory bearbeiten
WebCast http://go.Microsoft.com/?linkid=4954331 - Scripts to manage Active Directory Users
http://www.activexperts.com/activmonitor/windowsmanagement/Administratorencripts/Usersgroups/Users - http://www.peregrinehw.com/downloads/ldap/test-ldap-gen.pl
- http://www.mimedefang.org/kwiki/index.cgi?Exchange2Access
- http://groups.google.com/group/mailing.postfix.Users/browse_frm/thread/1f0ba481d5216626/c0b1e2142d1b415e
-
HOWTO: Dump out Contacts using CDOEX and ADO
http://blogs.msdn.com/akashb/archive/2008/11/14/howto-dump-out-contacts-using-cdoex-and-ado.aspx -
Managing Active Directory with Windows PowerShell
http://www.PowerShellpro.com/PowerShell-tutorial-introduction/PowerShell-tutorial-active-directory/