組織内のリモートコンピューターのローカル管理者パスワードをリセットするスクリプトを作成しようとしています。私は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
ほとんどの場合それは愚かな間違いなので、私に優しくしてください:)
PowerShell ADSIアダプターがこれで機能するという他の回答にも同意します。資格情報をインタラクティブに提供する場合は、_Get-Credential
_ではなく_Read-Host
_を使用する必要があるというコメントにも同意します。
ここに私がそれをした方法があります-私はいくつかのWebサイトからこのスクリプトを取得したと思います。コメントしたり、どこから取得したかを追跡したりしなかったため、信用できなかったことを恥ずかしく思います。
最初に、私のスクリプトは接続をテストします。
_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")
}
_
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ビルド1607では、新しいPowershell 5.1がSet-LocalUser
コマンドを導入しました。 ADSIアダプターの代わりにこのタスクに使用できますが、リモートコンピューターでPowershellリモーティングサービスを有効にする(デフォルトでは無効になっている)必要があります。リモートコマンドの受け入れを許可するには、リモートコンピューターの管理者特権のPowershellターミナルでEnable-PSRemoting
を実行する必要があります。
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.";
}