crypt0r
Goto Top

Benutzername lokaler Admins ändern für LAPS

Hallo zusammen,

wir haben seit geraumer Zeit verschiedene Benutzernamen für die lokalen Adminkonten auf unseren Clients im Einsatz.

Zur Absicherung nutzen wir erfolgreich LAPS. Jedoch kann ich nur einen Benutzernamen in der LAPS Policy angeben.

Microsoft hat anscheinend die GPOs zum ersetzen und erstellen lokaler Adminkonten eingeschränkt, da man dort Passwörter im Klartext übermittelte mit dem CPassword Attribut übermittelte.

Nun zur Frage, habt ihr eine Möglichkeit gefunden zentralisiert alle Namen der local Admins zu standardisieren ohne die Rechner manuell alle anpacken zu müssen?

Gibt es eine Möglichkeit dies mit PowerShell zu realisieren?

Aktuell sehen wir nur ca 1/3 der lokalen Passwörter mit LAPS wegen dieser Einschränkung.

Meine Idee wäre sonst RemotePowershell:

Enter-PSSession PCXXX
Rename-LocalUser -Name "XXX" -NewName "XXX"


Allerdings müsste der erste String eindeutig sein. Wir haben jedoch unterschiedliche Namen. Also nur durch ausprobieren und nicht bei allen Rechnern gleichzeitig möglich?

Content-ID: 5227776222

Url: https://administrator.de/contentid/5227776222

Ausgedruckt am: 25.11.2024 um 01:11 Uhr

Tezzla
Tezzla 06.01.2023 um 10:23:14 Uhr
Goto Top
Moin,

was spricht gegen ein Startscript über eine Gruppenrichtlinie?
Das Problem wächst sich ja dann selbstständig raus, wenn man das PS Script ordentlich baut, dass es mit den lokalen Gegebenheiten klarkommt, wenn es keinen Standard gibt.

VG
TomTomBon
TomTomBon 06.01.2023 um 10:39:06 Uhr
Goto Top
Hmm

Meines Wissens geht auch die Nachforschung (mittels Powershell AD Abfrage) ob der Benutzer Admin Rechte hat.

Oder zB der Weg den Ich gelesen habe:
https://devblogs.microsoft.com/powershell-community/is-a-user-a-local-ad ...

[..]
The Microsoft.PowerShell.LocalAccounts module

In PowerShell 7 for Windows, you can use the Microsoft.PowerShell.LocalAccounts module to manage local users and group. This module is a Windows PowerShell module which PowerShell 7 loads from C:\WINDOWS\system32\WindowsPowerShell\v1.0\Modules\Microsoft.PowerShell.LocalAccounts.

As you can tell, these cmdlets allow you to add, remove, change, enable and disable a local user or local group And they allow you to add, remove and get the local group’s members. These cmdlets are broadly similar to the ActiveDirectory cmdlets, but work on local users. And as noted above, you can use domain users/groups as a member of a local group should you wish or need to.

You use the Get-LocalGroupMember command to view the members of a local group [..]
crypt0r
crypt0r 06.01.2023 um 11:51:20 Uhr
Goto Top
Hab mir nun mit unserem Invetory Tool ne Liste aller Rechner gezogen, geschaut ob die online sind und manuell per PSRemote verbunden. Hat bei 300 Rechnern circa eine Stunde gedauert, einige waren zwar nicht aktiv aber werden nachgeholt.

Hier die Befehle falls jemand anderes sie mal in Zukunft brauchen sollte:

Enter-PSSession PCXXX
Rename-LocalUser -Name "AlterAdmin" -NewName "NeuerAdmin"  


Sollte der Name des alten Admins nicht mehr bekannt sein, habe ich einfach einen neuen hinzugefügt:
New-LocalUser –Name “NeuerAdmin“
Add-LocalGroupMember -Group Administratoren -Member NeuerAdmin -Verbose

Anschließend in der LAPS GPO den richtigen Namen "NeuerAdmin" hinterlegen und auf eure Computer OU anwenden.

LAPS hab ich in der Softwareverteilung verteilt, regulär wie in der Anleitung.
erikro
erikro 06.01.2023 um 12:07:58 Uhr
Goto Top
Moin,

Zitat von @crypt0r:

Enter-PSSession PCXXX
Rename-LocalUser -Name "XXX" -NewName "XXX"


Allerdings müsste der erste String eindeutig sein. Wir haben jedoch unterschiedliche Namen. Also nur durch ausprobieren und nicht bei allen Rechnern gleichzeitig möglich?

Hier die Lösung per PS. Das kannst Du eine Weile als Start-Skript laufen lassen, bis es alle Stationen haben. Mit LAPS wird dann das Standardpasswort im Skript geändert (einmal täglich).

Get-LocalGroupMember -Group Administratoren | ?{$_.ObjectClass -eq "Benutzer"} | ?{$_.Name -ne "$env:computername\admin"} | %{Disable-LocalUser -SID $_.SID}  
if(-not $(get-localuser admin)) {

    $UserPassword = convertto-securestring -string "kennwort" -asplaintext -force  
    New-LocalUser -name "admin"  
    Set-LocalUser -Name admin -Password $UserPassword
    Add-LocalGroupMember -Group "Administratoren" -Member "admin"  
}
(nicht getestet)

hth

Erik
crypt0r
crypt0r 06.01.2023 um 12:17:04 Uhr
Goto Top
Zitat von @erikro:

