Help us understand the problem. What is going on with this article?

Windowsでsudoしたい

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というファイル名でパス通ってるとこに保存してオレオレコードサイニング証明書でも作ってデジタル署名して使って下さい

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした