ヒント: 資格情報を受け付ける Windows PowerShell スクリプトを作成する

更新日 : 2011 年 4 月 26 日

Windows PowerShell スクリプトに対処するときには、ユーザー名とパスワードの適切な処理方法に関する問題が頻繁に発生します。解決策は、Get-Credential コマンドレットを使用して、PSCredential オブジェクトを作成することです。PSCredential オブジェクトを使用すると、ユーザー名とパスワードの組み合わせをそのまま受け取るコマンドレットとは異なり、パスワードがメモリ内で保護されるようになります。

パラメーターで PSCredential オブジェクトを受け取る場合、Windows PowerShell では、次の入力方法がサポートされます。

  • 入力しない: 必須パラメーターである -credential に何も指定しない場合、Windows PowerShell ではユーザー名とパスワードの入力が求められます。
  • 文字列を入力する: –credential パラメーターに文字列を指定する場合、Windows PowerShell ではその文字列をユーザー名として処理し、パスワードの入力が求められます。
  • 資格情報を入力する: -credential パラメーターに資格情報オブジェクトを指定する場合、Windows PowerShell では資格情報オブジェクトをそのまま受け取ります。

これは、対話的に使用する場合は便利ですが、-credential パラメーターを受け取るコマンドレットの自動スクリプトを作成するとしたらどうでしょうか。解決策としては、事前に構成した PSCredential オブジェクトを渡すことができます。この解決策については、『Windows PowerShell Cookbook』(Oreilly & Associates Inc、2007 年) の第 16 章 9 節を参照してください。ここではこの書籍の内容を引用しています。

通常、ディスクにパスワードを格納する最初の手順は手動で行います。資格情報を $credential 変数に格納したとすると、次のコマンドを使用して、パスワードを password.txt に安全にエクスポートできます。
PS >$credential.Password | ConvertFrom-SecureString | Set-Content c:\temp\password.txt

自動的に実行するスクリプトには、次のコマンドを追加します。
$password = Get-Content c:\temp\password.txt | ConvertTo-SecureString
$credential = New-Object System.Management.Automation.PSCredential "CachedUser",$password

これらのコマンドでは、(CachedUser ユーザー用の) 新しい資格情報オブジェクトを作成し、作成したオブジェクトを $credential 変数に格納します。この解決策を読むと、最初は、ディスクにパスワードを格納することを警戒するかもしれません。ハード ドライブに機密情報を格納することに注意深くなるのは当然 (そして賢明) ですが、ConvertFrom-SecureString コマンドレットでは、Windows の一般的なデータ保護 API を使用して、このデータを暗号化します。そのため、自分のユーザー アカウントでのみ、そのコンテンツを正確に暗号化解除できます。パスワードを保護するのがセキュリティの重要な機能ですが、他のアカウントからもアクセスできるように、パスワード (またはその他の機密情報) をディスクに格納する場合があります。このことは、サービス アカウントで実行されるスクリプト、またはコンピューター間で転送することを前提に設計されたスクリプトに当てはまることが多いです。ConvertFrom-SecureString コマンドレットと ConvertTo-SecureString コマンドレットでは、暗号化キーを指定できるようにすることで、このシナリオをサポートしています。ハードコードされた暗号化キーを使用する場合、この方法はセキュリティ対策として機能しなくなることを覚えておいてください。自動スクリプトのコンテンツにアクセスできるユーザーは暗号化キーにアクセスできます。また、暗号化キーにアクセスできるユーザーは、保護しようとしていたデータにアクセスできることになります。

この解決策では、パスワードをパスを含めて指定したファイルに格納していますが、ファイルは次の例のように、スクリプトが配置されているディレクトリ、プロファイルを含むディレクトリなど、より多くのユーザーがアクセスできる場所に格納するのが一般的です。
$passwordFile = Join-Path (Split-Path $profile) password.txt
$password = Get-Content $passwordFile | ConvertTo-SecureString

このヒントは、シニア ソフトウェア開発エンジニアで、『Windows PowerShell Cookbook』(Oreilly & Associates Inc、2007 年) の著者でもある Lee Holmes によって執筆されました。出典: Ed Wilson 著『Windows PowerShell 2.0 Best Practices (英語)』(MS Press、2009 年)

 

 ページのトップへ