none
Tabellarische Ausgabe - aber wie?

    Frage

  • Das Ergebnis des folgenden Skripts möchte ich in Tabellarischer Form ausgeben. Wie lässt sich das bewerkstelligen?

    $Result = New-Object -TypeName System.Object $GroupNames = (Get-LocalGroup).Name ForEach ($GroupName in $GroupNames) { $GM = Get-LocalGroupMember -Name $GroupName $ResultMember = New-Object -TypeName System.Collections.ArrayList $GM | ForEach-Object { $ResultMember.Add($_.Name) | Out-Null } $Result | Add-Member -MemberType NoteProperty -Name $GroupName -Value $ResultMember

    }

    Der Code sollte auf jeder Windowsmaschine mit mindestens PowerShellVersion = 3.0, CLRVersion = 4.0 laufen.

    Kann mir jemand einen Tipp geben, oder muss man hier einfach klassisch vorgehen und die Tabellenausgabe von Grund auf neu konstruieren?


    Michael L.




    • Bearbeitet mlkuen Freitag, 4. Mai 2018 21:39
    Freitag, 4. Mai 2018 18:28

Antworten

  • OK, wenn das erstmal die Lösung ist - cool.

    Ich bin zwar kein Freund von Write-Host, aber wenn Du's unbedingt in grau haben willst .... das Ergebnis bekommt man auch kürzer hin ...  ;-)

    Get-LocalGroup |
        ForEach-Object {
            Write-Host $_.Name -ForegroundColor DarkBlue -BackgroundColor Gray
            Get-LocalGroupMember -Group $_ |
                Select-Object -ExpandProperty Name
        }


    Best regards,

    (79,108,97,102|%{[char]$_})-join''

    • Als Antwort markiert mlkuen Samstag, 5. Mai 2018 20:35
    Samstag, 5. Mai 2018 19:43

