Ich versuche, mithilfe von Powershell einige Informationen aus Active Directory abzurufen, aber es kommt zu einem seltsamen Verhalten. Hier ist mein Skript:
$toFind = ( 'bobjones', 'samsmith' )
filter Get-AdUser {
$strFilter = "(&(objectCategory=User)(sAMAccountName=$_))"
$objDomain = New-Object System.DirectoryServices.DirectoryEntry
$objSearcher = New-Object System.DirectoryServices.DirectorySearcher
$objSearcher.SearchRoot = $objDomain
$objSearcher.PageSize = 1000
$objSearcher.Filter = $strFilter
$colProplist = ("name", "department")
foreach ($i in $colPropList){$objSearcher.PropertiesToLoad.Add($i)}
($objSearcher.FindAll() | %{$_.Properties})
}
"paul" | get-aduser # Works
$toFind | get-aduser # Doesn't work?!
Ersteres gibt das aus, was ich erwarte, nämlich eine Tabelle mit Eigenschaften; letzteres gibt am Ende nur wiederholt „0 1“ aus, obwohl ich nicht sicher bin, warum. Warum sollte der Einzelfall funktionieren, aber nicht das Array?
Antwort1
Sie möchten den globalen Katalog abfragen, da Sie den gesamten Forest durchsuchen möchten. Es gibt mehrere Ansätze, aber der einfachste ist, Ihre Suchwurzel auf den GC zu ändern. Beispiel:
$objSearcher.SearchRoot = [ADSI]"GC://$($objDomain.Name)"
Alternativ können Sie den Forest abfragen und ihn dann nach einer Liste globaler Kataloge fragen und einen davon als ersten Verzeichniseintrag verwenden, aber das ist eine recht einfache Änderung, die das gewünschte Ergebnis liefert, vorausgesetzt, die Felder, nach denen Sie suchen, befinden sich im GC. Der Suchteil sollte in Ihrem Fall kein Problem darstellen, da Sie nach Benutzernamen suchen, der standardmäßig global ist, aber Sie erhalten das Feld „Abteilung“ nicht aus dem Suchergebnis zurück, da die Abteilung standardmäßig nicht global ist. Um es zu erhalten, müssen Sie den Distinguished Name aus dem Suchergebnis verwenden, um eine nachfolgende AD-Suche in der Benutzerdomäne für das vollständige AD-Benutzerobjekt durchzuführen und dann die Abteilung daraus zu ziehen. Sie könnten Ihr Schema so ändern, dass die Abteilung global ist, aber das wäre meiner Meinung nach etwas radikal.
Eine vollständige Liste derStandardmäßige globale Attribute hier.
Antwort2
Möglicherweise müssen Sie eine Foreach-Schleife angeben, etwa wie foreach ($user in $toFind) { get-aduser $user }
Was passiert, wenn Sie in der Eingabeaufforderung einfach $toFind eingeben? Ich gehe davon aus, dass beide Namen aufgelistet werden, einer pro Zeile, wie es sein sollte.
Ich habe versucht, denselben Code für mein AD auszuführen und habe die folgenden Ergebnisse erhalten: 0 1
Name Wert ---- ----- Name {Sahnti L. Aphil} Adspath {LDAP://CN=Sahnti L. Aphil,OU=Benutzer,OU=Jackson,DC=Unternehmen,DC=Lokal} 0 1 Name {Hamong Justice} Adspath {LDAP://CN=Hamong Justice,OU=Benutzer,OU=Jackson,DC=Unternehmen,DC=Lokal}
Antwort3
Nur eine Randbemerkung: Ich würde dringend empfehlen, einen Blick auf das Quest AD-Cmdlets-Paket zu werfen (http://www.quest.com/powershell/activeroles-server.aspx) für alle AD-bezogenen Powershell-Dinge. Es füllt eine Lücke, da die integrierte AD-Unterstützung in Powershell ziemlich mies ist. Es wird Ihnen viel Entwicklungszeit sparen.
Antwort4
Zu Ihrer Information: Der Grund, warum Sie die Ausgabe 0 und 1 erhalten, liegt darin, dass der Aufruf von $objSearcher.PropertiesToLoad.Add() den Index der hinzugefügten Eigenschaft zurückgibt (0 für die erste Eigenschaft, 1 für die zweite). Dies geschieht einmal für jeden Benutzer in Ihrem Skript. Sie können den Rückgabewert unterdrücken, indem Sie ihn an Out-Null weiterleiten.