Edited at

Windowsでsudoしたい

More than 1 year has passed since last update.

Linux使ってる人は、Windowsで管理者に昇格させる時、わざわざファイルの場所開いて逆クリックして「管理者として実行」を選ぶのめんどいと思っているのではないでしょうか?

Linuxみたいにsudoでできないのかなと思った人もいるんではないでしょうか?

できます

Pathが通っているディレクトリ(例えば、C:\Windows\System32)に以下のバッチファイルを置くだけでsudo suコマンドが実現できます。


sudo.bat

@echo off

powershell -NoProfile -ExecutionPolicy unrestricted -Command "Start-Process \"%1\" -Verb runas"
@echo on

ただ、フルパスを引数に与えても実行できないソフトもありますので注意してください。

今回はWindows 10でやっていますが、Windows 7でも使えることは確認しています。

ただし、PowerShellがないとできません。

お知らせ

コマンドライン引数に与えたアプリケーションにコマンドライン引数を2つ以上与えるとどうもだめみたいです。

改良しているので、今は与えるコマンドラインは1つまでにしてください。

参考記事

WindowsのPowerShellを管理者権限で起動する方法


追記1

PowerShell側の問題なのか私が間違えてるのか分かりませんが、どうもコマンドライン引数を2個以上与えられないみたいです。


追記2

あんな長いコマンド打たなくてももっと短くできました。


sudo.bat

powershell.exe Start-Process "%1" -Verb runas 


あと、コマンドライン引数の渡し方もありました。でもコマンドライン渡すとなると、バッチファイルでやるとめちゃくちゃめんどいのでexe化しました。

32bit OSの方はLinuxCommand-x86.7z

64bit OSの方はLinuxCommand-x64.7z

sudo.exeの他にバッチファイルでsu.exe、ls.bat、clear.batも同梱されています。Pathが通ってるディレクトリに置いて使ってください。

あと、記事からsu.batを消しました。シェルを管理者権限で起動する際にsudo suってやりたくて作ってただけで、su単体でやるとただ単にcmd.exeが立ち上がるだけという仕様なので、Linuxコマンド「su」とは挙動が違うので。

その代わりではないのですが、sudo.exeをsudo suってやった時に管理者権限でコマンドプロンプトが起動する仕様にしておきました。sudo su.exeとやっちゃうと挙動変わっちゃうので気をつけてください。

コマンドラインは


sudo.exe

sudo [実行したいアプリケーション] [アプリケーションに与えるコマンドライン]



su.exe

su [ユーザー名] [cmd.exeに与えるコマンドライン引数]


lsとclearは書くことないので省略させてください。あと、su.exeが本当のLinuxのsuコマンドと少し仕様が違うのは許してください


追記3

Linuxコマンドパックにpasswd.exeを追加しました。Windowsの仕様上、管理者権限を要求されちゃいますが、ご容赦下さい。


追記4

sudo.exeにバグがあったので修正しました


追記5

コマンドライン引数を与える方法が分かりました


sudo.bat

powershell -NoProfile -ExecutionPolicy unrestricted -Command "Start-Process \"%1\" -Verb runas -ArgumentList %2,%3,%4,%5,%6"


ここではコマンドライン5個までしか書いてないんですけど、このように%2,%3,%4,%5,%6,%7,%8,…と列挙していく必要があり、こっちのコマンドラインでやる場合、今のところ良い解決策が浮かんでいません。

ただ、追記2で書いた方法でしたら、強引ではありますが、こんな手段があります。


sudo.bat

powershell.exe Start-Process %1 -Verb runas -ArgumentList \"%2\"


この方法だと以下のようにコマンドラインを作成すればできることにはできます。


cmd.exe

sudo [アプリケーション名] "[アプリケーションに渡すコマンドライン]"


気を付けないといけないのは、アプリケーションに渡すコマンドラインは全てダブルくオーテーションで括って渡さないとエラーになるということくらいです