Alle Antworten

  • Michael,

    wenn ich Deinen etwas verwirrenden Code richtig verstehe, brauchst Du nur das hier

    Get-LocalGroup | 
        Select-Object Name,@{Name='Members';Expression={(Get-LocalGroupMember -Name $_ | Select-Object -ExpandProperty Name) -join ','}}

    Um eine Ausgabe auf dem Bildschirm als Tabelle zu formatieren, kannst Du das cmdlet Format-Table benutzen - das brauchst Du nicht neu erfinden. ;-)

    Ergänzung: Standardmäßig gibt die Powershell Resultate üblicherweise als Tabelle aus, wenn die Ausgabe bis zu 4 Properties enthält. Sind es 5 oder mehr wird automatisch auf Listendarstellung gewechselt.


    Best regards,

    (79,108,97,102|%{[char]$_})-join''


    • Bearbeitet BOfH_666 Freitag, 4. Mai 2018 21:45
    Freitag, 4. Mai 2018 20:54
  • hallo und danke!

    Zugegeben ich habe vergessen zu schreiben, dass die Ausgabe vertikal sein soll. Also die Gruppennamen als Überschrift und darunter untereinander die Member-User. Mit dem CmdLet Format-Table wird die Ausgabe schnell zu breit und der Text abgeschnitten. Probier einfach den Code oben auf deiner MS-Kiste und lasse dir das Ergebnis in $Result ausgeben wie du möchtest - vielleicht so:

    $Result | Format-Table * -AutoSize
    
    Ssh Users Administratoren                    Benutzer                                                        
    --------- ---------------                    --------                                                        
    {}        {ML-PC\Administrator, ML-PC\ml-hn} {ML-PC\ml-hn, NT-AUTORITÄT\Authentifizierte Benutzer, NT-AUTO...

    Das ist aber unbefriedigend, da die User Komma-separiert ausgegeben werden.
    Mein Code ist natürlich nur ein Beispiel. Statt lokaler User will ich natürlich AD-User ausgeben. Das Prinzip ist aber das gleiche.


    Michael L.

    Freitag, 4. Mai 2018 21:54
  • OK - jetzt habe ich verstanden, was Du meinst. Und ich habe Deinen Code natürlich getestet. Aber was Du möchtest, ist meiner Meinung nach nicht vertretbaren/sinnvollen Aufwand machbar und es erscheint mir auch wenig sinnvoll. Was möchtest Du denn mit den so aufbereiteten Daten anfangen?

    Best regards,

    (79,108,97,102|%{[char]$_})-join''


    • Bearbeitet BOfH_666 Freitag, 4. Mai 2018 23:33
    Freitag, 4. Mai 2018 22:01
  • Objektiv betrachtet hast du natürlich recht. Die Darstellung, Ausgabe von Daten, welche aus Sicht von IT-Leuten so "schön" in Objekten oder Strukturen platziert sind, degradiert diese zu reiner Textform. Diese sind dann, aus IT-Sicht, nicht mehr geeignet sinnvoll weiterverarbeitet zu werden. Meine praktische Erfahrung zeigt aber immer wieder, dass beispielsweise Kollegen nicht willens oder fähig sind, ein Verständnis für diese oder andere Zusammenhänge in der EDV zu entwickeln. Ein weiterer Grund ist die zunehmende Zentralisierung von IT-Diensten, was in der Folge immer mit der Entziehung von Privilegien, sprich dezentralen Berechtigungen, verbunden ist. Auch ich als regionaler Admin habe oft unglaublich viel Mehrarbeit bei der Erledigung bestimmter Aufgaben, nur weil teils blödsinnige Gruppenrichtlinien angewendet werden auf die ich keinen Einfluss habe. Ein ganz einfaches Beispiel ist die nicht zugelassene manuelle Eingabe in die Adresszeile des Windows Explorers. Eine Netz-Ressource mit DOS-Laufwerksbuchstaben zu verbinden ist hingegen erlaubt. Die Dummheit kennt da keine Grenzen (betrifft mich selbstverständlich auch, rein objektiv betrachtet). Und ich bin es mittlerweile auch Leid mich darüber auszulassen was andere so treiben.

    Also kurz und gut, ich möchte damit anderen Leuten bei uns die Arbeit erleichtern, wenn sie beispielsweise Massenanträge oder Berichte über eine propitäre Web-Schnittstelle oder ein automatisiertes Excel-Sheet abschicken möchten. Dazu müssen sie manuell teilweise Massen von Gruppen-, Computer- oder User-Name oder weiß der Fuchs was die verarbeiten müssen, eingeben. Meine kleinen Helferlein sollen dabei sehr überschaubare Funktionalität haben. Im aktuellen Fall z.B. "klick-klick" machen, einen Gruppennamen (eventuell mit dem einfachen Platzhalter '*') eingeben und Enter drücken. Das copy & paste am Schluß beherrscht nun wirklich jeder von zu Hause.

    So, jetzt geht's mir besser :-)


    Michael L.

    Samstag, 5. Mai 2018 08:57
  • Michael,

    witzig ... ich weiß ganz genau was Du meinst. ;-) Ich sag mir dann immer: "ich darf nicht aufhören, gegen sowas anzugehen" und versuche es dann immer und immer wieder. .... und manchmal klappt's sogar.  yeaah  :-D

    Aber für Deine Anfrage sehe ich leider trotzdem keine vernünftige Methode, das mit Powershell zu machen .... eher noch mit Excel und der Möglichkeit Daten zu transponieren - also Spalten zu Zeilen zu machen. Wär das vielleicht erst mal ein Fortschritt?

    Edit:  Ich hab grad nochmal gesucht und vielleicht hilft Dir das hier ja weiter. Es gibt ein Script von Sam Boutros das scheinbar das macht, was Du brauchst. Transpose. ... kann's im Moment leider nicht selbst testen.


    Best regards,

    (79,108,97,102|%{[char]$_})-join''


    • Bearbeitet BOfH_666 Samstag, 5. Mai 2018 09:50
    Samstag, 5. Mai 2018 09:42
  • Olaf,

    danke für deine Mühe. Das Transpose ist sehr kompakt und würdig in der Ideenkiste zu landen. Für mich kommt es aber aus folgendem Grund nicht in Frage. Die Anzahl der Einträge (Property) in jeder Spalte ist bei bei dem Transpose-Script immer gleich weil eben Eigenschaften dargestellt werden. Bei mir sind aber Gruppen-Member gefragt, welche in jeder Spalte (Gruppe) unterschiedlich von der Anzahl her sind. Um mein Problem zu lösen müsste ich vorher wissen, wieviele Zeilen die Tabelle hat (maximum Member einer Gruppe) und danach die Tabelle aufbauen. Da mir dies zu kompliziert wäre habe ich das Problem zwischenzeitlich anders gelöst. Ich gebe die Gruppen- und Member-Namen einfach nacheinander als Liste (einspaltig) aus. Das sieht dann etwa so aus:

    param (
        [Parameter(ValueFromPipeline = $true)] [String]$GroupNameWildcardFilter = "*"
    )
    $Result = New-Object -TypeName System.Object 
        $GroupNames = (Get-LocalGroup).Name
        ForEach ($GroupName in $GroupNames) {
            $GM = Get-LocalGroupMember -Name $GroupName
            $ResultMember = New-Object -TypeName System.Collections.ArrayList
            $GM | ForEach-Object {
                $ResultMember.Add($_.Name) | Out-Null
            }
            $Result | Add-Member -MemberType NoteProperty -Name $GroupName -Value $ResultMember 
        }
    
    ForEach($Name in (($Result|Get-Member -MemberType NoteProperty).Name)) {
        Write-Host "$Name" -ForegroundColor DarkBlue -BackgroundColor Gray
        $Result.$Name
        ""
    }

    Natürlich funktioniert der Parameter "GroupNameWildcardFilter" in diesem Skript für lokale Benutzer nicht, weil man dazu die AD-CmdLets braucht, oder WMI und LDAP benutzt.

    Danke aber noch einmal für deine Aufmerksamkeit!


    Michael L.




    • Bearbeitet mlkuen Samstag, 5. Mai 2018 16:25
    Samstag, 5. Mai 2018 15:43
  • OK, wenn das erstmal die Lösung ist - cool.

    Ich bin zwar kein Freund von Write-Host, aber wenn Du's unbedingt in grau haben willst .... das Ergebnis bekommt man auch kürzer hin ...  ;-)

    Get-LocalGroup |
        ForEach-Object {
            Write-Host $_.Name -ForegroundColor DarkBlue -BackgroundColor Gray
            Get-LocalGroupMember -Group $_ |
                Select-Object -ExpandProperty Name
        }


    Best regards,

    (79,108,97,102|%{[char]$_})-join''

    • Als Antwort markiert mlkuen Samstag, 5. Mai 2018 20:35
    Samstag, 5. Mai 2018 19:43
  • Klasse Olaf - auf sowas in der Art hatte ich gehofft.

    ein Freund von Write-Host bin ich auch nicht weil Allewelt meint, man sollte es am besten garnicht verwenden. Ich mache da mal eine Ausnahme :-}

    So - nun noch eine Ergebnis-Variable reinstricken, damit ich es auch für mich selbst weiterverwenden kann. Ein bischl länger wird's dann wieder :-)

    Danke, danke und Gruß

    Übrigens: Dein Avatar ist cool! Ein Schneemann mit genetischer Disposition zum Huhn?


    Michael L.



    • Bearbeitet mlkuen Samstag, 5. Mai 2018 20:51
    Samstag, 5. Mai 2018 20:46
  • Übrigens: Dein Avatar ist cool! Ein Schneemann mit genetischer Disposition?
    Danke. Wenn Du mal meine Signatur entschlüsselst, weißt Du auch warum ich den gewählt habe .... ;-)

    Best regards,

    (79,108,97,102|%{[char]$_})-join''

    Samstag, 5. Mai 2018 20:52