Busfan 1 Geschrieben 2. Dezember 2022 Melden Teilen Geschrieben 2. Dezember 2022 Ich würde mir gerne eine Matrix bauen (Excel.csv) die mir auflistet welche User in welchen Gruppen sind. Nur fehlt mir der richtige Ansatz um das mit PowerShell abzufragen. So sollte der Output dann in etwa aussehen: 2 gruppen zu vergleichen geht, aber wie mach ich das am besten mit mehreren? LG! Zitieren Link zu diesem Kommentar
testperson 1.707 Geschrieben 2. Dezember 2022 Melden Teilen Geschrieben 2. Dezember 2022 Hi, ein Anfang wäre evtl.: Get-ADUser -Filter * ` -Properties MemberOf | Select-Object Name, MemberOf # oder Get-ADGroup -Filter * | ForEach-Object { Write-Host ("{0}`n" -f $_.Name) Get-ADGroupMember $_ | Select-Object Name } Gruß Jan Zitieren Link zu diesem Kommentar
BOfH_666 577 Geschrieben 2. Dezember 2022 Melden Teilen Geschrieben 2. Dezember 2022 vor 1 Stunde schrieb Busfan: Ich würde mir gerne eine Matrix bauen (Excel.csv) die mir auflistet welche User in welchen Gruppen sind. Wozu soll diese Matrix denn dienen? Zitieren Link zu diesem Kommentar
daabm 1.366 Geschrieben 2. Dezember 2022 Melden Teilen Geschrieben 2. Dezember 2022 Wäre jetzt meine Frage auch gewesen - was ist das "eigentliche" Ziel? "Ich würde gern" ist selten ein Grund Und wenn ich das lösen müßte: Array mit Usern, in denen alle Mitgliedschaften enthalten sind. Zweites Array mit allen jemals vorkommenden Gruppen. Dann übereinander legen. Zitieren Link zu diesem Kommentar
Busfan 1 Geschrieben 2. Dezember 2022 Autor Melden Teilen Geschrieben 2. Dezember 2022 @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. Zitieren Link zu diesem Kommentar
BOfH_666 577 Geschrieben 2. Dezember 2022 Melden Teilen Geschrieben 2. Dezember 2022 (bearbeitet) 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 2. Dezember 2022 von BOfH_666 Zitieren Link zu diesem Kommentar
Busfan 1 Geschrieben 2. Dezember 2022 Autor Melden Teilen Geschrieben 2. Dezember 2022 @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? Und nochmals: Danke, Danke, Danke! Zitieren Link zu diesem Kommentar
BOfH_666 577 Geschrieben 2. Dezember 2022 Melden Teilen Geschrieben 2. Dezember 2022 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. 1 1 Zitieren Link zu diesem Kommentar
Busfan 1 Geschrieben 3. Dezember 2022 Autor Melden Teilen Geschrieben 3. Dezember 2022 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 Zitieren Link zu diesem Kommentar
Sunny61 807 Geschrieben 3. Dezember 2022 Melden Teilen Geschrieben 3. Dezember 2022 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. Zitieren Link zu diesem Kommentar
Busfan 1 Geschrieben 3. Dezember 2022 Autor Melden Teilen Geschrieben 3. Dezember 2022 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 Zitieren Link zu diesem Kommentar
cj_berlin 1.329 Geschrieben 3. Dezember 2022 Melden Teilen Geschrieben 3. Dezember 2022 (bearbeitet) 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 3. Dezember 2022 von cj_berlin 1 Zitieren Link zu diesem Kommentar
BOfH_666 577 Geschrieben 3. Dezember 2022 Melden Teilen Geschrieben 3. Dezember 2022 ... vor 55 Minuten schrieb cj_berlin: ich verwirre Dich mal noch mehr, aber hier ist ein etwas dynamischerer Ansatz: Angeber! 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. 1 Zitieren Link zu diesem Kommentar
Busfan 1 Geschrieben 3. Dezember 2022 Autor Melden Teilen Geschrieben 3. Dezember 2022 @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! 1 Zitieren Link zu diesem Kommentar
Empfohlene Beiträge
Schreibe einen Kommentar
Du kannst jetzt antworten und Dich später registrieren. Falls Du bereits ein Mitglied bist, logge Dich jetzt ein.