Montag, 24. November 2014

Lokales Administrator Passwort auf mehreren Computern ändern

Sicherheitsexperten empfehlen Passwörter regelmässig zu ändern. Dies wird in Firmenumgebungen meist über die Passwort Richtlinie (Default domain policy) durchgesetzt. Dabei werden aber die Passwörter der lokalem Administratoren-Konten meist vergessen. Wenn ein Eindringling einmal über das lokale Administratoren-Konto Zugriff auf einen Server erlangt hat ist es ein Leichtes auch Passwörter von Domänen-Konten heraus zu finden.

In grösseren Umgebungen ist es aber eher Umständlich die lokalen Administratoren-Passwörter regelmässig von Hand zu ändern. Dafür gibt es ja schlisslich auch Power Shell. so lassen sich auf einen Schlag die lokalen Administratoren-Passwörter von mehreren Computern / Servern ändern.



Als erstes erstelle ich mal eine Liste der Computer / Server auf welchen das lokalen Administratoren-Passwort angepasst werden soll. Dazu benutze ich z.B. folgenden Power Shell Befehl:

Alle Windows Server in einer spezifischen OU:

Get-ADComputer -SearchBase 'OU=Server,OU=mycompany,dc=corp,dc=mydomain,dc=com' -Filter { OperatingSystem -Like '*Windows Server*' } | Select -Exp Name | Out-File "C:\Temp\Computers.txt"

Das Resultat ist ein Textfile welches alle Windows Server in der angegebenen OU beinhaltet.

(Weitere Filtermöglichkeiten findet ihr hier)

Nun verwende ich folgendes Script (Quelle: 4SYSOPS) um allen Computern in der eben generierten Liste die lokalen Administratoren-Passwörter zu ändern:

<#
    .Synopsis
        Change local administrator password on list of computers given in a text file.
       
    .Description
        This script picks up the computer names from given input file and changes the local administrator password.

    .Parameter InputFile   
        The full path of the text file name where computer account names are stored. Ex: C:\temp\computers.txt
       
    .Example
        Update-LocalAdministratorPassword.ps1 -InputFile c:\temp\Computers.txt

This prompts you for the password for two times and updates the local administrator password on all computers to that.
      
    .Example
        Update-LocalAdministratorPassword.ps1 -InputFile c:\temp\Computers.txt -Verbose
       
        This tells you what exactly happening at every stage of the script.
       
    .Notes
        NAME:      Update-LocalAdministratorPassword.ps1
        AUTHOR:    Sitaram Pamarthi
WEBSITE:   http://techibee.com

#>
[cmdletbinding()]
param (
[parameter(mandatory = $true)]
$InputFile,
$OutputDirectory
)

if(!$outputdirectory) {
$outputdirectory = (Get-Item $InputFile).directoryname
}        
$failedcomputers        =        Join-Path $outputdirectory "failed-computers.txt"
$stream = [System.IO.StreamWriter] $failedcomputers
$stream.writeline("ComputerName `t IsOnline `t PasswordChangeStatus")
$stream.writeline("____________ `t ________ `t ____________________")

$password = Read-Host "Enter the password" -AsSecureString
$confirmpassword = Read-Host "Confirm the password" -AsSecureString

$pwd1_text = [Runtime.InteropServices.Marshal]::PtrToStringAuto([Runtime.InteropServices.Marshal]::SecureStringToBSTR($password))
$pwd2_text = [Runtime.InteropServices.Marshal]::PtrToStringAuto([Runtime.InteropServices.Marshal]::SecureStringToBSTR($confirmpassword))

if($pwd1_text -ne $pwd2_text) {
Write-Error "Entered passwords are not same. Script is exiting"
exit
}

if(!(Test-Path $InputFile)) {
Write-Error "File ($InputFile) not found. Script is exiting"
exit
}

$Computers = Get-Content -Path $InputFile

foreach ($Computer in $Computers) {
$Computer        =        $Computer.toupper()
$Isonline        =        "OFFLINE"
$Status                =        "SUCCESS"
Write-Verbose "Working on $Computer"
if((Test-Connection -ComputerName $Computer -count 1 -ErrorAction 0)) {
$Isonline = "ONLINE"
Write-Verbose "`t$Computer is Online"
} else { Write-Verbose "`t$Computer is OFFLINE" }

try {
$account = [ADSI]("WinNT://$Computer/Administrator,user")
$account.psbase.invoke("setpassword",$pwd1_text)
Write-Verbose "`tPassword Change completed successfully"
}
catch {
$status = "FAILED"
Write-Verbose "`tFailed to Change the administrator password. Error: $_"
}

$obj = New-Object -TypeName PSObject -Property @{
                 ComputerName = $Computer
                 IsOnline = $Isonline
                 PasswordChangeStatus = $Status
}

$obj | Select ComputerName, IsOnline, PasswordChangeStatus

if($Status -eq "FAILED" -or $Isonline -eq "OFFLINE") {
$stream.writeline("$Computer `t $isonline `t $status")
}

}
$stream.close()

Write-Host "`n`nFailed computers list is saved to $failedcomputers"

Nachdem ihr den Code in ein .ps1-File gepackt habt ruft ihr das Script wie folg auf:

PS C:\Temp> .\Change-admin-password-on-multiple-computers-with-PowerShell.ps1 -InputFile "C:\Temp\computers.txt"


Das Script passt nun alle lokalen Administratoren-Passwörter der Computer aus der Liste an und erstellt ein File in dem ihr alle Computer findet, auf welchen die Anpassung des lokalen Administratoren-Passwortes nicht möglich war.

Keine Kommentare:

Kommentar veröffentlichen