gsudoコマンドをつかって、WindowsのPowerShell上でいい感じに管理者権限を利用する

`Windows`で`PowerShell`などのターミナルで操作している際に、管理者権限が足りなくてエラーが帰ってきて、改めて管理者権限でターミナルを開き直す事は多々あるかと思います。

そんな際に便利なのが`gsudo`コマンドとなります。

今回はこちらの`gsudo`コマンドの紹介。

## ドキュメント等

[gerardog/gsudo](https://github.com/gerardog/gsudo)
[gsudo (sudo for windows)](https://gerardog.github.io/gsudo/)

## gsudoがサポートしているシェルについて

[Introduction | gsudo (sudo for windows)](https://gerardog.github.io/gsudo/docs/intro)

ドキュメントのこちらのページに記載がありますが、2022年11月現在下記のシェルがサポートされています。

- CMD
- PowerShell
- WSL
- Bash for Windows (MSYS2 / MinGW / Git-Bash / Cygwin)
- Yori
- Take Command
- NuShell

本記事では`PowerShell`から`gsudo`を利用するケースを対象に説明しています。

## インストール

- Scoop
- WinGet
- Chocolatey

各種Windowsパッケージマネージャーに用意されているためこちらからインストールする事ができます。

もしくは、[リリースページ](https://github.com/gerardog/gsudo/releases)からダウンロードしてPATHを通すか、下記のコマンドを実行

```cmd
PowerShell -Command "Set-ExecutionPolicy RemoteSigned -scope Process; [Net.ServicePointManager]::SecurityProtocol = 'Tls12'; iwr -useb https://raw.githubusercontent.com/gerardog/gsudo/master/installgsudo.ps1 | iex"
```

本記事では`Winget`を利用してインストールします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/f046e42c-dafd-9434-3cd1-7e7e315697a6.png)

`gsudo`のv2.0.4がインストールされました。

`Winget`でインストールすると`C:\Program Files (x86)\gsudo\`にコマンドがインストールされるようです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/5e50401a-4646-8b7f-d699-43fdb3238e99.png)

## alias sudo

インストールされたディレクトリを確認すると気が付きますが、`gsudo`コマンドがインストールされていますが、その`gsudo`コマンドへのショートカットとして`sudo.exe`も登録されています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/87976424-9413-4790-9585-82c1156c15e5.png)

`gsudo`コマンドをインストールすると、この`sudo`ショートカットも用意されるため、`sudo`と入力しても管理者権限への昇格が利用できます。

## gsudo で現在のセッションを管理者権限に昇格してみる

[How to Use | gsudo (sudo for windows)](https://gerardog.github.io/gsudo/docs/usage)

使い方は簡単で、`gsudo`とオプションを付けないで実行すると現在のカレントセッションを権限昇格します。

```powershell
gsudo
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/e334adbb-e3e0-5bb0-c953-143415fc7c1e.png)

`gsudo`コマンドを実行すると、昇格のためのUACダイアログが表示され`OK`を選択すると現在のカレントセッションが管理者権限に昇格されます。

なお下記コマンドのように、WindowsPrincipalクラスのIsInRoleメソッドで権限昇格できているか確認できるので、こちらのコマンドを実行して権限昇格できているか確認します。

[WindowsPrincipal.IsInRole メソッド](https://learn.microsoft.com/ja-jp/dotnet/api/system.security.principal.windowsprincipal.isinrole?view=net-7.0)

```powershell
[System.Security.Principal.WindowsPrincipal]::new([System.Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([System.Security.Principal.WindowsBuiltInRole]::Administrator)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/5095aa93-cde4-c2c3-34e7-fc686ed32683.png)

実行した結果、Trueが帰ってきているので管理者権限に昇格されている事が確認できます。
(画像では、Oh My Poshでプロンプト表示をカスタマイズしているので、管理者実行を表す雷マークがついている事からも判別できますが）

もしくは`gsudo`のサブコマンド`status`でカレントセッションのユーザー情報を取得できこちらからも確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/ecd5a547-d77a-d635-06b6-e0a43d312c81.png)

赤枠のIs Admin がTrueになっていることから、管理者権限になっていることを確認できます。

昇格したセッションから抜けるには`exit`すれば抜けられます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/5b86d896-2a6f-8bba-4930-b7648d7bf37c.png)

## hostsファイルを管理者権限に昇格したnotepadで開く

[How to Use | gsudo (sudo for windows)](https://gerardog.github.io/gsudo/docs/usage)

hostsファイルは、権限昇格したnotepadで開いて更新しますが。
下記のように`gusudo`を使ってnotepadを管理者権限で昇格してやるとコマンド一発で権限昇格した状態でhostsファイルを開けます。

```powershell
gsudo notepad c:\windows\system32\drivers\etc\hosts
```

## gsudoにPowerSHellのスクリプトブロックを渡すとスクリプトブロックを権限昇格して実行

`PowerShell`のプロンプト上で`gsudo`を利用している場合。

`gusdo`コマンドのあとに引数としてスクリプトブロックを渡すと、スクリプトブロックを管理者権限で実行してくれます。

```powershell
gsudo { Stop-Service <<サービス>> }
```

上記のように実行すると`Stop-Service`コマンドレットを管理者実行してくれます。

## 資格情報のキャッシュ

[Credentials Cache](https://gerardog.github.io/gsudo/docs/credentials-cache)

gsudoでは資格情報をキャッシュする事により、UACダイアログの表示を抑制する事ができます。　が、ドキュメントにも書いてあるように便利ですが何でもかんでも昇格してしまう危険性があるので積極的に使うものでは無いかと思います。

```powerhsell

gsudo cache on

gsudo { Write-Host "helloworld" }

gsudo cache off

```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/3d251481-b33f-06a1-9270-42fe7fa6fa16.png)

上記コマンドを実行すると一度目の`gsudo`ではUACダイアログが表示されますが、2度目のUACダイアログが表示されません。

## 総評

ふとした時に管理者権限が必要になる作業がありますが、その際に`gsudo`がインストールされていると便利に利用できるかと思います。