我正在嘗試建立一個腳本來重置組織中遠端電腦的本機管理員密碼。我對 powershell 還很陌生,我是透過嘗試和失敗來學習大部分的內容。到目前為止我的腳本:
Import-Module ActiveDirectory
$computer = Read-Host -Prompt "Enter computer Name Here"
$password = Read-Host -Prompt "Enter Password Here"
Set-ADAccountPassword - Identity $computer -NewPassword $password
這很可能只是一個愚蠢的錯誤,所以請對我溫柔點:)
答案1
長話短說
我同意另一個答案PowerShell ADSI 適配器為此工作。我也同意這樣的評論:如果您想以互動方式提供憑證,您應該使用Get-Credential
而不是Read-Host
.
我是這樣做的 - 我想我從某個網站上獲取了這個腳本,但我很尷尬我無法給予信任,因為我沒有發表評論或跟踪我從哪裡得到它。
準備
首先,我的腳本測試連線:
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/catch
嘗試設定密碼並記錄和報告成功或失敗:
try {
$account = [ADSI]("WinNT://$Computer/-PUT THE USERNAME YOU WANT TO CHANGE HERE-,user")
$account.psbase.invoke("setpassword",$password)
Write-Verbose "`tPassword Change completed successfully"
}
catch {
$status = "FAILED"
Write-Verbose "`tFailed to Change the administrator password. Error: $_"
}
這裡有一些差異。首先,我提前知道要更改的帳戶的使用者名稱(我的腳本是立即更改所有本機管理員密碼)。您可以使用
$user = [adsi]"WinNT://$computer/$($credential.GetNetworkCredential().Username),user"
相反,如其他答案所述。另外,我的腳本(在 2012 R2 伺服器上為我工作)使用$user.psbase.invoke("setpassword",$password)
而不是$user.SetPassword($password)
.我承認我不知道有什麼區別,也不知道其中一種是否會比另一種更好。
報告
最後,我的腳本報告成功/失敗。這是因為我使用腳本迭代環境中的所有伺服器以更新所有本機管理員密碼,因此我需要知道哪些伺服器發生故障(如果有),以便我可以手動返回並解決它們。這對你來說可能根本沒有必要。
$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")
}
答案2
如果您有 Powershell 5.0 或更早版本,則需要使用 Powershell ADSI 適配器來操作遠端電腦上的本機使用者帳戶:
$computer = Read-Host -Prompt "Enter Computer Name Here";
$credential = Get-Credential -UserName "Administrator" -Message "Enter new password";
$user = [adsi]"WinNT://$computer/$($credential.GetNetworkCredential().Username),user";
$user.SetPassword($credential.GetNetworkCredential().Password);
$user.SetInfo();
您可能需要在實際嘗試連接到遠端電腦之前檢查是否可以 ping 遠端計算機,並在使用者按一下憑證輸入對話方塊上的「取消」時處理這種情況。
$computer = Read-Host -Prompt "Enter Computer Name Here";
If (Test-Connection -ComputerName $computer -Count 2 -Quiet) {
Write-Host "The computer responded to our ping request. Connecting...";
$credential = Get-Credential -UserName "Administrator" -Message "Enter new password";
If ($credential -eq $null) {
Write-Warning "The username and/or the password is empty! I quit.";
Exit;
}
$user = [adsi]"WinNT://$computer/$($credential.GetNetworkCredential().Username),user";
$user.SetPassword($credential.GetNetworkCredential().Password);
$user.SetInfo();
} Else {
Write-Warning "The computer does not respond to our ping request. I quit.";
}
編輯:在 Windows 10 build 1607 中,新的 Powershell 5.1 引進了這個Set-LocalUser
指令。您可以使用它來取代 ADSI 適配器來執行此任務,但它需要在遠端電腦上啟用 Powershell 遠端處理服務(預設為停用)。若要允許接受遠端命令,您需要Enable-PSRemoting
在遠端電腦上提升的 Powershell 終端機中執行 run。
如果啟用 PS 遠端處理,則修改後的腳本將如下所示:
$computer = Read-Host -Prompt "Enter Computer Name Here";
If (Test-Connection -ComputerName $computer -Count 2 -Quiet) {
Write-Host "The computer responded to our ping request. Connecting...";
Invoke-Command -ComputerName $computer -ScriptBlock {
$credential = Get-Credential -UserName "Administrator" -Message "Enter new password";
If ($credential -eq $null) {
Write-Warning "The username and/or the password is empty! I quit.";
Exit;
}
Set-LocalUser -Name $credential.UserName -Password $credential.Password;
}
} Else {
Write-Warning "The computer does not respond to our ping request. I quit.";
}