h41msh1c0r
Goto Top

Powershell Get-ADUser Export in angepasstem CSV mag nicht

Moin in die Runde,

Ziel:
Nutzer mit get-aduser und passende Mitgliedschaften auslesen und formatiert in CSV ausgeben. Allerdings so das im exportierten CSV die Gruppen auf einzelne Spalten verteilt werden.

Spalte1 Spalte2      Spalte 3 .....
User1    Gruppe 1   Gruppe 2 ........
User2    Gruppe 1   Gruppe 2  Gruppe 3........
User3    Gruppe 1

Versuch Ziel Stand:
$import = get-ADUser -Filter * -SearchBase "<searchbase>" -Properties MemberOf, PrimaryGroup |select SamAccountName,@{n="Gruppen";e={$_.MemberOf -join ";"}}   
$userNamen = $import.SamAccountName
$userZaehler = -1 

$liste = @()

foreach($userName in $userNamen){
            $result = [PSCustomObject]@{}
            $userZaehler ++
            $result | Add-Member -MemberType NoteProperty -Name "User" -Value $userName -Force  
            $groupsPerUser    = ($import[$userZaehler].Gruppen).trim(";#") -split ";" | select -Unique  
            
            $groupZaehler = -1
            foreach ($group in $groupsPerUser){
                $groupZaehler++
                $result | Add-Member -MemberType NoteProperty -Name "Group $groupZaehler" -Value $group -Force  
            }
           $liste += $result
        }

$liste | Export-Csv -path 'd:\temp\output2.csv' -NoTypeInformation -Delimiter ";"  
$liste

Ziel war es ja User in die erste Spalte und dahinter die Gruppen in einzelne Spalten. Das klappt auch NUR fehlen mir da einige Spalten.
Aktuell schreibt er nur 13 Gruppen Spalten. Es gibt allerdings Benutzer mit 20+ Gruppen, die wenn ich nur $liste ausgebe auch da sind, im CSV allerdings nicht.

Eine Idee warum er mir ins CSV nicht alles schreibt, in der Consolen Ausgabe allerdings?

VG

Content-ID: 423132

Url: https://administrator.de/contentid/423132

Ausgedruckt am: 04.12.2024 um 08:12 Uhr

emeriks
emeriks 28.02.2019 aktualisiert um 11:40:52 Uhr
Goto Top
Hi,
Zitat von @H41mSh1C0R:
Aktuell schreibt er nur 13 Gruppen Spalten.
Eine Idee warum er mir ins CSV nicht alles schreibt, in der Consolen Ausgabe allerdings?
Ich nehme an, weil 13 hier der kleinste gemeinsame Nenner ist? Also alle Zeilen haben min. 13 Spalten, aber eben nicht alle mehr. Eine "ordentliche" CSV-Tabelle setzt voraus, dass alle Zeilen dieselbe Anzahl an Spalten haben.

E.
H41mSh1C0R
H41mSh1C0R 28.02.2019 um 11:45:13 Uhr
Goto Top
Zitat von @emeriks:
Ich nehme an, weil 13 hier der kleinste gemeinsame Nenner ist? Also alle Zeilen haben min. 13 Spalten, aber eben nicht alle mehr. Eine "ordentliche" CSV-Tabelle setzt voraus, dass alle Zeilen dieselbe Anzahl an Spalten haben.

