interprism's blog

インタープリズム株式会社の開発者ブログです。

Windows10でエクスプローラの右クリックメニューからPowerShellあるいはコマンドプロンプトを管理者権限で開けるようにする

この投稿は インタープリズムはAdvent Calendarを愛しています。世界中のだれよりも。 Advent Calendar 2017の12日目 の記事です。

Windows10にアップグレードしたのですが・・・

こんにちはito.yです。

最近、使用している環境をWindows7からWindows10へとアップグレードしたのですが、 エクスプローラ上で「Shift+右クリック」を押すことで表示されていた「コマンドウィンドウをここで開く」が「PowerShellウィンドウをここに開く」に変更されました。

f:id:interprism:20180104010309p:plainf:id:interprism:20180104005951p:plain
左:Windows7 右:Windows10
個人的にはPowerShellも使用頻度が高いため変更される分には問題ありませんが、1つ許容できない部分がありました。
それは、 管理者権限で実行できないこと です。
Windows7の時は下図のユーザーアカウント制御画面で設定を通知しないに変更しておけば、UACが無効化されて自動的に管理者実行となっていたのに対し、 Windows8から変更された管理者権限の仕様のせいか、設定を変更しても管理者権限で実行することができなくなっています。
f:id:interprism:20180110231731p:plain:w300
UAC設定用のスライダーを下げても効果なし。。

本記事では対策方法を2パターン紹介します。
PowerShellではなくコマンドプロンプトで開きたい場合もパターン2の方法で対応可能です。

ただし、いずれもレジストリの変更が必要となります。 事前にPCのバックアップをするなどの準備をし、自己責任で実施してください。

  • 検証環境
    • エディション:Windows10 Home
    • バージョン:1709
    • OSビルド:16299.125

パターン1:ユーザーアカウント制御を完全無効化する

Windowsのユーザーアカウント制御をレジストリを操作して完全に無効化することで、右クリックメニューからのPowerShell実行も管理者権限で実行されるようになります。
こちらの方法はあらゆるアプリケーションをデフォルトで管理者権限で利用できるようになるため、便利な反面、セキュリティ面を考えるとリスクがあります。
上記を十分に認識してから実行してください。

レジストリの確認

まずはユーザーアカウント制御が有効化されていることを確認します。 PowerShellを管理者権限で起動し、次のPowerShellコマンドを実行してください。

$RegPath="HKLM:Software\Microsoft\Windows\CurrentVersion\policies\system"
$RegKey="EnableLUA"
Get-ItemProperty $RegPath -name $RegKey

f:id:interprism:20180104013203p:plain
レジストリ確認結果

レジストリの更新

結果がEnableLUA:1(有効)であることが確認できたら 続けて 次のPowerShellコマンドを実行し、レジストリを更新します。 実行後は再起動をしてください。

New-ItemProperty -Path $RegPath -Name $RegKey -PropertyType DWord -Value 0 -Force

これにて無効化の完了です。 ユーザーアカウント制御を再び有効化したい場合は上記PowerShellコマンドのValueの値を1に変更し、$RegPathと$RegKeyも同様に指定して実行し直してください。

パターン2:管理者権限で実行するコマンドを新しく追加する

こちらはデフォルトでコンテキストメニューから選べるコマンドではなく、新しくコマンドを追加する方法です。 後述のPowerShellコマンドを実行することで次の3種類のパスにレジストリキーが追加されます。

Registry::HKEY_CLASSES_ROOT\drive\shell\runas
Registry::HKEY_CLASSES_ROOT\directory\shell\runas
Registry::HKEY_CLASSES_ROOT\directory\background\shell\runas

それぞれ、ドライブ選択、ディレクトリ選択、ディレクトリの背景選択時のコンテキストメニューに管理者権限実行用のコマンドを追加するためのレジストリキーのパスを表しています。

レジストリの確認

追加予定のパスにレジストリキーが存在しないことを確認します。

'directory', 'directory\background', 'drive' | ForEach-Object {
    Test-Path "Registry::HKEY_CLASSES_ROOT\$_\shell\runas"
}

Trueが帰ってきた場合は既に存在しているので後述のコマンドをそのまま実行するのはやめたほうがよいでしょう。

コマンドの登録

登録したいコマンドに応じて次の1~3のPowerShellコマンドの いずれか を、管理者権限で起動したPowerShellウィンドウで実行してください。
必要なレジストリキーが作成され、コマンドが登録されます。
それぞれのPowerShellコマンドでは同じレジストリキーを使用して登録しており、コマンドの複数登録には対応していません。

1. 「右クリック」メニューに「PowerShellウィンドウをここで開く(管理者)」というコマンドを追加したい場合

$menu = 'PowerShellウィンドウをここで開く(管理者)'
$command = "$PSHOME\powershell.exe -NoExit -NoProfile -Command ""Set-Location '%V'"""
'directory', 'directory\background', 'drive' | ForEach-Object {
New-Item -Path "Registry::HKEY_CLASSES_ROOT\$_\shell" -Name runas\command -Force |
Set-ItemProperty -Name '(default)' -Value $command -PassThru |
Set-ItemProperty -Path {$_.PSParentPath} -Name '(default)' -Value $menu -PassThru |
Set-ItemProperty -Name HasLUAShield -Value ''
}

f:id:interprism:20180106010103p:plain
コマンド追加後のコンテキストメニュー

2. 「Shift+右クリック」メニューに「PowerShellウィンドウをここで開く(管理者)」というコマンドを追加したい場合

1との違いはレジストリエントリにExtendedを追加していることであり、これによってShiftが押されている時のみ表示されるようになります。

$menu = 'PowerShellウィンドウをここで開く(管理者)'
$command = "$PSHOME\powershell.exe -NoExit -NoProfile -Command ""Set-Location '%V'"""
'directory', 'directory\background', 'drive' | ForEach-Object {
New-Item -Path "Registry::HKEY_CLASSES_ROOT\$_\shell" -Name runas\command -Force |
Set-ItemProperty -Name '(default)' -Value $command -PassThru |
Set-ItemProperty -Path {$_.PSParentPath} -Name '(default)' -Value $menu -PassThru |
Set-ItemProperty -Name HasLUAShield -Value '' -PassThru |
Set-ItemProperty -Name Extended -Value ''
}

3. 「右クリック」メニューに「コマンドウィンドウをここで開く(管理者)」というコマンドを追加したい場合

1, 2と異なりコマンドプロンプト起動用コマンドを登録します。

$menu = 'コマンドウィンドウをここで開く(管理者)'
$command = "cmd.exe /s /k pushd ""%V"""
'directory', 'directory\background', 'drive' | ForEach-Object {
New-Item -Path "Registry::HKEY_CLASSES_ROOT\$_\shell" -Name runas\command -Force |
Set-ItemProperty -Name '(default)' -Value $command -PassThru |
Set-ItemProperty -Path {$_.PSParentPath} -Name '(default)' -Value $menu -PassThru |
Set-ItemProperty -Name HasLUAShield -Value ''
}

1~3で追加したコマンドを削除したい場合

'directory', 'directory\background', 'drive' | ForEach-Object {
    Remove-Item -Path "Registry::HKEY_CLASSES_ROOT\$_\shell\runas" -Force -Recurse
}

終わりに

いかがだったでしょうか。
コマンドの登録はこちらの記事を参考にさせていただきました。

今回紹介させていただいた方法が、私と同じように管理者権限の仕様に関して不便を感じた方の助けになれば幸いです。

インタープリズムのページ

PAGE TOP