背筋を伸ばして、まいにち笑顔

ブログには何度も挫折してきた。今度こそ、とりあえず体裁なんて忘れて、消しカスみたいなことでもアウトプットしていきたい。

PowerShellでsudoみたいなことをやる

sudoしたい

PowerShellから管理者権限が必要そうなことをやると、権限がありませんと怒られる。 Linux系ではすかさずsudo (command)と叩く所だけれど、Windowsにはsudoがない。いちいちPowerShellを右クリックして管理者権限で実行しなければいけない。かといっていつも管理者権限でコマンド叩くのは怖い。

参考になりそうな情報

Windows で sudo なことをする。 | みむらの手記手帳

こちらはワンライナーsudoをする方法を紹介している。要するに、そのままプロンプト上で打ち込めばsudoの代替になるコマンドだ。しかしワンライナーと言えどpowershell -command "Start-Process -Verb runas (command)"と長いので、どこかにシェルスクリプトとして置いて$env:pathを通すという方法を紹介している。

PowerShell Code Repository - elevate-process (sudo)

こちらはそもそもワンライナーで書くことを諦めて、elevate-processという関数(?)として実装している。そしてその関数をsudoで呼び出せるようにエイリアスを設定する。

function elevate-process
{
        $file, [string]$arguments = $args;
        $psi = new-object System.Diagnostics.ProcessStartInfo $file;
        $psi.Arguments = $arguments;
        $psi.Verb = "runas";
        $psi.WorkingDirectory = get-location;
        [System.Diagnostics.Process]::Start($psi);
}
 
set-alias sudo elevate-process;

これらをすべて$profileに書き込んでおけばよいという訳だ。

まとめ

どちらも大変参考になります。ありがとうございます。

取りあえずシェルスクリプト用にわざわざ$env:pathを通すのは何だか億劫だということで、後者を採用した。ただ僕がまだPowerShellを知らないだけで、きっと前者もsudoのaliasとして$profileにうまく取り込めるのだろう。ちょっとそこまで勉強する気力は無かった。あとよく考えたらどうせ自作スクリプト置き場を作って最終的に$env:path通すことになりそうだから、最初っからやっとけばいいやと思ったけど、まあいいや。

とりあえず気軽に管理者権限で走らせることができるようになって有難いのだけれど、使っていてどうもLinuxのそれと少し話が違うことが分かった。要するに、管理者権限で実行したプロセスは、元のシェル上じゃなくて新しいシェルの上で走る。sudo choco install vimとかやると、新しいパワーシェルのウィンドウが立ち上がってしまうのだ。

このあたりはもはや、(全然よく知らないのだけれど)そもそも管理者権限周りのWindowsの仕様なのではと思って、今は諦めている(UACに関するきちんとした理解が必要である)。このあたり詳しい情報があったら、ぜひご教授願います。