【Windows】GitBashをcontext menuからAdministrator権限付きで実行する

# はじめに
最近、Windows 10 Proにアップグレードしたことに伴い、ローカルの仮想マシン用のハイパーバイザを、Oracle VirtualBoxからHyper-Vに乗り換えました。

- 乗り換え後
GitBash + Vagrant + Hyper-V

- 乗り換え前
GitBash + Vagrant + Oracle VirtualBox

これまでVagrantを利用していましたが、これは引き続き利用します。通常、CLIとしてGitBashを使っていたので、これも引き続き利用します。

Hyper-Vのインスタンス等の操作にはAdministrator権限が必要となります。
GitBashを簡単にAdministrator権限で実行させることができるよう、Context Menuにこれを追加しました。

# TL;DR
- Context Menuに任意の項目を追加する確実な手順は、現状、Regeditぐらいしかなさそう（Tweak的なツールはあるにはあるが、完全に任意のコマンドを追加できるものが見当たらない）
- **レジストリの変更は自己責任で**
- 新たなContext Menuは、GitBashのContext Menuと同じ階層に追加した
- フォルダーの空白部分で右クリックした際のContext Menuに追加する

# 試した環境
- Windows 10 Pro 10.0.17763 Build 17763
- GitBash 2.21.0
- Vagrant 2.2.4

# 手順
## Regeditを起動する
Start Menuから「regedit」と入力し、Registry Editorを実行します。
User Access Controlのポップアップが表示されるので、実行するコマンドが間違っていないことを確認し、「Yes」を押します。

![2019-03-16_20h48_15.png](https://qiita-image-store.s3.amazonaws.com/0/137777/97f6d939-1daa-9bae-83d0-41a24828b8d2.png)

## GitBashのContext Menuを確認する
まずは、Context Menuがどのような構造になっているか確認してみましょう。
以下のKeyをたどってみます。

> HKEY_CLASSES_ROOT\Directory\Background\shell\git_shell

![2019-03-16_20h58_06.png](https://qiita-image-store.s3.amazonaws.com/0/137777/85f61c1f-cacd-137a-f8bc-e2c27e123fd4.png)

この階層には、「(Default)」と「Icon」という2つのValueがあります。
これは、Context Menuに表示させる文字列とアイコンを指定するKeyとなります。

上記Keyの下に「command」というKeyがあるので、さらにたどってみます。

> HKEY_CLASSES_ROOT\Directory\Background\shell\git_shell\command

![2019-03-16_20h58_11.png](https://qiita-image-store.s3.amazonaws.com/0/137777/211dfa9b-5c86-4bba-779d-335ab55bdc7d.png)

ここに存在する「(Default)」というValueが、実際の実行コマンドになるようです。

これでContext Menuの構造が分かりました。


## Administrator権限でコマンドを実行する
まずは、任意のコマンドをAdministrator権限で実行する方法を確認します。

「PowerShell」にはStart-Processというコマンド（？）が存在します。このコマンドに「-Verb RunAs」という引数を指定することで、対象コマンドの権限を昇格して実行することができるようです。

[PoerShell 6 -> Start-Process](https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.management/start-process?view=powershell-6)

以下は、コマンドプロンプト（cmd.exe）を、Administrator権限で実行する例です。

```
> PowerShell Start-Process cmd.exe -Verb RunAs
```

これで基本形が分かりました。
次に、GitBashを「-Verb RunAs」オプション付きで実行させるコマンドを考えます。
\# GitBashのインストールパスが違う場合は、適宜読み替えてください。

```
> PowerShell Start-Process 'C:\Program Files\Git\git-bash.exe' -Verb RunAs
```

これで、GitBashの権限を昇格させて実行するコマンドが分かりました。

なお上記のコマンドは、実行直後に一瞬だけPowerShellのウィンドウが表示されてしまいます。
下記のように「-WindowStyle Hidden」を付与してPowerShellコマンドを実行することで、この表示を抑制します。

```
PowerShell -WindowStyle Hidden -Command "Start-Process 'C:\Program Files\Git\git-bash.exe' -Verb RunAs"
```


## Context Menuに項目を追加する
ではいよいよ、Context Menuに項目を追加します。

Registry Editorで、下記のKeyを開きます。
> HKEY_CLASSES_ROOT\Directory\Background\shell

上記のKeyの配下に、以下のKey/Valueを追加していきます。

|種別|Key/Value名|説明・内容|
|---|---|---|
|Key|.\git_shell_administrator\|当該Context Menuの一連のkey/Valueを格納するKey。指定する文字列は何でもよい。|
|Value|.\git_shell_administrator\\(Default)|Context Menuに表示させる文字列。今回は「Git Ba&sh Here with Administrator Privilege」を指定|
|Value|.\git_shell_administrator\\Icon|Context Menuに表示させるアイコン。今回はGitBashと同一のものを指定。|
|Key|.\git_shell_administrator\command\|実際に実行されるコマンドを格納するKey。|
|Value|.\git_shell_administrator\command\\(Default)|実行コマンド。|

実行コマンドには、先ほど確認したコマンドを入力します。具体的には下記のような文字列になるでしょう。

```
PowerShell -WindowStyle Hidden -Command "Start-Process 'C:\Program Files\Git\git-bash.exe' -Verb RunAs"
```

最終的に、下記のようにKey/Valueが設定されるでしょう。
![2019-03-16_21h38_25.png](https://qiita-image-store.s3.amazonaws.com/0/137777/0b6bc842-6b83-0cfa-b43e-7e37ff24fcef.png)
![2019-03-16_21h38_29.png](https://qiita-image-store.s3.amazonaws.com/0/137777/31eb7746-d188-5e51-6363-f2c51dd1b2dc.png)


## Context Menuを確認する
適当なフォルダを開き、空白部分で右クリックします。
先ほど追加したContext Menuが追加されていることが確認できます。

![2019-03-16_21h44_27.png](https://qiita-image-store.s3.amazonaws.com/0/137777/f2886913-dd39-d9fb-f7bc-9fe10f034b0c.png)

クリックすると、先ほど指定したコマンドが実行されます。
なお、「-WindowStyle Hidden」引数を指定していても、Context Menuから実行するとPowrShellのウィンドウが一瞬表示されてしまうようです。
格好悪いですが、実害はないので無視します。


# おわりに
Context Menuを任意にカスタマイズできるようなツールが見当たらなかったので、とりあえず今回は直接Registry Editorを使って項目を追加しました。

以下のツールが近そうではありましたが、今回の目的にかなう機能はありませんでした。

> Winaero
> https://winaero.com/blog/command-prompt-administrator-context-menu/
> https://forest.watch.impress.co.jp/library/software/winaero_tw/

その他、関連していそうなQiita記事のリンクを貼っておきます。

[コマンドプロンプトから管理者権限のコマンドプロンプトに切り替える - Qiita](https://qiita.com/fjtter/items/4b7fe797ae1155c69dd9)
[管理者権限でコマンドプロンプトを起動するショートカット - Qiita](https://qiita.com/takuya0301/items/df6cde3bbaf9e13ef8f0)