web-dev-qa-db-ja.com

プロンプトなしでPowershellで現在のユーザーの資格情報オブジェクトを取得する

複数のサーバーに対して自動化ツールを介して実行されるPowershellスクリプトがあります。リモートコールはツールのサービスアカウントを使用するため、コードで資格情報を要求したり公開したりする必要がないため、Windowsマシンでは正常に機能します。このスクリプトは、SharpSSHパッケージを使用してSSH経由でLinuxマシンに対しても実行されます。 SharpSSHはPowershellユーザーの資格情報を自動的に使用しませんが、ユーザー名とパスワード、RSAキーファイル、またはPSCredentialオブジェクトのいずれかが必要です。 Get-Credentialは自動化ツールを介して実行されるため、Get-Credentialを使用して資格情報を要求することはできません。ユーザー名とパスワードをコードで公開したり、RSAキーをそこに置いたりしたくありません。現在のPowershellユーザー(サービスアカウント)からPSCredentialオブジェクトを構築したいと思います。 [System.Net.CredentialCache] :: DefaultNetworkCredentialsを試すと空白が表示され、[System.Security.Principal.WindowsIdentity] :: GetCurrent()は必要なオブジェクトまたは情報を提供しません。

現在のユーザーからPSCredentialオブジェクトを作成する方法はありますか?それとも、この問題の完全に異なる選択肢ですか?

どうもありがとう!

26
Beege

Windows APIは必要な情報を公開しないため、Powershellはそれらにアクセスできません。セキュリティサブシステムの意図的な機能。これが機能するための唯一の方法は、Linuxマシンが呼び出し側マシンを信頼することです。たとえば、Active Directory(または実際にKerberosのセットアップ)にそれらを参加させることです。

それとは別に、何らかの形でこの情報を保存して渡す必要があります。

RSAキーをユーザーのキーストアに保存し、実行時に(.NET Crypto/Keystore libsを使用して)抽出できるため、コードと共にキーを保存することはありません。これにより、キー自体がOSによって保護され、呼び出し元のユーザーが認証された場合にのみ使用可能になります。もう1つインストールする必要がありますが、目的を達成する唯一の方法かもしれません。

16
Taylor Bird

サービスアカウントの暗号化キーを使用してパスワードを暗号化する方法は?

簡単な例:

PowerShellをサービスアカウントとして実行し、次を実行して、出力をテキストファイルに保存します(または、スケジュールされたタスク呼び出しに埋め込みます)。

$String = '<PASSWORD>'
ConvertFrom-SecureString -SecureString (ConvertTo-SecureString -String $String -AsPlainText -Force)

パスワードを復号化して利用するには、スケジュールされたタスクで次を使用します。

 $EncryptedString = '<ENCRYPTED PASSWORD FROM ABOVE>'
 [Runtime.InteropServices.Marshal]::PtrToStringAuto([Runtime.InteropServices.Marshal]::SecureStringToBSTR((ConvertTo-SecureString -String $EncryptedString)))

これでうまくいくはずです。ただし、暗号化されたパスワードを別のコンピューターで再利用したり、何らかの理由でローカルキーストアを破壊したりすることはできません。

4
Rune Mariboe

パスワードはクレデンシャルオブジェクトからプレーンテキストで取得できるため、プロンプトを表示せずにパスワードを取得できるとは思えません。

3
Mike Shepard