Moin,

Zitat von @crypt0r:

Enter-PSSession PCXXX
Rename-LocalUser -Name "XXX" -NewName "XXX"


Allerdings müsste der erste String eindeutig sein. Wir haben jedoch unterschiedliche Namen. Also nur durch ausprobieren und nicht bei allen Rechnern gleichzeitig möglich?

Hier die Lösung per PS. Das kannst Du eine Weile als Start-Skript laufen lassen, bis es alle Stationen haben. Mit LAPS wird dann das Standardpasswort im Skript geändert (einmal täglich).

Get-LocalGroupMember -Group Administratoren | ?{$_.ObjectClass -eq "Benutzer"} | ?{$_.Name -ne "$env:computername\admin"} | %{Disable-LocalUser -SID $_.SID}  
if(-not $(get-localuser admin)) {

    $UserPassword = convertto-securestring -string "kennwort" -asplaintext -force  
    New-LocalUser -name "admin"  
    Set-LocalUser -Name admin -Password $UserPassword
    Add-LocalGroupMember -Group "Administratoren" -Member "admin"  
}
(nicht getestet)

hth

Erik

Super vielen Dank Erik!
DerWoWusste
DerWoWusste 06.01.2023 um 12:33:32 Uhr
Goto Top
Um Gottes Willen. Das Kennwort lesbar für alle im Startskript? Bitte alles nur das nicht.
erikro
erikro 06.01.2023 um 12:42:10 Uhr
Goto Top
Zitat von @crypt0r:

Super vielen Dank Erik!

Gerne. Schon ausprobiert?
erikro
erikro 06.01.2023 aktualisiert um 13:05:08 Uhr
Goto Top
Zitat von @DerWoWusste:

Um Gottes Willen. Das Kennwort lesbar für alle im Startskript? Bitte alles nur das nicht.

Lesen. face-wink

Mit LAPS wird dann das Standardpasswort im Skript geändert (einmal täglich).

Ansonsten hast Du ja recht.

<edit>Man könnte am Ende des Skripts auch noch ein

Reset-AdmPwdPassword

absetzen, sofern man das Modul auf alle Maschinen verteilt hat.

</edit>
DerWoWusste
DerWoWusste 06.01.2023 um 20:24:38 Uhr
Goto Top
Erik, du tust das leichtfertig ab. Es wäre per Skript ein Leichtes, das Kennwort bei allen unterschiedlich per Zufallsgenerator zu setzen und sich somit keine Sorgen machen zu müssen.

Bei allen Clients ein KW gleich zu setzen, es im Skript zugänglich für alle zu haben und dann ist es auch noch das Adminkennwort... das ist nun außerordentlich leichtsinnig, selbst wenn man plant, es noch am selben Tag oder (wie Du zuletzt schreibst) im selben Skript schon zu ändern. Das riskiert man einfach nicht.
Startskripte werden von internen Angreifern, die nicht ganz dumm sind, regelmäßig auf solche Konfigurationsfehler hin untersucht - es gibt sehr viele Admins, die auf ähnliche Weise schon böse Eigentore geschossen haben.
erikro
erikro 09.01.2023 um 09:43:35 Uhr
Goto Top
Moin,

Zitat von @DerWoWusste:

Erik, du tust das leichtfertig ab. Es wäre per Skript ein Leichtes, das Kennwort bei allen unterschiedlich per Zufallsgenerator zu setzen und sich somit keine Sorgen machen zu müssen.

Das ist eine gute Idee. Danke. Du hast ja recht.

Liebe Grüße

Erik
erikro
erikro 09.01.2023 um 10:23:43 Uhr
Goto Top
Moin,

da ich das als Funktion habe, hier das Skript mit zufälligem Passwort:

function get-randomstring {

PARAM (

    [int]$chars = 16

)

<#
    .Synopsis
        Function to get a random string to be used in the profile.
      
    .Description
        The function creates a random string which contains only chars of the german keyboard. That for there is the array $arr_char which can be changed to a list of chars of other languages. Just delete the german umlaute and ß at the end of the array and insert others like ñ.
        
    .Parameter chars
        The length of the random string.
        
    .Example
        get-randomstring 10
        This will create a random string of the length of 10 chars. The output would be like this: KG*4öM?uäu
#>

    #$obj_randompass = new-object System.Random
    $arr_char = @("A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z","a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z","0","1","2","3","4","5","6","7","8","9","!","`"","§","$","%","&","/","(",")","=","?","+","*","#","-",",","<",">","Ä","Ö","Ü","ä","ö","ü","ß")  
    $str_random = ""  
    
    $i=1
    
    while($i-le $chars) {
    
        $str_random = $str_random + $(get-random -inputobject $arr_char)
        $i++
    
    }
    return $str_random

}
$password = get-randomstring 32
Get-LocalGroupMember -Group Administratoren | ?{$_.ObjectClass -eq "Benutzer"} | ?{$_.Name -ne "$env:computername\admin"} | %{Disable-LocalUser -SID $_.SID}  
if(-not $(get-localuser admin)) {

    $UserPassword = convertto-securestring -string $password -asplaintext -force
    New-LocalUser -name "admin"  
    Set-LocalUser -Name admin -Password $UserPassword
    Add-LocalGroupMember -Group "Administratoren" -Member "admin"  
}

Liebe Grüße

Erik