web-dev-qa-db-ja.com

powershellのread-Host関数を使用して外部サービスのパスワードを受け入れるにはどうすればよいですか?

SOAPサービスに接続するスクリプトを書いています。接続が確立された後、送信するすべてのコマンドでユーザー名/パスを渡す必要があります。問題これを行うためにread-Hostを使用すると、私のパスワードはクリアテキストで表示され、シェルに残ります。

PS C:\Users\Egr> Read-Host "Enter Pass"
Enter Pass: MyPassword
MyPassword

-AsSecureStringで非表示にすると、値がSystem.Security.SecureStringオブジェクトになるため、値をサービスに渡すことができなくなります。

PS C:\Users\gross> Read-Host "Enter Pass" -AsSecureString
Enter Pass: **********
System.Security.SecureString

これをパスしても動作しません。パスワードがクリアテキストでサービスに渡されることは気にせず、ユーザーがパスワードを入力した後にユーザーのシェルに留まりたくないだけです。 Read-Host入力を非表示にして、パスワードをクリアテキストとして保存することは可能ですか?そうでない場合、System.Security.SecureStringオブジェクトをクリアテキストとして渡す方法はありますか?

ありがとう

25
EGr

$ PasswordはSecurestringであり、これはプレーンテキストのパスワードを返します。

[Runtime.InteropServices.Marshal]::PtrToStringAuto([Runtime.InteropServices.Marshal]::SecureStringToBSTR($Password))
43

パスワード(入力)を変数として保存し、サービスに渡すことができます。コードがスクリプトまたは関数として実行される場合、パスワードを含む変数は、実行後に削除されます(これらは一時ローカルスコープに格納されます)。コンソールでコマンドを実行する場合(または. .\myscript.ps1)、パスワード変数はセッションスコープ内に留まり、削除するかセッションを閉じるまで保存されます。スクリプトの実行後に変数を確実に削除したい場合は、自分で削除できます。このような:

#Get password in cleartext and store in $password variable
$password = Read-Host "Enter Pass"

#run code that needs password stored in $password

#Delete password
Remove-Variable password

変数がスコープに格納される方法の詳細については、チェックアウト about_Scopes

2
Frode F.