概要
スクリプトを使ってドメインアカウントのパスワードをリセットする
「ADサーバのIPアドレス\自分のアカウント」でパスワードを変更しようとすると、「拒否されました」となり、変更できなくなったのでこのスクリプトを作成した。
個人の作業マシンは、会社のドメインに参加しているため、ドメイン名ではアクセスできない。(hostsに書けばいいけど、それは面倒くさい、ということで・・・)
要件
- スクリプトは、運用管理用サーバで実行する。(ユーザーはここに自分のアカウントでRDPログインできる。)
- 運用管理用サーバは、ドメインに参加していない。
- ユーザー自身でパスワードをリセットする。
- ADサーバへのアクセス時にAdminstratorのパスワードを入力させたくない。
環境構成
[自分の作業マシン] ---(RDP)---> [運用管理用サーバ] -------> [ADサーバ] (IP: 10.1.1.1)
参考にしたサイト
パスワードを暗号化してファイルに保存しておく方法や、そのファイルを使ってコマンドを実行する方法については、こちらを参考にしました。
dev.classmethod.jp
Administratorのパスワードを暗号化してファイルに保存しておく
ドメインアカウントの変更なので、ADサーバにアクセスする必要があるが、アクセス時にAdministratorのパスワードを入力させたくない。
以下のコマンドでファイルを作成。アカウント、パスワードを入力するダイアログが表示されるので、Administratorユーザ、パスワードを入力する。
PS> $FilePath = "C:\Temp\cred.sec"
PS> $Credential = Get-Credential
PS> $Credential.Password | ConvertFrom-SecureString | Set-Content $FilePath
対話形式でアカウントや新しいパスワードを入力し、パスワードをリセットする
resetpassword.ps1
$FilePath = "C:\Temp\cred.sec"
$Username = "10.1.1.1\Administrator"
$EncryptedCred = Get-Content $FilePath | ConvertTo-SecureString
$Cred = New-Object System.management.Automation.PSCredential($Username, $EncryptedCred)
$DomainAccountName = Read-Host "アカウント名を入力してください"
$NewPassword = Read-Host "新しいパスワードを入力してください" -AsSecureString
Write-Host "パスワードをリセットします"
Set-ADAccountPassword -Identity $DomainAccountName -Reset -NewPassword $NewPassword -PassThru -Server 10.1.1.1 -Credential $Cred
if($? -eq "True"){
Write-Host "処理が成功しました"
}else{
Write-Host "処理が失敗しました"
Write-Host "エラーの原因: " + $error[0].CategoryInfo.Reason
}
2022.3.1 追記
自分のアカウントではこのスクリプトで良かったが、ほかの人にやってもらったエラーが出た。
「指定された状態で使用するには無効なキーです」と・・・。
調べると異なるアカウントだと鍵が変わってしまって復号できないようだ。
異なるユーザで暗号化・復号化を行うように対応する
Administratorのパスワードを暗号化してファイルに保存しておく
デフォルトのDPAPIではなく、AESを使って暗号化する。AESを使うにはKeyオプションを使う。
以下のコマンドでファイルを作成。アカウント、パスワードを入力するダイアログが表示されるので、Administratorユーザ、パスワードを入力する。
PS> $FilePath = "C:\Temp\cred2.sec"
PS> [byte[]] $EncryptedKey = (3,4,2,3,56,34,254,222,1,1,2,23,42,54,33,233,1,34,2,7,6,5,35,43)
PS> $Credential = Get-Credential
PS> $Credential.Password | ConvertFrom-SecureString -key $EncryptedKey | Set-Content $FilePath
異なるユーザを使ってパスワードをリセットする
resetpassword2.ps1
$FilePath = "C:\Temp\cred2.sec"
$Username = "10.1.1.1\Administrator"
[byte[]] $EncryptedKey = (3,4,2,3,56,34,254,222,1,1,2,23,42,54,33,233,1,34,2,7,6,5,35,43)
$EncryptedCred = Get-Content $FilePath | ConvertTo-SecureString -key $EncryptedKey
$Cred = New-Object System.management.Automation.PSCredential($Username, $EncryptedCred)
$DomainAccountName = Read-Host "アカウント名を入力してください"
$NewPassword = Read-Host "新しいパスワードを入力してください" -AsSecureString
Write-Host "パスワードをリセットします"
Set-ADAccountPassword -Identity $DomainAccountName -Reset -NewPassword $NewPassword -PassThru -Server 10.1.1.1 -Credential $Cred
if($? -eq "True"){
Write-Host "処理が成功しました"
}else{
Write-Host "処理が失敗しました"
Write-Host "エラーの原因: " + $error[0].CategoryInfo.Reason
}