Benutzer mit den meisten Antworten
[ADSI + ADSISearcher] Alle ADUser auslesen und gewünschte Felder auslesen

Frage
-
Hallo Powershell-Gurus!
ich bin mal wieder bei euch mit einem neuen Problem. Ich möchte folgende Ausgabe erreichen:
j.kroeger@meinemail.de 6666
j.kroeger2@meinemail.de 6667
usw.Um was handelt es sich jetzt im Detail?
Alle User die sich im AD befinden sollen in einer Text-Datei ausgegeben werden, wobei jeder User eine Zeile darstellt.
Mich interessieren nur zwei Felder vom jeweiligen AD-Objekt:
"Mail" und "Pager"
Und folgendes hab ich jetzt schonmal erreicht:
$Pager = ([ADSI](([AdsiSearcher]"(&(objectClass=user)(sn=Gnutzmann)(givenname=Karen))").FindOne()).Path).Pager $Mail = ([ADSI](([AdsiSearcher]"(&(objectClass=user)(sn=Gnutzmann)(givenname=Karen))").FindOne()).Path).Mail $Mail $Pager #$ADSI = ([adsisearcher]'(objectclass=user)').FindAll().Count $ds=([ADSISearcher]"LDAP://$PDCe") $ds.filter="(&(ObjectCategory=user))" $ds.pagesize=1000 $ds.findall().count
Die Ausgabe sieht dann so aus:
j.kroeger@meinemail.de 6666 LDAP://CN=JKroeger,OU=meineOU,OU=meineOU2,DC=ich,DC=de LDAP://CN=JKroeger2,OU=meineOU,OU=meineOU2,DC=ich,DC=de LDAP://CN=JKroeger3,OU=meineOU,OU=meineOU2,DC=ich,DC=de [usw. also alle User] 3500 (3500 ist dann die gesamte Anzahl, nur ein Kontrollwert)
Irgendwie probiere ich nun Stunde um Stunde herum mit Codeschnipseln hier und Eigenschaften dort. Ich bin froh, dass ich die PageSize endlich eingebunden bekommen habe. Aber die Ausgabe gefällt mir so überhauptnicht!
Da bitte ich um einen Denkanstoß!
Danke
Grüße
Jannis- Bearbeitet Jannis K Mittwoch, 21. August 2013 13:41 Verstöße gegen die Sprachrichtigkeit
Antworten
-
Hallo,
leider schreibst Du nichts ueber deine Umgebung....
Ich wuerde dein Problem so loesen:import-module activedirectory get-aduser -filter * -properties mail,pager | Select-Object Mail, Pager
liefert:
Mail Pager
---- -----
j.kroeger@meinemail.de 6666
j.kroeger2@meinemail.de 6667Beste Gruesse
Brima -
Sorry! Da ich das nur am Bildschirm kontrolliert habe, hatte ich übersehen das $_.Properties.pager und $_.Properties.mail wieder eine collection liefern.
Nun sollte beides gefixt sein.
(ich trinke keinen Kaffee! Die Kaffee Pflanze stellt das Koffein her um Ihre Feinde zu töten! ;-)) )Gefixt und getestet:
# ich bevorzuge es den Adsisearcher zeilenwiese aufzu bauen $ds=[AdsiSearcher]"" $ds.filter="(&(ObjectCategory=user))" $ds.pagesize=1000 $ds.searchRoot = [Adsi]"LDAP://OU=xwsd,OU=ertz,OU=Domain Users,DC=AZT,DC=COM" $ds.PropertiesToLoad.AddRange(@('pager','mail')) # generiert eine Liste (SearchResultCollection) die System.DirectoryServices.SearchResult Objekte enthält $UserListe = $ds.findall() # shau dir im Micosoft Developer Network MSDN die Dokumentation zu # der Klasse System.DirectoryServices.SearchResult an ! $UsrCounter = 0 # User Zähler # Jedes gefundene User SearchResult Objekt einzeln abarbeiten (ForEach) $UserListe | ForEach-Object { # die Variable $_ enthält das Aktuelle (SearchResult) Objekt # hier erstellen wir ein neues Objekt, das nur die gewünschten Properties enthält $Result = New-Object -TypeName PSObject # Ich missbrauche Select-Object um bequem und schnell die benötigten NoteProperties im neuen Objekt zu erstellen $Result = Select-Object pager,mail -InputObject $Result # Properties an das neue Objekt übertragen # die Properties sind etwas tiefer, in dem SearchResult Objekt, in der Properties collection versteckt If($_.Properties.pager.count -gt 0 ) { $Result.pager = $_.Properties.pager[0] } If($_.Properties.mail.count -gt 0) { $Result.mail = $_.Properties.mail[0] } # $Result.pager = $_.Properties.pager[0] # $Result.mail = $_.Properties.mail[0] # User Zähler hochzählen $UsrCounter++ # User Zähler anzeigen Write-Host $UsrCounter # Result Objekt ausgeben If($Result.mail -or $Result.pager) { $Result } # ausgabe des $Result Objektes in eine Textdatei im CSV format (ohne den Zähler) # jeder User eine Zeile } | Export-Csv -NoTypeInformation -Path "c:\Temp\users.csv"
Please click “Mark as Answer” if my post answers your question and click “Vote As Helpful” if my Post helps you.
Bitte markiere hilfreiche Beiträge von mir als “Als Hilfreich bewerten” und Beiträge die deine Frage ganz oder teilweise beantwortet haben als “Als Antwort markieren”.
My PowerShell Blog http://www.admin-source.info
[string](0..21|%{[char][int]([int]("{0:d}" -f 0x28)+('755964655967-86965747271757624-8796158066061').substring(($_*2),2))})-replace' '
German ? Come to German PowerShell Forum!- Als Antwort markiert Jannis K Freitag, 23. August 2013 08:03
Alle Antworten
-
Hallo,
leider schreibst Du nichts ueber deine Umgebung....
Ich wuerde dein Problem so loesen:import-module activedirectory get-aduser -filter * -properties mail,pager | Select-Object Mail, Pager
liefert:
Mail Pager
---- -----
j.kroeger@meinemail.de 6666
j.kroeger2@meinemail.de 6667Beste Gruesse
Brima -
Guten Morgen Brima,
da muss ich mal ganz blöd fragen, was du wissen möchtest...
Aber zur vorgeschlagenen Lösung habe ich persönlich nichts, gebe ich es allerdings so in Powershell ein kommt dabei etwas raus was ich eigentlich nicht wollte:
___________________________________________________
j.kroeger@meinemail.de 6666j.kroeger2@meinemail.de 6667
j.kroeger3@meinemail.de 6668
___________________________________________________
soll bedeuten, es wird nicht durch ein Leerzeichen getrennt und es gibt teilweise Lücken von mehreren Zeilen... (die Lücken entstehen vermutlich durch das Auslesen von Gruppen, in denen aber garkeine User zu finden sind.)
Und ich glaube das ganze hat bei mir nur funktioniert, weil ich die RSAT installiert habe korrekt?
Ich habe den Ansatz mit dem ADSI bzw. ADSISearcher gewählt, weil ich die RSAT nicht überall nutzen kann, wo das Skript hinterher ausgeführt werden soll. Ich glaube das meinst du mit Umgebung oder?
Ansonsten nutzen hier alle Powershell 2.0.Das ganze mit dem ActiveDirectory-Modul zu regeln wäre so entspannt gewesen, trotzdem vielen Dank!
Guten Morgen nochmal
Jannis -
Hallo Jannis!
Um das Objekt kennen zu lernen mit dem du Arbeiten möchtest solltest du immer erst einmal Get-Member benutzen!
# Leeren Adsi searcher erstellen um in mit Get-Member zu analysieren [AdsiSearcher]"" | Get-Member
Get-Member zeigt dir in der ersten Zeile der Ausgabe welche .NET Klasse zum Erstellen des Objektes benutzt wurde.
Der [AdsiSearcher] Accelerator erstellt ein .NET Objekt vom Typ System.DirectoryServices.DirectorySearcher.
Man sollte sich dann immer unbedingt die Dokumentation der .NET Klasse mit der diese Objekt erstellt wurde ansehen.Dazu gibt man in Google den gesamten Klassen (Typ) Namen ein: System.DirectoryServices.DirectorySearcher
Dann findet man im Microsoft Developer Network (MSDN) die Dokumentation zu dem Typ (Klasse)
http://msdn.microsoft.com/de-de/library/system.directoryservices.directorysearcher_members%28v=vs.80%29.aspx
Dort siehst du was und wie du alles verwenden kannst (Member).
Das Active Directory liefert nur bestimmte Standard Attribute zurück. Alle anderen Attribute müssen gesondert angefordert werden.
In der Klassen Dokumentation zum AdsiSearcher siehst du, dass es eine Eigenschaft (Property) gibt, die "PropertiesToLoad" heißt.
Damit kannst du angeben dass du die Attribute Pager und Mail mit nur einem Abruf holen kannst!# ich bevorzuge es den Adsisearcher zeilenwiese aufzu bauen $ds=[AdsiSearcher]"" $ds.filter="(&(ObjectCategory=user))" $ds.pagesize=1000 $ds.searchRoot = [Adsi]"LDAP://OU=xwsd,OU=ertz,OU=Domain Users,DC=AZT,DC=COM" $ds.PropertiesToLoad.AddRange(@('pager','mail')) # generiert eine Liste (SearchResultCollection) die System.DirectoryServices.SearchResult Objekte enthält $UserListe = $ds.findall() # shau dir im Micosoft Developer Network MSDN die Dokumentation zu # der Klasse System.DirectoryServices.SearchResult an ! $UsrCounter = 0 # User Zähler # Jedes gefundene User SearchResult Objekt einzeln abarbeiten (ForEach) $UserListe | ForEach-Object { # die Variable $_ enthält das Aktuelle (SearchResult) Objekt # hier erstellen wir ein neues Objekt, das nur die gewünschten Properties enthält $Result = New-Object -TypeName PSObject # Ich missbrauche Select-Object um bequem und schnell die benötigten NoteProperties im neuen Objekt zu erstellen $Result = Select-Object pager,mail -InputObject $Result # Properties an das neue Objekt übertragen # die Properties sind etwas tiefer, in dem SearchResult Objekt, in der Properties collection versteckt $Result.pager = $_.Properties.pager $Result.mail = $_.Properties.mail # User Zähler hochzählen $UsrCounter++ # User Zähler anzeigen Write-Host $UsrCounter # Result Objekt ausgeben $Result # ausgabe des $Result Objektes in eine Textdatei im CSV format (ohne den Zähler) # jeder User eine Zeile } | Export-Csv -NoTypeInformation -Path "c:\Temp\users"
Please click “Mark as Answer” if my post answers your question and click “Vote As Helpful” if my Post helps you.
Bitte markiere hilfreiche Beiträge von mir als “Als Hilfreich bewerten” und Beiträge die deine Frage ganz oder teilweise beantwortet haben als “Als Antwort markieren”.
My PowerShell Blog http://www.admin-source.info
[string](0..21|%{[char][int]([int]("{0:d}" -f 0x28)+('755964655967-86965747271757624-8796158066061').substring(($_*2),2))})-replace' '
German ? Come to German PowerShell Forum!
- Bearbeitet Peter Kriegel Freitag, 23. August 2013 05:29 jhgjhztzt
-
Hallo,
ja genau, das meinte ich mit Umgebung. Wenn du die RSAT nicht ueberall nutzen kannst bleibt dir nur der Weg ueber ADSI, oder es gibt auch z.B.: von Quest ein AD Modul mit AD CMDlets, das dann aber auch auf den Systemen bekannt sein muss.
Peter hat dir bereits eine Loesung und Erkalerungen geliefert, wie es mit ADSI geht.Zu meiner Loesung, die Ausgabe um die Leerzeilen, also User die keine Mail und Pager Adresse zu bereiningen ist easy.
get-aduser -filter * -properties mail, pager | Where-Object {$_.Mail -ne $Null} | Select-Object Mail, Pager
Und deine Ausgabe kannst Du z.B.: so erhalten:
get-aduser -filter * -properties mail,pager | Where-Object {$_.Mail -ne $Null} | ForEach-Object {"$($_Mail) $($_.Pager)"}
Beste Gruesse
brima
* Properties eingeschraenkt,danke Peter
- Bearbeitet brima Donnerstag, 22. August 2013 15:57
-
@brima
Bitte nicht immer die Sterne * benutzen!
Dies belastet die Domänen Controller unnötig.
In diesem Fall ist der Stern beim Parameter -Filter nötig, aber nicht bei den -Properties!
Man sollte immer nur die Daten holen, die auch benötigt werden.
Get-ADuser -filter * -properties mail,pager | Where-Object {$_.Mail -ne $Null} | Select-Object Mail,Pager
Please click “Mark as Answer” if my post answers your question and click “Vote As Helpful” if my Post helps you.
Bitte markiere hilfreiche Beiträge von mir als “Als Hilfreich bewerten” und Beiträge die deine Frage ganz oder teilweise beantwortet haben als “Als Antwort markieren”.
My PowerShell Blog http://www.admin-source.info
[string](0..21|%{[char][int]([int]("{0:d}" -f 0x28)+('755964655967-86965747271757624-8796158066061').substring(($_*2),2))})-replace' '
German ? Come to German PowerShell Forum!- Bearbeitet Peter Kriegel Donnerstag, 22. August 2013 11:20 qwqqweq
-
Nabend,
kennt ihr beiden das Gesicht eines Honigkuchenpferdes?
Stellt euch vor so sitze ich nun vor dem Bildschirm!DANKE!
Und wieder kann ich mehr mitnehmen als ich wissen wollte... mit dem Rechercheauftrag werde ich hoffentlich auch mal meine Startschwierigkeiten endlich in den Griff bekommen und kann mich auch hier mal darauf konzentrieren mehr zu stöbern als zu stochern!
Ich bin jetzt im wohl verdienten Feierabend und melde mich dann morgen nochmal, um dann auch die Antwort zu markieren.
Habt einen schönen Abend!Grüße
Jannis -
Moin moin,
heute morgen hab ich voller Vorfreude mal das Skript von Peter angepasst bzw. ausprobiert!
Leider kommt in der CSV nur folgendes bei rum:
"pager","mail" ,"System.DirectoryServices.ResultPropertyValueCollection" ,"System.DirectoryServices.ResultPropertyValueCollection" ,"System.DirectoryServices.ResultPropertyValueCollection" ,"System.DirectoryServices.ResultPropertyValueCollection" ,"System.DirectoryServices.ResultPropertyValueCollection" ,"System.DirectoryServices.ResultPropertyValueCollection" ,"System.DirectoryServices.ResultPropertyValueCollection"
und bei einigen wenigen (das ist aber normal)
"System.DirectoryServices.ResultPropertyValueCollection","System.DirectoryServices.ResultPropertyValueCollection"
Ich hab auch die Lücken wie bei brima zwischen drin...
Ich hab das Ganze mal versucht gehabt herauszufiltern:
$Result = Select-Object pager,mail -InputObject $Result | Where-Object {$_.Mail -ne $Null}
Mit dem "Where-Object", dabei ist dann wenigstens mal eine Fehlermeldung gekommen:
270 Die Eigenschaft "pager" wurde für dieses Objekt nicht gefunden. Vergewissern Sie sich, dass es die Eigenschaft gibt und dass sie festgelegt werden kann. In C:\Users\kroegerj\Desktop\ADPagerUndMailAuslesen.ps1:23 Zeichen:2 + $Result.pager = $_.Properties.pager + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : InvalidOperation: (:) [], RuntimeException + FullyQualifiedErrorId : PropertyNotFound Die Eigenschaft "mail" wurde für dieses Objekt nicht gefunden. Vergewissern Sie sich, dass es die Eigenschaft gibt und dass sie festgelegt werden kann. In C:\Users\kroegerj\Desktop\ADPagerUndMailAuslesen.ps1:24 Zeichen:2 + $Result.mail = $_.Properties.mail + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : InvalidOperation: (:) [], RuntimeException + FullyQualifiedErrorId : PropertyNotFound
Aber das kann ja eigentlich nicht sein...
... denn ich hab doch so:
$Pager = ([ADSI](([AdsiSearcher]"(&(objectClass=user)(sn=Gnutzmann)(givenname=Karen))").FindOne()).Path).Pager $Mail = ([ADSI](([AdsiSearcher]"(&(objectClass=user)(sn=Gnutzmann)(givenname=Karen))").FindOne()).Path).Mail
Die Pager und Mail bekommen!
Und hier sind auch keine weiteren Properties gelistet:
http://www.selfadsi.de/user-attributes.htmBin ich einfach nur Blind?
Guten Morgen und ich hoffe der erste Kaffee ist schon getrunken!
Jannis -
Sorry! Da ich das nur am Bildschirm kontrolliert habe, hatte ich übersehen das $_.Properties.pager und $_.Properties.mail wieder eine collection liefern.
Nun sollte beides gefixt sein.
(ich trinke keinen Kaffee! Die Kaffee Pflanze stellt das Koffein her um Ihre Feinde zu töten! ;-)) )Gefixt und getestet:
# ich bevorzuge es den Adsisearcher zeilenwiese aufzu bauen $ds=[AdsiSearcher]"" $ds.filter="(&(ObjectCategory=user))" $ds.pagesize=1000 $ds.searchRoot = [Adsi]"LDAP://OU=xwsd,OU=ertz,OU=Domain Users,DC=AZT,DC=COM" $ds.PropertiesToLoad.AddRange(@('pager','mail')) # generiert eine Liste (SearchResultCollection) die System.DirectoryServices.SearchResult Objekte enthält $UserListe = $ds.findall() # shau dir im Micosoft Developer Network MSDN die Dokumentation zu # der Klasse System.DirectoryServices.SearchResult an ! $UsrCounter = 0 # User Zähler # Jedes gefundene User SearchResult Objekt einzeln abarbeiten (ForEach) $UserListe | ForEach-Object { # die Variable $_ enthält das Aktuelle (SearchResult) Objekt # hier erstellen wir ein neues Objekt, das nur die gewünschten Properties enthält $Result = New-Object -TypeName PSObject # Ich missbrauche Select-Object um bequem und schnell die benötigten NoteProperties im neuen Objekt zu erstellen $Result = Select-Object pager,mail -InputObject $Result # Properties an das neue Objekt übertragen # die Properties sind etwas tiefer, in dem SearchResult Objekt, in der Properties collection versteckt If($_.Properties.pager.count -gt 0 ) { $Result.pager = $_.Properties.pager[0] } If($_.Properties.mail.count -gt 0) { $Result.mail = $_.Properties.mail[0] } # $Result.pager = $_.Properties.pager[0] # $Result.mail = $_.Properties.mail[0] # User Zähler hochzählen $UsrCounter++ # User Zähler anzeigen Write-Host $UsrCounter # Result Objekt ausgeben If($Result.mail -or $Result.pager) { $Result } # ausgabe des $Result Objektes in eine Textdatei im CSV format (ohne den Zähler) # jeder User eine Zeile } | Export-Csv -NoTypeInformation -Path "c:\Temp\users.csv"
Please click “Mark as Answer” if my post answers your question and click “Vote As Helpful” if my Post helps you.
Bitte markiere hilfreiche Beiträge von mir als “Als Hilfreich bewerten” und Beiträge die deine Frage ganz oder teilweise beantwortet haben als “Als Antwort markieren”.
My PowerShell Blog http://www.admin-source.info
[string](0..21|%{[char][int]([int]("{0:d}" -f 0x28)+('755964655967-86965747271757624-8796158066061').substring(($_*2),2))})-replace' '
German ? Come to German PowerShell Forum!- Als Antwort markiert Jannis K Freitag, 23. August 2013 08:03
-
Genial! Einfach mal 3800 User ausgelesen. Btw in abgespeckter Form habe ich heute auch schon mir eine Liste von einem User und seinen "MemberOf" ausgeben lassen.
Das macht richtig Spaß!Vielen dank euch zwei, und natürlich insbesondere dir Peter!
Jannis
P.S.: Ich knobel jetzt mal mit Lotus Notes und E-Mails senden via Powershell ;-)
Wenn es da etwas gibt, gibts auch ne neue Frage. Aber ich bin da guter Dinge!Schönes Wochenende!
- Bearbeitet Jannis K Freitag, 23. August 2013 08:04