tech.guitarrapc.cóm

Technical updates

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

PowerShellでの操作ではGet-Credentialが重要な位置づけをしめします。 この時、通常はGUIが表示されますが、GUIがAutomationにおいてはじゃまとなることがあります。 今回は、PowerShellにおけるGet-Credintialでのユーザー名、パスワード入力をGUIからCUIに変更する方法です。

要件

PowerShell 2.0以上です。 どうやらWindows 7,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でレジストリキーを確認

簡単です。

PS> 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を利用します。

PS> 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に変更します。

PS> $key = "HKLM:\SOFTWARE\Microsoft\PowerShell\1\ShellIds"
PS> 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ポップアップすべきタイミングと、しない方が望ましいタイミングを見極めましょう。