Powershell: Nutzer einer Gruppe als Microsoft.Powershell.Commands.LocalPrincipal abrufen?
Hallo, liebe Community.
Was möchte ich machen?
Ich beabsichtige, eine Liste von Nutzern einer angegebenen Gruppe zu erhalten, durch die ich dann durchiterieren kann und mit Enable-LocalUser jede Iteration aktiviere.
Was habe ich versucht?
Ich habe folgenden Befehl geschrieben und ausgeführt:
Foreach ($user in ( Get-LocalGroupMember -Name "Remote Desktop Users" ) ) {
Enable-LocalUser $user
}
Bedauerlicherweise funktioniert dieser Ansatz nicht, da Get-LocalGroupMember die Mitglieder der angegebenen Gruppe vom Typen System.Object enthält.
Dieser entspricht nicht dem Parametertypen vom CMDlet Enable-LocalUser.
Wie kann ich vorgehen, um mein gewünschtes Ergebnis zu erwirken?
1 Antwort
Ein typischer Fehler von Administratoren auf nicht englischsprachigen Systemen.
Viele Bezeichnungen sind der jeweiligen Landessprache entlehnt. wenn man nur das abschreibt was in den internationalen Foren in englisch kommuniziert wird, bekommt man auch nicht die gewünschte Ergebnis. Man muss also bei "uns" die deutschen Bezeichner nutzen :
Administratoren, Benutzer, Gerätebesitzer, Gäste, Hauptbenutzer usw.
Für international wirksame Scripte kann man die den Gruppen zugehörige SID nutzen.
Zeige alle Gruppen mit SID:
Get-LocalGroup|select -property Name,Sid
Nun kannst Du für Dein Vorhaben mit dem deutschen "Wortschatz" arbeiten:
Get-LocalGroupMember -Name "Remotedesktopbenutzer"|ForEach-Object{ Write-Host mache irgenddwas: $_}
Get-LocalGroupMember -Name "Administratoren"|%{ Write-Host mache irgenddwas: $_}
oder du verwendest SIDs:
Get-LocalGroupMember -sid S-1-5-32-555|%{ Write-Host mache irgenddwas: $_}
Get-LocalGroupMember -sid S-1-5-32-544|%{ Write-Host mache irgenddwas: $_}
Deine ganzes Script sähe einfach so aus:
Get-LocalUser -Name "Remotedesktopbenutzer" | Enable-LocalUser
- https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.localaccounts/get-localgroup?view=powershell-5.1
- https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.localaccounts/get-localgroupmember?view=powershell-5.1
- https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.localaccounts/get-localgroup?view=powershell-5.1
Wenn die Objekte nicht "passen" schaut man sich die Ausgabe Cmdlets an:
Get-LocalGroupMember -Name "Administratoren"|fl *
...und entscheidet mit welchen daten man bei folgenden Cmdlet in der Pipe weiter kommt... Enable-LocalUser erwartet als Inputparameter Namen als String(s) oder SIDs (die Objekte will es ja nicht)
Get-LocalGroupMember übergibt den Namen allerdings als Pfad mit Rechnernamen. Kein Akt pfade kann man Spalten...
Get-LocalGroupMember -Name "Administratoren"|
%{
$PureName=Split-Path $_.Name -leaf
Write-Host Name ohne Rechner: $PureName -fo green
Enable-LocalUser -name $PureName -whatif #das -whatif simuliert...ohne reale Wirkung
}
pause
....oder Du übergibst einfach die SIDs...
Get-LocalGroupMember -Name "Administratoren"|%{Enable-LocalUser -name $_.SID -whatif}
das ist Doch das tolle an Powershell... wenns nicht passt wirds passen gemacht...
Ich arbeite über RDP auf einer Windows Server 2022 Umgebung mit der Systemsprache auf Englisch, nicht auf Deutsch. Ich bezweifle daher, dass darin das Problem liegt. Vielen Dank aber für den letzten Abschnitt; mir war bis anhin nicht klar, dass das CMDlet Get-LocalUser auch nach Gruppenprinzipalen filtern kann. Ich werde mich in die angegebenen Artikel einlesen, vielleicht lässt sich auf diese Weise ein weiteres Nachfragen verhindern.
Zuletzt noch zu:
"Get-LocalGroupMember -Name "Remotedesktopbenutzer"|ForEach-Object{ Write-Host mache irgenddwas: $_}
Get-LocalGroupMember -Name "Administratoren"|%{ Write-Host mache irgenddwas: $_}"
Get-LocalGroupMember gibt Objekte vom Typ System.Object zurück (letztlich möglicherweise bloß eine WMI-Abfrage?). Enable-LocalUser nimmt als Argument allerdings nur Objekte vom Typen Microsoft.PowerShell.Commands.LocalPrincipal entgegen, bzw., Get-LocalUser gibt Objekte vom Typen Microsoft.PowerShell.Commands.LocalPrincipal zurück.
Damit verbleibt dann wie gesagt nur die oben beschriebene Methode über eine Pipe über Get-LocalUser, bei letzterem der Umstand bestehend, dass ich Beschriebenes nicht wusste.