Jump to content

PowerShell: User aus vielen Gruppen vergleichen


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

Empfohlene Beiträge

@BOfH_666@daabm

 

1. BOfH_666 ist der coolste Nick den ich kenne ;-)

2. Ja es gibt einen Hintergrund zu der Frage, ich versuch ihn mal kurz zu erklären:

 

Ich habe ein System "geerbt" bei dem ich mich gerade versuche um Klarheit zu kümmern:

Es gibt 6 verschiedene TS Farmen mit entsprechenden AD Securitygroups dahinter für die Userberechtigungen

Es gibt eine Office Securitygroup deren Mitglieder auf den TS Office starten können und die User dieser Gruppe verursachen Lizenzkosten bei unserem externen Partner.

 

In Summe reden wir von rund 800 Usern in den verschiedenen TS Gruppen. Manche brauchen Office, viele nicht.

Es geht nur mal um investigativ Arbeit, da derzeit niemand mehr in der Firma einen Überblick hat. Es gibt keine Doku oder Ansprechpartner dazu.

 

 

Link zu diesem Kommentar
vor 57 Minuten schrieb Busfan:

BOfH_666 ist der coolste Nick den ich kenne

Danke.

vor 57 Minuten schrieb Busfan:

Es gibt 6 verschiedene TS Farmen mit entsprechenden AD Securitygroups dahinter für die Userberechtigungen

 

OK, es geht also nicht um ALLE Gruppen eines ADs - dann hätte ich Deine Idee für untauglich gehalten, sondern nur einige wenige spezifische.

 

... und weil bald Weihnachten is, ....

 

$SearchBase = 'OU=Users,DC=Contoso,DC=de'

$GroupList = 
'CN=Group1,OU=Groups,DC=Contoso,DC=de',
'CN=Group2,OU=Groups,DC=Contoso,DC=de',
'CN=Group3,OU=Groups,DC=Contoso,DC=de',
'CN=Group4,OU=Groups,DC=Contoso,DC=de'

$UserList = Get-ADUser -Filter * -SearchBase $SearchBase -Properties MemberOf

$Result = 
foreach ($UserName in $UserList) {
    [PSCustomObject]@{
        UserName = $UserName.sAMAccountName
        Group1 = If($UserName.MemberOf -contains $GroupList[0]){'x'}
        Group2 = If($UserName.MemberOf -contains $GroupList[1]){'x'}
        Group3 = If($UserName.MemberOf -contains $GroupList[2]){'x'}
        Group4 = If($UserName.MemberOf -contains $GroupList[3]){'x'}
    }
}

$Result |
    Format-Table -AutoSize

 

... bei 800 Usern halte ich eine solche Ansicht immernoch für untauglich ... aber wenn Du Dir eine Pivot-Tabelle draus bastelst, kannst Du Dir die Daten ja nach den jeweils benötigten Kriterien anzeigen lassen. ;-) 

 

Ein Hinweis noch: Du musst hier tatsächlich mit den exakten "DistinguishedNames" der Gruppen arbeiten, sonst findet der "-contains" Operator keine Übereinstimmung.

bearbeitet von BOfH_666
Link zu diesem Kommentar

@BOfH_666

Vielen Dank für das Weihnachtsgeschenk ;-)

Allerdings habe ich noch 2 kleine Probleme, so fit bin ich leider noch mit PS:

 

Zeile 20 char15: Da hat er ein Problem mit dem "-" in dem Gruppennamen? Ich habe den Gruppennamen auch schon in Anführungszeichen gesetzt. Was mache ich hier falsch?

 

Zeile 17 die geschwungene Klammer , wo sollte die geschlossen werden?

image.thumb.png.9dfb7bea19554e548daf5cdb4334cc07.png

 

 

Und nochmals: Danke, Danke, Danke!

Link zu diesem Kommentar
vor 9 Minuten schrieb Busfan:

Da hat er ein Problem mit dem "-" in dem Gruppennamen?

 

Entweder Du ersetzt den "-" mit einem anderen Zeichen ... z.B. einem "_", oder ... 

 

vor 10 Minuten schrieb Busfan:

