Jump to content

Multivalue aus AD, Proxyaddresses formatieren


Direkt zur Lösung Gelöst von NicR,
Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Empfohlene Beiträge

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 von NicR
Link zu diesem Kommentar

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

Link zu diesem Kommentar

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?

Link zu diesem Kommentar

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 von PowerShellAdmin
Link zu diesem Kommentar

Danke PowerShellAdmin

 

Um eines Voraus zu schicken: Ich selber ordne mich noch bei den Anfängern zur Powershell ein
Daher 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

Link zu diesem Kommentar

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 von PowerShellAdmin
Link zu diesem Kommentar
  • Beste Lösung

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!

Link zu diesem Kommentar
Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Schreibe einen Kommentar

Du kannst jetzt antworten und Dich später registrieren. Falls Du bereits ein Mitglied bist, logge Dich jetzt ein.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor-Fenster leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

×
×
  • Neu erstellen...