Linux使ってる人は、Windowsで管理者に昇格させる時、わざわざファイルの場所開いて逆クリックして「管理者として実行」を選ぶのめんどいと思っているのではないでしょうか?
Linuxみたいにsudoでできないのかなと思った人もいるんではないでしょうか?
できます
Pathが通っているディレクトリ(例えば、C:\Windows\System32
)に以下のバッチファイルを置くだけでsudo suコマンドが実現できます。
@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.batpowershell.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.exesudo [実行したいアプリケーション] [アプリケーションに与えるコマンドライン]
su.exesu [ユーザー名] [cmd.exeに与えるコマンドライン引数]
lsとclearは書くことないので省略させてください。あと、su.exeが本当のLinuxのsuコマンドと少し仕様が違うのは許してください
追記3
Linuxコマンドパックにpasswd.exeを追加しました。Windowsの仕様上、管理者権限を要求されちゃいますが、ご容赦下さい。
追記4
sudo.exeにバグがあったので修正しました
追記5
コマンドライン引数を与える方法が分かりました
sudo.batpowershell -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.batpowershell.exe Start-Process %1 -Verb runas -ArgumentList \"%2\"
この方法だと以下のようにコマンドラインを作成すればできることにはできます。
cmd.exesudo [アプリケーション名] "[アプリケーションに渡すコマンドライン]"
気を付けないといけないのは、アプリケーションに渡すコマンドラインは全てダブルクオーテーションで括って渡さないとエラーになるということくらいです
追記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の方のリンクでダウンロードできるものはデジタル署名してないので非推奨です。自分で挙動等を確認して自分でデジタル署名したいというのでなければこっちをダウンロードして下さい