Benutzer mit den meisten Antworten
Powershell Funktionsrückgabe

Frage
-
Hallo zusammen,
ich stehe aktuell mehrfach vor dem Problem, dass ich aus einer Funktion mehrere Werte zurückgeben muss.
Beispiel:
Ich frage in einer Funktion ab, in welchen Gruppen ein bestimmter User im AD Mitglied ist und will dann auch noch wissen, welche anderen Benutzer ebenfalls Mitglied sind.
Da hierbei mehrere Gruppen und noch mehr Mitglieder als Ergebnis herumkommen, hilft natürlich eine einzelne Variable nicht weiter.
Auch nach langem Googlen habe ich zwar viele ähnliche Fragen gefunden, jedoch war keine für mich hilfreiche Lösung dabei.
Ich bekomme also in der Funktion zum einen eine Liste mit "Gruppe 1", "Gruppe 2", "Gruppe 3" und zum anderen nun drei Listen mit "User A","User B","User C" usw.
Da die Anzahl der Gruppen und der enthaltenen Benutzer unterschiedlich ist, kann ich kein Array mit
$array = New-Object 'object[,]' 3,3
einfügen und dann füllen.
Versuche, vorher die Listen zu zählen (.count) und das dann als Variable für die Zahlen zu nutzen, führten ebenso ins Leere.Ich habe das Problem teilweise mit Aufsplittung in mehrere Funktionen lösen können (also eine für die Gruppen und dann eine für die Mitglieder), aber das Problem vermehrt sich gerade irgendwie und ich fänd es ja schon schön, wenn eine Funktion auch alle zusammenhängenden Daten zurückliefern könnte.
Hat zufällig von euch jemand eine Idee, wie man dieses Problems Herr (oder Frau ;) ) werden kann?
Ihr würdet mir sehr weiterhelfen.P.S. Schön wäre es natürlich, wenn ich die Gruppen nicht nur als String (Name) sondern gleich als ganzes AD-Object hinterlegen könnte. Aber der Name würde notfalls auch reichen :)
Antworten
-
Ok, das ist gar kein Problem. Ich kann dir nicht den ganzen Code schreiben, dabei lernst du nichts, aber dies sind die groben Arbeitsschritte:
- Erstelle ein Array für deine Daten mit
$AllGroups = New-Object System.Collections.Generic.List[object]
Diese Liste muss nicht dimensioniert werden, d.h. die Größe wird automatisch bei Bedarf erhöht. Außerdem ist es dem Standard Array @() gerade bei großen Datenmengen geschwindigkeitsmässig massiv überlegen.
Nun holst du deine Daten aus dem AD. Du hast keinen Code gepostet, ist aber auch egal wie genau. Wichtig ist das du jeweils den Gruppennamen zur Verarbeitung bereit hast und ein Array der Mitglieder.
Und nun legst für jede Gruppe ein Objekt an, mit zwei Properties: Name und Mitglieder (du kannst natürlich beliebig mehr Properties anlegen und mit Werten füllen):
$GroupObject = New-Object Psobject -Property @{ Name = $Groupname Members = $Members } $AllGroups.add($GroupObject)
Wenn du damit durch bist, hast du deine "Tabelle", du kannst sie beliebig erweitern, verändern, zählen und ausgeben. Mehr dazu später. Versuch es erstmal soweit.
Je nachdem wie dein AD-Export genau aussieht, kann es auch sein das du direkt Gruppenobjekte mit den Members als Eigenschaft zurückbekommst, dann kannst du diese natürlich direkt dem Array mit add() zuweisen ohne jeweils ein neues Groupobject erstellen zu müssen. Nur mischen solltest du die beiden Varianten nicht.
Grüße, Denniver
Blog: http://bytecookie.wordpress.com
Kostenloser Powershell Snippet Manager v3: Link
(Schneller, besser + einfacher scripten.)
Hilf mit und markiere hilfreiche Beiträge mit dem "Abstimmen"-Button (links) und Beiträge die eine Frage von dir beantwortet haben, als "Antwort" (unten).
Warum das Ganze? Hier gibts die Antwort.- Bearbeitet Denniver ReiningMVP, Moderator Donnerstag, 23. April 2015 12:20
- Als Antwort markiert Gabriel Lohre Freitag, 24. April 2015 06:10
Alle Antworten
-
Also, ich bin nicht sicher das ich das Problem in seiner Gesamtheit verstanden habe, aber:
- grundsätzlich kannst du Daten die in Funktionen anfallen auch einfach in eine scriptweit verfügbare Variable schreiben. Dazu machst du die Zuweisung einfach mit:
$script:MeinVariablenname = "Meinedaten"
Es spielt für diesbezüglich für das Handling von Variablen keine Rolle, welchen Inhalt (String,Integer,Array,CustomObject etc) eine Variable hat.
- Was das "hinterlegen" von AD-Objekten betrifft: wenn du von deiner Abfrage ein Objekt zurückbekommst kannst du das beliebig verwenden. Du kannst es einem Array zuweisen, so das du hinterher ein Array von Ad-Objekten hast.
Du kannst sogar ein Objekt mit seinen Eigenschaften in einer Eigenschaft eines anderen Objektes speichern. So das du z.b. ein User-objekt hast, das unter anderem eine Eigenschaft "Memberships" besitzt, die wiederum als Wert die Gruppenmitgliedschaften hat. Diese Gruppen könnten wieder Objekte sein, die jeweils die Eigenschaften der Gruppen haben... usw.
Es gibt quasi nichts was du nicht mit den Dingern machen kannst. Das ist es ja gerade was Powershell so großartig macht. :)
Da ich nicht annehme das das schon deine Frage beantwortet, lege doch mal bitte genau dar, wie hinterher deine Daten strukturiert sein sollen, am besten mit Beispiel.Grüße, Denniver
Blog: http://bytecookie.wordpress.com
Kostenloser Powershell Snippet Manager v3: Link
(Schneller, besser + einfacher scripten.)
Hilf mit und markiere hilfreiche Beiträge mit dem "Abstimmen"-Button (links) und Beiträge die eine Frage von dir beantwortet haben, als "Antwort" (unten).
Warum das Ganze? Hier gibts die Antwort.- Bearbeitet Denniver ReiningMVP, Moderator Dienstag, 21. April 2015 15:26
-
Das mit dem $SCRIPT: war mir neu. Ich hab das aber ähnlich bislang mit $GLOBAL: genutzt, nur nicht, um aus Funktionen auszubrechen, sondern eher, um Variablen zu definieren, die ich im ganzen Script, auch in Funktionen, immer mal wieder brauche ... etwa den DC oder ein Gruppenname oder dergleichen.
Als Ergebnis benötige ich eine Art Tabelle.
Dabei sind die Gruppen-Namen z.B. in (Um mal Excel-Bezeichner zu nehmen) A1 und B1
Die Mitglieder in Gruppe A1 stehen dann in der Spalte A, die der Gruppe B1 in Spalte B. (Falls nötig, kann ich versuchen, mit meinen spärlichen html-Kenntnissen eine Tabelle hier zu basteln ^^)
Dabei ist unbekannt, wie lang die Spalten werden und wieviele Spalten benötigt werden (falls das fix deklariert werden muss, fällt das also schon raus).
Diese Tabelle wäre dann der Rückgabewert der Funktion.Aus dem Rückgabewert muss ich dann in anderen Funktionen herausziehen können:
a) wie heißen die Gruppen
b) wieviele Mitglieder hat jede Gruppe
c) wie heißen die Mitglieder der GruppeWenn es sich bei a) und c) um die AD-Objekte handelt, wäre es natürlich ideal, da ich dann mit .DestinguishedName, .sid und dergleichen auf die entsprechenden Werte zugreifen kann, ohne nochmals das AD bemühen zu müssen.
Möglich wäre es ggf. den Umweg über eine .CSV zu suchen (also wirklich eine Tabelle zu schreiben), aber irgendwie gefällt mir der Gedanke nicht, immerzu extra Dateien schreiben zu müssen.
-
Ok, das ist gar kein Problem. Ich kann dir nicht den ganzen Code schreiben, dabei lernst du nichts, aber dies sind die groben Arbeitsschritte:
- Erstelle ein Array für deine Daten mit
$AllGroups = New-Object System.Collections.Generic.List[object]
Diese Liste muss nicht dimensioniert werden, d.h. die Größe wird automatisch bei Bedarf erhöht. Außerdem ist es dem Standard Array @() gerade bei großen Datenmengen geschwindigkeitsmässig massiv überlegen.
Nun holst du deine Daten aus dem AD. Du hast keinen Code gepostet, ist aber auch egal wie genau. Wichtig ist das du jeweils den Gruppennamen zur Verarbeitung bereit hast und ein Array der Mitglieder.
Und nun legst für jede Gruppe ein Objekt an, mit zwei Properties: Name und Mitglieder (du kannst natürlich beliebig mehr Properties anlegen und mit Werten füllen):
$GroupObject = New-Object Psobject -Property @{ Name = $Groupname Members = $Members } $AllGroups.add($GroupObject)
Wenn du damit durch bist, hast du deine "Tabelle", du kannst sie beliebig erweitern, verändern, zählen und ausgeben. Mehr dazu später. Versuch es erstmal soweit.
Je nachdem wie dein AD-Export genau aussieht, kann es auch sein das du direkt Gruppenobjekte mit den Members als Eigenschaft zurückbekommst, dann kannst du diese natürlich direkt dem Array mit add() zuweisen ohne jeweils ein neues Groupobject erstellen zu müssen. Nur mischen solltest du die beiden Varianten nicht.
Grüße, Denniver
Blog: http://bytecookie.wordpress.com
Kostenloser Powershell Snippet Manager v3: Link
(Schneller, besser + einfacher scripten.)
Hilf mit und markiere hilfreiche Beiträge mit dem "Abstimmen"-Button (links) und Beiträge die eine Frage von dir beantwortet haben, als "Antwort" (unten).
Warum das Ganze? Hier gibts die Antwort.- Bearbeitet Denniver ReiningMVP, Moderator Donnerstag, 23. April 2015 12:20
- Als Antwort markiert Gabriel Lohre Freitag, 24. April 2015 06:10
-
Das hat super geklappt, auch wenn ich das Array jetzt anders deklariert haben:
$ReturnObject = @() [...] foreach ($Object in $foo) { $Object = New-Object System.Object $Object | Add-Member -type NoteProperty -Name Displayname -Value $Description $Object | Add-Member -type NoteProperty -Name Value -Value $Name $ReturnObject += $Object }
Danke für die Hilfe.
Jetzt muss ich nur noch darin enthaltene Duplikate entfernen. "Get-unique" und "sort -Unique" hat nicht den gewünschten Effekt ... danach habe ich nur noch ein einzelnes Objekt im Return Array xD