データベースへの接続に使用するパスワードを復号化する必要があるビルド プロセスがあります。PowerShell を使用して、データ保護 API (DPAPI) を使用して、ビルド サーバーのマシン スコープでパスワードを暗号化しています (自分のドメイン アカウントでログインしています)。
[Security.Cryptography.ProtectedData]::Protect( $passwordBytes, $null, [Security.Cryptography.DataProtectionScope]::LocalMachine );
復号化は、ビルド ユーザーとして実行される CruiseControl.NET によって実行される PowerShell スクリプトでも行われます。
[Security.Cryptography.ProtectedData]::Unprotect( $encryptedbytes, $null, [Security.Cryptography.DataProtectionScope]::LocalMachine );
ただし、への呼び出しUnprotect
は失敗し、次のメッセージが表示されます。 docs によると、このエラーは偽装を使用して発生する可能性があり、偽装コードはユーザーのプロファイルをロードする必要があります。
セキュリティ上の理由から、ビルド ユーザーは、ターミナル サービスを介してログオンする権利を拒否されています。この問題をテストするために、ビルド サーバーに自分自身としてログインし、runas を使用してビルド ユーザーとして PowerShell プロンプトを開きました。
runas /profile /user:DOMAIN\BUILDUSER powershell.exe
次に、PowerShell スクリプトを実行してパスワードの保護を解除/復号化すると、同じエラーが発生します。
Process Monitorを使用して障害やアクセス拒否イベントを監視しましたが、何もありませんでした。
自分のドメイン アカウントでログインすると、パスワードを解読できます。
どうしたの?ビルド ユーザーのプロファイルが読み込まれていませんか? これを有効にするために、私が知らないセキュリティ設定がどこかにありますか? パスワードを解読できないのはなぜですか?