概要
スクリプトを使ってドメインアカウントのパスワードをリセットする
「ADサーバのIPアドレス\自分のアカウント」でパスワードを変更しようとすると、「拒否されました」となり、変更できなくなったのでこのスクリプトを作成した。
個人の作業マシンは、会社のドメインに参加しているため、ドメイン名ではアクセスできない。(hostsに書けばいいけど、それは面倒くさい、ということで・・・)
要件
環境構成
[自分の作業マシン] ---(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 追記
自分のアカウントではこのスクリプトで良かったが、ほかの人にやってもらったエラーが出た。
「指定された状態で使用するには無効なキーです」と・・・。
調べると異なるアカウントだと鍵が変わってしまって復号できないようだ。
異なるユーザで暗号化・復号化を行うように対応する
原因と対処方法
GitHub - senkousya/usingEncryptedStandardStringOnPowershell: 🔰Windows PowerShellで文字列の暗号化と復号化
Administratorのパスワードを暗号化してファイルに保存しておく
デフォルトのDPAPIではなく、AESを使って暗号化する。AESを使うにはKeyオプションを使う。
以下のコマンドでファイルを作成。アカウント、パスワードを入力するダイアログが表示されるので、Administratorユーザ、パスワードを入力する。
PS> $FilePath = "C:\Temp\cred2.sec" #暗号化用のバイト配列を作成(192bit) 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 #パスワードをAESで暗号化してファイルに保存 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) #暗号化に使用した$EncryptedKeyを用いて復号化 $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 }