Ich habe den Gruppennamen auch schon in Anführungszeichen gesetzt.

 

Du setzt ALLE Schlüsselnamen (die Bezeichnungen links vom Gleichheitszeichen) in Anführungszeichen (einfache oder doppelte).

 

Ich würde ja die Namen deutlich kürzer und weniger redundant gestallten ... z.B. "OfficeBerechtigt" für den ersten und bei allen weiteren den Teil "remotedesktop-user" einfach weglassen. ;-) 

 

Noch ein Hinweis: Der Index eines Arrays in PowerShell beginnt bei "0"!! Mit "$GroupList[1]" erhältst Du also bereits das zweite Element des Arrays.

 

Und noch ein Hinweis: bitte keine Screenshots von Code oder Konsolen-Output posten. Anstatt dessen, den Text posten und als Code formatieren. Dann kannst Du sensible Informationen auch leichter aus-X-en. ;-)

  • Like 1
  • Danke 1
Link zu diesem Kommentar

Guten Morgen! 

Das Thema macht mich wahnsinnig ;-)

 

@BOfH_666kannst du mir bitte nochmal helfen bei den Fehlern.

Ich habe nun die Gruppen in Anführungszeichen gesetzt, erhalte allerdings 3 verschiedene Fehler.

 

$Result = 
foreach ($UserName in $UserList) {
    [PSCustomObject]@{
        "UserName" = $UserName.sAMAccountName
        "Office" = If($UserName.MemberOf -contains $GroupList[0]){'x'}
        "ts-intern" = If($UserName.MemberOf -contains $GroupList[1]){'x'}
        "ts38" = If($UserName.MemberOf -contains $GroupList[2]){'x'}
        "remotedesktop-user" = If($UserName.MemberOf -contains $GroupList[3]){'x'}
        "tsnl" = If($UserName.MemberOf -contains $GroupList[4]){'x'}
        "test-ts-a" = If($UserName.MemberOf -contains $GroupList[5]){'x'}
        "ts-hu-test" = If($UserName.MemberOf -contains $GroupList[6]){'x'}
        "ts12-ts13" = If($UserName.MemberOf -contains $GroupList[7]){'x'}
        "ts-intern-test" = If($UserName.MemberOf -contains $GroupList[8]){'x'}
    }

PS Microsoft.PowerShell.Core\FileSystem::\\fs01\PAW_Folderredirections\xx\Desktop> \\fs01\PAW_Folderredirections\xx\Desktop\CompareUsersInMultipleADGroups.ps1
At \\fs01\PAW_Folderredirections\xx\Desktop\CompareUsersInMultipleADGroups.ps1:20 char:71
+ ...        "Office" = If($UserName.MemberOf -contains $GroupList[0]){'x'}
+                                                                          ~
The hash literal was incomplete.
At \\fs01\PAW_Folderredirections\xx\Desktop\CompareUsersInMultipleADGroups.ps1:21 char:9
+         "ts-intern" = If($UserName.MemberOf -contains $GroupList[1]){ ...
+         ~~~~~~~~~~~
Unexpected token '"ts-intern"' in expression or statement.
At \\fs01\PAW_Folderredirections\xx\Desktop\CompareUsersInMultipleADGroups.ps1:30 char:1
+ }
+ ~
Unexpected token '}' in expression or statement.
At \\fs01\PAW_Folderredirections\xx\Desktop\CompareUsersInMultipleADGroups.ps1:21 char:9
+         "ts-intern" = If($UserName.MemberOf -contains $GroupList[1]){ ...
+         ~~~~~~~~~~~
The assignment expression is not valid. The input to an assignment operator must be an object that is able to accept assignments, such as a variable or a property.
At \\fs01\PAW_Folderredirections\xx\Desktop\CompareUsersInMultipleADGroups.ps1:22 char:9
+         "ts38" = If($UserName.MemberOf -contains $GroupList[2]){'x'}
+         ~~~~~~
The assignment expression is not valid. The input to an assignment operator must be an object that is able to accept assignments, such as a variable or a property.
At \\fs01\PAW_Folderredirections\xx\Desktop\CompareUsersInMultipleADGroups.ps1:23 char:9
+         "remotedesktop-user" = If($UserName.MemberOf -contains $Group ...
+         ~~~~~~~~~~~~~~~~~~~~
The assignment expression is not valid. The input to an assignment operator must be an object that is able to accept assignments, such as a variable or a property.
At \\fs01\PAW_Folderredirections\xx\Desktop\CompareUsersInMultipleADGroups.ps1:24 char:9
+         "tsnl" = If($UserName.MemberOf -contains $GroupList[4]){'x'}
+         ~~~~~~
The assignment expression is not valid. The input to an assignment operator must be an object that is able to accept assignments, such as a variable or a property.
At \\fs01\PAW_Folderredirections\xx\Desktop\CompareUsersInMultipleADGroups.ps1:25 char:9
+         "test-ts-a" = If($UserName.MemberOf -contains $GroupList[5]){ ...
+         ~~~~~~~~~~~
The assignment expression is not valid. The input to an assignment operator must be an object that is able to accept assignments, such as a variable or a property.
At \\fs01\PAW_Folderredirections\xx\Desktop\CompareUsersInMultipleADGroups.ps1:26 char:9
+         "ts-hu-test" = If($UserName.MemberOf -contains $GroupList[6]) ...
+         ~~~~~~~~~~~~
The assignment expression is not valid. The input to an assignment operator must be an object that is able to accept assignments, such as a variable or a property.
At \\fs01\PAW_Folderredirections\xx\Desktop\CompareUsersInMultipleADGroups.ps1:27 char:9
+         "ts12-ts13" = If($UserName.MemberOf -contains $GroupList[7]){ ...
+         ~~~~~~~~~~~
The assignment expression is not valid. The input to an assignment operator must be an object that is able to accept assignments, such as a variable or a property.
Not all parse errors were reported.  Correct the reported errors and try again.
    + CategoryInfo          : ParserError: (:) [], ParentContainsErrorRecordException
    + FullyQualifiedErrorId : IncompleteHashLiteral

 

 

 

Link zu diesem Kommentar
vor 2 Stunden schrieb Busfan:

Ich habe nun die Gruppen in Anführungszeichen gesetzt, erhalte allerdings 3 verschiedene Fehler.

Nimm doch die Bindestriche raus, die interessieren doch gar nicht an der Stelle. Reduziere den Code aufs nötigste, mit nur dem Usernamen, ausführen. Kommt das gewollte raus? Wenn ja, zweite Zeile mit aufnehmen, testen, und so weiter. Du hast jetzt nur Copy + Paste gemacht, vermutlich nichts gelernt und stlperst von Fehler zu Fehler, schlechte Voraussetzungen.

 

Weiter empfehle ich die Verwendung von Visual Studio Code mit den passenden Powershell Erweiterungen, damit ist das Coden in PS IMHO viel angenehmer.

Link zu diesem Kommentar
vor 34 Minuten schrieb Sunny61:

Nimm doch die Bindestriche raus, die interessieren doch gar nicht an der Stelle. Reduziere den Code aufs nötigste, mit nur dem Usernamen, ausführen. Kommt das gewollte raus? Wenn ja, zweite Zeile mit aufnehmen, testen, und so weiter. Du hast jetzt nur Copy + Paste gemacht, vermutlich nichts gelernt und stlperst von Fehler zu Fehler, schlechte Voraussetzungen.

 

 

Das hat mit den Bindestrichen nichts zu tun, die Gruppenname steht ja in Anführungszeichen.

Ich habe natürlich mehr probiert und nicht nur copy/paste versucht weil ich es ja auch verstehen will.

 

Ich versuche es derzeit mit der ISE, schaue mir aber gerne VS Code an.

 

In der Zeile mit der "Office" Gruppe fehlt am Ende etwas, daher der Fehler

The hash literal was incomplete

In der Zeile "ts-intern"

Unexpected token '"ts-intern"' in expression or statement.

 

The assignment expression is not valid. The input to an assignment operator must be an object that is able to 
accept assignments, such as a variable or a property.

IN allen weiteren Zeilen kommt nur mehr der Fehler

 

The assignment expression is not valid. The input to an assignment operator must be an object that is able to 
accept assignments, such as a variable or a property.

 

Ich will hier keinen fertigen Code, ich google die Fehler natürlich auch.

Ich weiß, dass die Anfrage weit über meinem PS know how liegt, aber ich lerne ja.

Wenn man aber ansteht, dann fragt man nach, wenn man niemanden hat, dann schreibt man in ein Forum....

 

LG

Link zu diesem Kommentar

Moin,

 

ich verwirre Dich mal noch mehr, aber hier ist ein etwas dynamischerer Ansatz:

$searchBase = "OU=Test,OU=ITA,DC=ita22,DC=metabpa,DC=org"
# wie man die Liste der Gruppen bekommt, ist egal, Hauptsache, es sind AD-Objekte
# bei mir sind alle User und Gruppen in einer Test-OU, s.o.
$adGroups = Get-ADGroup -SearchBase $searchBase -Filter *
# das ist das Mapping von Gruppennamen (Tabellenspalten) zu DN (Suchstring im memberOf)
$groupMap = @{}
# das ist die Vorlage für jede Tabellenreihe, sie umfasst den Usernamen und alle Gruppen aus der Liste
# wir ordnen sie, damit der Username vorn bleibt
# keine Angst, John Doe wird überschrieben
$tableRow = [ordered]@{'User' = 'John Doe'}
foreach ($group in $adGroups) {
    $groupMap.Add($group.Name, $group.distinguishedName)
    $tableRow.Add($group.Name, '')
}
$output = foreach ($user in (Get-ADUser -SearchBase $searchBase -Filter * -Properties memberOf)) {
    $record = [PSCustomObject]$tableRow
    $record.User = $user.Name
    $groupMap.GetEnumerator().ForEach({
        if ($user.MemberOf -contains $_.Value) {
            $record."$($_.Name)" = 'x'
        }
    })
    $record
}
$output | Format-Table -AutoSize

 

Und wenn Du das in Excel haben willst, einfach die letzte Zeile durch

$output | Export-CSV -Path C:\temp\GroupMatrix.csv -NoTypeInformation

ersetzen ;-)

bearbeitet von cj_berlin
Link zu diesem Kommentar

 

... 

vor 55 Minuten schrieb cj_berlin:

ich verwirre Dich mal noch mehr, aber hier ist ein etwas dynamischerer Ansatz:

 

Angeber!  :aetsch2: :shy:

 

vor 2 Stunden schrieb Busfan:

Das hat mit den Bindestrichen nichts zu tun, die Gruppenname steht ja in Anführungszeichen.

Ich habe natürlich mehr probiert und nicht nur copy/paste versucht weil ich es ja auch verstehen will.

 

Ich versuche es derzeit mit der ISE, schaue mir aber gerne VS Code an.

 

In der Zeile mit der "Office" Gruppe fehlt am Ende etwas, daher der Fehler

 

Die Ursache für solche Fehler liegt nach meiner Erfahrung meistens in ungewöhnlichen, in der ISE nicht sichtbaren Zeichen, wenn man den Code aus z.B. Word oder manchmal auch aus einem Browserfenster kopiert. Deshalb wäre VSCode als IDE auch besser geeignet, weil dort die PowerShell-Erweiterung inzwischen solche Zeichen speziell markiert und auf potenzielle Fehler hinweist.

 

Versuch mal bitte, Deinen Code einmal in ein Windows-Notepad-Fenster zu kopieren und dann von dort wieder zurück in eine neue frische PS1-Script-Datei. Das eliminiert meistens solche Zeichen.

Link zu diesem Kommentar

@BOfH_666

das mit Notepad hatte ich auch schon versucht, alle Leerzeichen/Abstände weggelöscht -auch hier die gleiche Meldung.

Jetzt habe ich es nochmal mit VSCode gemacht und siehe da, funktioniert!

Danke nochmal dafür, das war eine riesen Hilfe und ein super Lernfaktor!

 

Nun habe ich noch alle deaktivierten User rausgefiltert und exakt was ich brauche für die weitere Aufräumaktion!

 

DANKE!

 

 

 

 

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...