29

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

現在のユーザーからPSCredentialオブジェクトを作成するためのメソッドを持っている人はいますか?それとも、この問題のまったく異なる代替案ですか?

どうもありがとう!

4

4 に答える 4

16

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

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

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

于 2010-10-12T21:56:34.313 に答える
6

「[System.Net.CredentialCache]::DefaultNetworkCredentialsを試行すると空白が表示され、[System.Security.Principal.WindowsIdentity] :: GetCurrent()は必要なオブジェクトまたは情報を提供しません。」

あなたはすでにあなたの答えを持っています。これを使用して、現在ログインしているユーザーの資格情報をいくつかのスクリプトで渡します。

$Credentials = [System.Net.CredentialCache]::DefaultNetworkCredentials
$Username = $Credentials.UserName
$Password = $Credentials.Password

それらを任意の種類の読み取り可能な出力にダンプしようとすると、それらをダンプするときにそれらの値は空になります(明らかなセキュリティ上の理由から)が、PSCredentialオブジェクトが必要な場合は機能します。

于 2020-10-30T20:40:20.500 に答える
3

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

于 2010-10-12T19:17:56.877 に答える
3

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

簡単な例:

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)))

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

于 2014-03-06T23:41:11.550 に答える