87
69

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Windowsでsudoしたい

Last updated at Posted at 2016-09-24

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 [アプリケーション名] "[アプリケーションに渡すコマンドライン]"

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

追記6

PowerShell Script版ができあがりましたので書いておきます

sudo.ps1
$ExecutionApplication = $Args[0]
$WorkingPath = Split-Path $ExecutionApplication
if ($Args.Length -gt 1) {
  $arglist = $Args[1]
  if ($Args.Length -gt 2)
  {
  	for ($i = 2; $i -lt $Args.Length; $i++) 
  	{
  		$arglist = $arglist + "," + $Args[$i]
  	}
  }
  Start-Process $ExecutionApplication -Verb runas -WorkingDirectory $WorkingPath -ArgumentList $arglist
}
else
{
  Start-Process $ExecutionApplication -Verb runas -WorkingDirectory $WorkingPath
}

sudo.ps1というファイル名でパス通ってるとこに保存してオレオレコードサイニング証明書でも作ってデジタル署名して使って下さい

追記7

実行ファイルに私のクリエイター活動用商号「明月」のでですがデジタル署名しました

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

追記2でアップロードしてるのと同じものではありますが、追記2の方のリンクでダウンロードできるものはデジタル署名してないので非推奨です。自分で挙動等を確認して自分でデジタル署名したいというのでなければこっちをダウンロードして下さい

87
69
5

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
87
69

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?