a stray sheep

お仕事周りの雑記帳

Powershellでリモートからドメインアカウントのパスワードを変更する

概要

スクリプトを使ってドメインアカウントのパスワードをリセットする

「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"
#暗号化用のバイト配列を作成(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
}