tech.guitarrapc.cóm

Technical updates

PowerShellのGet-Credentialプロンプトをコンソールに変更する

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ポップアップすべきタイミングと、しない方が望ましいタイミングを見極めましょう。