PowerShellでの操作ではGet-Credentialが重要な位置づけをしめします。 この時、通常はGUIが表示されますが、GUIがAutomationにおいてはじゃまとなることがあります。 今回は、PowerShellにおけるGet-Credintialでのユーザー名、パスワード入力をGUIからCUIに変更する方法です。
要件
PowerShell 2.0以上です。 どうやら、Windows7,8,2012,2008 R2は動作するようですが、2008では動作しないようです。
どうやって制御しているのか
GUIとCUIはレジストリキーで制御されています。
HKLM:\SOFTWARE\Microsoft\PowerShell\1\ShellIds #パス ConsolePrompting #キー
このキーが、$falseだとGUIポップアップ、$trueだとCUIとなります。
PowerShellでレジストリキーを制御
基本的には、PowerShellではレジストリもPSDriveです。 そのため、Set-Itemでの設定が可能ですし、値の名称はGet-ChildItem、値の内容はGet-ItemPropertyでわかります。
PowerShellでレジストリキーを確認
簡単です。 値の名称確認
Get-ChildItem HKLM:\SOFTWARE\Microsoft\PowerShell\1\ | format-List -AutoSize
出力です。
Hive: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\1 Name Property ---- -------- 0409 Install : 1 0411 Install : 1 PowerShellEngine ApplicationBase : C:\Windows\System32\WindowsPowerShell\v1.0 PSCompatibleVersion : 1.0, 2.0 RuntimeVersion : v2.0.50727 ConsoleHostAssemblyName : Microsoft.PowerShell.ConsoleHost, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, ProcessorArchitecture=msil ConsoleHostModuleName : C:\Windows\System32\WindowsPowerShell\v1.0\Microsoft.PowerShell.ConsoleHost.dll PowerShellVersion : 2.0 PowerShellSnapIns PSConfigurationProviders ShellIds ConsolePrompting : True
このConsolePromptingが対象のキーです。 もしない場合は、次ステップへ移ってください。 値の内容はGet-ItemPropertyを利用します。
Get-ItemProperty HKLM:\SOFTWARE\Microsoft\PowerShell\1\ShellIds
結果です。
ConsolePrompting : false PSPath : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\1\ShellIds PSParentPath : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\1 PSChildName : ShellIds PSDrive : HKLM PSProvider : Microsoft.PowerShell.Core\Registry
PowerShellでレジストリキーを変更
Set-ItemPropertyで$trueに変更します。
$key = "HKLM:\SOFTWARE\Microsoft\PowerShell\1\ShellIds" Set-ItemProperty -Path $key -Name ConsolePrompting -Value $true
これで、値が変わります。
ConsolePrompting : True PSPath : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\1\ShellIds PSParentPath : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\1 PSChildName : ShellIds PSDrive : HKLM PSProvider : Microsoft.PowerShell.Core\Registry
戻す際は、$falseに設定します。
$key = "HKLM:\SOFTWARE\Microsoft\PowerShell\1\ShellIds" Set-ItemProperty -Path $key -Name ConsolePrompting -Value $false
変更後の動作
ご覧のとおり、GUIがなくなりCUI上でユーザー情報を聞くようになりました。 勿論パスワードはマスクされています。
まとめ
GUIポップアップすべきタイミングと、しない方が望ましいタイミングを見極めましょう。