NicR 0 Geschrieben 30. April 2016 Melden Teilen Geschrieben 30. April 2016 (bearbeitet) Moin Moin und Hallo Ich möchte aus dem AD folgende Ausgabe (per csv) erstellen: Name,Proxyaddresses --> Sortiert nach OU (oder per AD-Attribut das bei uns gesetzt ist mit "Office") Ich hole mir also die OU´s per Parameter und frage per PowerGUI (von Dell) wie folgt ab Get-QADuser -Searchroot $SITE | where-object {$_.Notes -like "*MBX:STD*" } | Select-Object Office,Name, @{L = "ProxyAddresses"; E = { $_.ProxyAddresses -join ","}} | Export-csv -Path "C:\powershell\Mails.csv" -notypeinformation -Append) $SITE holt sich alle OU´s und das klappt auch. Das Where Object ist dazu da, nur Useraccounts mit gesetzten Mailboxen zu filtern.Die Ausgabe des Select-Object / Export-CSV entspricht aber nicht dem was ich möchte. Die Proxyaddresses sind teilweise falsch sortiert (smtp:xxx.xxx@xxx.de;sip:xxxx.xxxx@xxx.de;SMTP:xxx.xxx@xxx.de) --> Mal steht SIP an erster Stelle, mal hinten, mal in der Mitte.Dadurch ist ein vergleich in Excel mit viel manueller Arbeit verbunden.Hintergrund dieser Aktion: Fusionierung zweier Maildomänen. Es gibt teilweise (durch Namensänderungen etc.) mehr als die Primäre und Sekundäre Mailadresse (xxx.de und yyy.de), so das die sekundäre nicht immer gleich der primären Addresse ist. Max.Mustermann@xxx.de ist/wird zu Max.Mustermann.1@yyy.de. Ich muss also irgendwie die SMTP,smtp,sip sortiert bekommen um diese in Excel vergleichen zu können bzw. als Königsklasse nur Unterschiede der smtp/SMTP namen ausgegeben lassen. Hat jemand einen besseren Lösungsansatz als diesen hier?# Bisherige Ausgabe: "DEU",Max Mustermann","smtp:max.mustermann@xxx.de,sip:max.mustermann@yyy.de,SMTP:max.mustermann@yyy.de" mit den Präfixes smtp/sip/SMTP kann excel ja auch nicht umgehen.Idealerweise sollte es so aussehen damit ich mein Ziel erreicht habe. OFFICE | Name | SMTP | SIP | smtp | weitere mögliche DEU | Max Mustermann | Max.Mustermann | Max.Mustermann |Max.Mustermann | Max.Musterfrau Kurzum. Wie kriege ich die Proxyaddresses separiert und sortiert in Variablen damit man diese mit z.b. Write-Output sauber dargestellt bekommt. $xxxDomain =$yyyDomain =$SIP = Ich hoffe das war nicht zu verwirrend und sage schon einmal danke für etwaige Ideen und erholsames Wochenende Nic bearbeitet 30. April 2016 von NicR Zitieren Link zu diesem Kommentar
blub 115 Geschrieben 30. April 2016 Melden Teilen Geschrieben 30. April 2016 Hallo Nic, Willkommen an Board! Anstelle dieser Custom Columns (L= ..., E= ...) finde ich PSObjects oder PSCustomerObjects deutlich übersichtlicher und flexibler Ich habe mir mal ein Beispiel geklaut: $Path = "c:\temp" $Directory = Get-Acl -Path $Path $Dirs = @() ForEach ($Dir in $Directory.Access){ $PSDir = [PSCustomObject]@{ Path = $Path Owner = $Directory.Owner Group = $Dir.IdentityReference AccessType = $Dir.AccessControlType Rights = $Dir.FileSystemRights }#EndPSCustomObject $Dirs += $PSDir #befüllen des Arrays mit einem PSCustomObjects pro Foreach-Durchlauf }#EndForEach $Dirs | ft Path,Owner #$Dirs | Export-CSV ... #see http://powershell.org/wp/kb/new-object-psobject-vs-pscustomobject/ Hier hast du für jede Property innerhalb der Foreach-Schleife eine eigene Zeile (die sogar auf eine eigene Function verweisen könnte). Am Ende hast du dann ein Array ($Dirs), welches du bequem ausgeben oder weiterverarbeiten kannst. Du kannst dir so Spalten für "OFFICE | Name | SMTP | SIP | smtp | weitere mögliche" übersichtlich erzeugen und zeilenweise befüllen. blub Zitieren Link zu diesem Kommentar
NicR 0 Geschrieben 2. Mai 2016 Autor Melden Teilen Geschrieben 2. Mai 2016 Danke schon einmal Blubb Nach deinem Tip bin ich soweit: $users = Get-QADUser -SearchRoot ‘ou=1stlevel,DC=123,dc=456,dc=3434’ -sizelimit 0 -Properties proxyaddresses | Where-Object {$_.Notes -like "*MBX:STD*" } $maxProxy = $users | %{$_.proxyaddresses.count} | Sort-Object | Select-Object -Last 1 foreach ($u in $users) { $proxyaddress = [ordered]@{} $proxyaddress.Add("User",$u.name) for ($i=0; $i -le $maxProxy; $i++) { $proxyaddress.add("proxyaddress_$i",$u.proxyaddresses[$I]) } #end for [pscustomobject]$proxyAddress | Export-Csv -Path C:\powershell\Mails.csv -delimiter "`t" -NoTypeInformation –Append -Force #$proxyaddress #just to see if it made it this far. Remove-Variable -Name proxyAddress } Bei Output fehlt mir jetzt jedoch das "Office" --> Ich kriege diesen Property nicht eingebaut.. Der Output ist leider noch nicht sortiert, d.h. SIP,SMTP,smtp sind immer noch durcheinander. Hast du da auch noch einen Denkanstoss? Zitieren Link zu diesem Kommentar
PowerShellAdmin 169 Geschrieben 3. Mai 2016 Melden Teilen Geschrieben 3. Mai 2016 (bearbeitet) Steht doch oben Arraylist aufbauen, diese mit entsprechenden Objekten in einer Schleife befüllen. Verwende dieses Verfahren eigentlich immer mit Mengen. Die Arraylist kann man im Anschluss wunderbar auswerten, in Flatfiles packen, DB Schreiben usw.. Reihenfolge für Ausgabe anpassen ordnen: [Arraylist]| Select-Object [Attribut1],[Attribut2],[Attribut3] Sortieren: [Arraylist] | Sort-Object [Attribut] Damit wählst du die Reihenfolge aus, sortierst und gibst eine CSV aus dieser Menge aus -z.B.: $Arraylist | Select-Object kdnr, lastname, surname | Sort-Object kdnr |Export-CSV $csv_export -encoding unicode -Delimiter ';' -NoTypeInformation Wenn du die Gänse weghaben willst im Anschluss die CSV nochmal bereinigen - ging mit der CSV-Export nicht so einfach... (gc $export_csv) | % {$_ -replace '"', ""} | out-file $export_csv -Fo -En unicode Ein Objekt aufbauen finde ich so übersichtlicher- hatte aber auch Blub bereits eingeworfen: #init a object for the userdetails $user_details = New-Object PSObject -Property @{ Kennnummer=$user.UserPrincipalName Vorname=$user.GivenName Nachname=$user.surname Email=$user.EmailAddress } Skriptcode gehört auch kommentiert und sauber formatiert. Lesbarkeit ? Ich habe ein Template für meine Skripte, wo pauschal eine Trap konfiguriert ist, welche Loging oder auch Mails verschickt. Wenn ich mal mehr benötige, packe ich in meinen Skript ne Try Catch... Aber ein wenig Ordnung sollte man auch beim Skripten haben ... Aus Interesse - wieso nutzt du QAD ? Gab es hier Limits mit der Standard Abfrage ? (gibt mit den nativen Powershell Abfragen hier und da mal Limits ) Wahrscheinlich weil du dir alles schnell zurecht kopiert hast und dich nun wunderst, dass es nicht läuft ;) ? Ich bin kein Freund von 3rd Party, soweit es bereits nativ unterstützt ist und die Abfragemenge nicht in ein Limit läuft, sollte man es auch nutzen. Hatte hier auch schon Kundenprojekte, da sind solche Lösungen unpassend und oftmals nicht erwünscht. Get-ADUser -Filter * -SearchBase "OU=Finance,OU=UserAccounts,DC=FABRIKAM,DC=COM" -Properties proxyaddresses bearbeitet 3. Mai 2016 von PowerShellAdmin Zitieren Link zu diesem Kommentar
NicR 0 Geschrieben 3. Mai 2016 Autor Melden Teilen Geschrieben 3. Mai 2016 Danke PowerShellAdmin Um eines Voraus zu schicken: Ich selber ordne mich noch bei den Anfängern zur Powershell einDaher bin mir nicht sicher, ob ich das richtig verstehe: $Arraylist | Select-Object kdnr, lastname, surname | Sort-Object kdnr |Export-CSV $csv_export -encoding unicode -Delimiter ';' -NoTypeInformation Ich habe aber Probleme (oder besser,verstehe es nicht) , die Daten aus dem Attribut "proxyaddresses" zu sortieren.Da kommen ja (bei uns bis zu 6 oder 8) Werte aus einem Attribut, wie oben beschrieben. Die Attribute selbst zu sortieren ist "okay" aber die Werte aus den Attributen ... :confused: Zur Kommetierung: Asche auf mein Haupt. Du hast Recht. Wird gleich umgesetzt. :thumb1: QAD: Es wird oftmals für Anfänger empfohlen, weil es meiner Ansicht hilft , die ersten Schritte erfolgreicher zu machen. Ich habe damit angefangen ein paar kleine Auswertungen zu machen und habe mich über die Vereinfachung mancher Parameter erfreut. (get-qaduser -enabled, Password-dates etc.) Die Anzeige der Variablen im rechten Seitenfenster , sowie die schnellen "Hilfe-ballons" sind für mich sehr hilfreich. Ja, ein Teil des Scriptes ist zusammengesucht, da ich ehrlicherweise dieses Multivalue-Zeugs nicht bearbeitet bekomme! :nene: Einfache Dinge laufen schon "gut" aber ich möchte mich dem Weg zu den anspruchsvolleren Scripten nicht verweigern. Ich finde gefallen an der Powershell und bin wohl zu spät damit angefangen es zu lernen. Wenn du also noch ein Tip für das Sortierungsproblem innerhalb eines Attributes hättest, werde ich mich freuen! Danke Zitieren Link zu diesem Kommentar
PowerShellAdmin 169 Geschrieben 3. Mai 2016 Melden Teilen Geschrieben 3. Mai 2016 (bearbeitet) Also anbei ist ein funktionales Beispiel von mir - sehe es als Vorschlag, das sollte eigentlich noch nicht die fertige Lösung sein ;) Ich habe es nur schnell zusammengetippt und man kann noch einiges verbessern. z.B.: -Getaduser nur auf aktive Mitglieder -Auswertung SIP Adressen -Sekundäre Adressen Ausgabe -Weitere Benutzerattribute (z.B. Kennung etc) -Ausgabe in Grid, CSV etc Ausgabe: user_name mail_prim_smtp mail_sek_smtp mail_sip --------- -------------- ------------- -------- Tester, Nummer1 tester.nummer1@domain.tld Tester, Nummer2 tester.nummer2@domain.tld tester.nummer2@domain2.tld #Konsole bereinigen cls #Arraylist erzeugen $user_list=New-Object System.Collections.ArrayList #Abfrage Benutzer $users=Get-ADUser -Filter * -SearchBase "OU=Mitarbeiter,DC=xxx,DC=xxx,DC=xxx" -Properties proxyaddresses, mail | where-object mail -ne $NULL #Schleife geht durch sämtliche Benutzer foreach($user in $users){ #Varibalen NULLEN $mail_prim_smtp=$NULL $mail_sek_smtp=$NULL $mail_sip=$NULL #Schleife arbeitet die Einträge im Attribut ab (innerhalb Benutzer) foreach($mail in $user.proxyaddresses){ #Eintrag enthält eine Adresse #$Mail #prüft ob es NICHT die primäre Adresse ist IF($mail -notmatch $user.mail){ #prüft ob es eine SMTP Adresse ist IF($mail -match 'smtp:'){ $mail_sek_smtp+=$mail.Substring(5,($mail.Length-5))+' ' } } } #Benutzerobjekt erzeugen $user_details = New-Object PSObject -Property @{ user_name=$user.Name #primäre email aus Benutzer ermittelt mail_prim_smtp=$user.mail mail_sek_smtp=$mail_sek_smtp mail_sip=$mail_sip } #Benutzerobjekt Arraylist hinzufügen $user_list+=$user_details } #Ausgabe $user_list | Select-Object user_name, mail_prim_smtp, mail_sek_smtp, mail_sip |Sort-Object user_name bearbeitet 3. Mai 2016 von PowerShellAdmin Zitieren Link zu diesem Kommentar
Beste Lösung NicR 0 Geschrieben 10. Mai 2016 Autor Beste Lösung Melden Teilen Geschrieben 10. Mai 2016 Hallo Ich denke ich kann das nun als gelöst markieren. Folgenden Code habe ich (DANKE, PowerShellAdmin) benutzt: #Konsole bereinigen cls #Arraylist erzeugen $user_list=New-Object System.Collections.ArrayList $user_list_control=New-Object System.Collections.ArrayList #Abfrage Benutzer $users=Get-ADUser -LDAPFilter {(!useraccountcontrol:1.2.840.113556.1.4.803:=2)} -SearchBase "DC=XX,DC=XXX,DC=XXX" -Properties office,proxyaddresses, mail | where-object mail -ne $NULL #Schleife geht durch sämtliche Benutzer foreach($user in $users){ #Varibalen NULLEN $mail_prim_smtp=$NULL $mail_sek_smtp=$NULL $mail_sip=$NULL #Schleife arbeitet die Einträge im Attribut ab (innerhalb Benutzer) foreach($mail in $user.proxyaddresses){ #Eintrag enthält eine Adresse #$Mail #prüft ob eine 2 in einer emailadresse enthalten ist und initiert parameter zum eintrag in kontrollliste IF($mail -match "2"){ $control="1" } #prüft ob es NICHT die primäre Adresse ist IF($mail -notmatch $user.mail){ #prüft ob es eine SMTP Adresse ist IF($mail -match 'smtp:'){ $mail_sek_smtp+=$mail.Substring(5,($mail.Length-5))+'' } } } #Benutzerobjekt erzeugen $user_details = New-Object PSObject -Property @{ user_name=$user.Name #primäre email aus Benutzer ermittelt mail_prim_smtp=$user.mail mail_sek_smtp=$mail_sek_smtp office=$user.Office } #Nutzernamen Anteil vergleichbar machen durch kürzen der Domain $user_sek_email_name=$mail_sek_smtp.replace("@SEK_DOMAIN.com","") $user_prim_email_name=$user.mail.replace("@PRI_DOMAIN.com","") #Benutzerobjekt Arraylist hinzufügen, wenn prim und sek Adresse ungleich if( $user_sek_email_name -ne $user_prim_email_name) { $user_list+=$user_details } #Ausgabe wenn Kontrollparameter control =1 IF($control -eq "1"){ $user_list_control+=$user_details $control="0" } } #Ausgabe kontrolliste $user_list_control | Select-Object office, user_name, mail_prim_smtp, mail_sek_smtp | Sort-Object user_name | Export-Csv -Path c:\powershell\Mailaddress_to_check_control.txt -Append -NoTypeInformation #Ausgabe $user_list | Select-Object office, user_name, mail_prim_smtp, mail_sek_smtp | Sort-Object user_name | Export-Csv -Path c:\powershell\Mailaddress_to_check.txt -Append -NoTypeInformation Für mich habe ich den zusätzlichen Punkt "Wenn Mailadressen eine Ziffer enthält, erzeuge eine weitere Datei" Das heisst hier (bei uns) das ein Benutzer schon "doppelt" existiert.Ich habe mir noch zur Aufgabe gemacht, die "Sekundären Addresses" zu separieren, damit das irgendwie eleganter wird. Aktuell wird das im Output als eine lange Zeile dargestellt, jedoch möchte ich erstmal Feedback geben.Vielen Dank für die Hilfe, ich hoffe ich kann da anderweitig auch mal helfen! Zitieren Link zu diesem Kommentar
Empfohlene Beiträge
Schreibe einen Kommentar
Du kannst jetzt antworten und Dich später registrieren. Falls Du bereits ein Mitglied bist, logge Dich jetzt ein.