Na ne ^^, es gibt ja gerade User die 20+ Gruppenzugehörigkeiten haben und somit müsste die Anzahl Spalten ja das sein was als Maximum (sagen wir mal 25) da ist.
Das dann User dabei sind die nur 5 statt 25 hat ist ja wurscht, bei dem sind dann 20 Felder leer.
138810
Lösung 138810 28.02.2019 aktualisiert um 11:59:21 Uhr
Goto Top
und somit müsste die Anzahl Spalten ja das sein was als Maximum (sagen wir mal 25) da ist.
Nö, weil nicht alle deine Objekte entsprechende Eigenschaften(Gruppen haben).
Und deswegen werden die auch nicht exportiert.
Probier mal
$liste | select * | Export-Csv -path 'd:\temp\output2.csv' -NoTypeInformation -Delimiter ";"  
Ansonsten jedem Objekt erst mal alle Gruppen als Eigenschaften zuweisen und dann die Daten rein schreiben.
emeriks
Lösung emeriks 28.02.2019 um 12:02:12 Uhr
Goto Top
Nein, die anderen haben diese 20 Felder gar nicht.
In Zeile 8 erstellst Du jedes Mal ein neues $result Objekt.
Danach fügst Du zu diesem Objekt die Member hinzu (Spalten).
Und dieses Objekt fügst Du dann in Zeile 18 der Liste hinzu.

Damit hast Du eine Liste mit unterschiedlichen Objekt-Typen. Jedes hat seine individuelle Anzahl an Member. Und dabei ist "Gruppe 1" von Objekt A noch nicht einmal gleich "Gruppe 1" von Objekt B.
H41mSh1C0R
H41mSh1C0R 28.02.2019 um 12:59:23 Uhr
Goto Top
Hab jetzt Dirty die Spalten "aufgefüllt". Und es lüppt.

@emeriks
Das dort nicht Spalte 1 von Objekt 1 gleich Spalte 1 von Objekt 2 ist dem der das so haben will wurscht.
erikro
erikro 28.02.2019 um 13:16:08 Uhr
Goto Top
Moin,

da ist die Frage ja wieder. Auch wenn Du sie schon als gelöst markiert hast, hier ein Alternativvorschlag. Ich würde das Ganze nicht als CSV, sondern als XML ausgeben, da man da nicht das Problem hat, dass man Spalten auffüllen muss und dann leere Felder bei vielen Datensätzen hat.

param (

    $outpath = "test.xml"  

)

$outfile = [xml]"<?xml version='1.0' encoding='utf-8'?>`n<?xml-stylesheet type='text/css' href='stylesheet.css'?>`n<groups name='Gruppenliste' />"  
$outfile.save($outpath)

$users = get-aduser -filter * -properties samaccountname, memberof

foreach($user in $users) {

    $newuser = $outfile.createElement("user")  
    $newuser.set_InnerText("$user")  
    
    $groups = $user | select-object -ExpandProperty MemberOf

    foreach($group in $groups) {

        $newgroup = $outfile.CreateElement("Gruppe")  
        $newgroup.set_Innertext("$group")  
        $newuser.AppendChild($newgroup)

    }
    $outfile.groups.appendchild($newuser)

}
$outfile.Save($outpath)

noch ein nettes Stylesheet dazu und das sieht richtig gut aus. face-wink

user {

	font-family:Arial;
	font-size: 16px;
	font-weight:bold;
	display:block;
	margin-bottom:5px;
	margin-top:15px;


}

Gruppe {

	font-family:Arial;
	font-size: 13px;
	font-weight:normal;
	display:block;
	margin-bottom:5px;
	margin-top:15px;
}

hth

Erik
H41mSh1C0R
H41mSh1C0R 28.02.2019 um 14:04:04 Uhr
Goto Top
Hallo Erik,

ja war recht hin und her gerissen zwischen dem Post und was in der ISE sich veränderte. =)

Danke für deinen Vorschlag, aber der Kollege der das CSV benötigt hat dies als fixe Vorgabe.

VG
erikro
erikro 28.02.2019 um 14:32:52 Uhr
Goto Top
Zitat von @H41mSh1C0R:

Hallo Erik,

ja war recht hin und her gerissen zwischen dem Post und was in der ISE sich veränderte. =)

Danke für deinen Vorschlag, aber der Kollege der das CSV benötigt hat dies als fixe Vorgabe.

Dann hängt man halt noch ein .transaction.childnodes hinten dran und exportiert das XML in CSV. face-wink