コマンドプロンプトでsuを使いたい

コマンドプロンプトで管理者権限が必要な操作をするとき、

  • 検索窓からcmdとか打つ
  • 右クリック->管理者として実行
  • UACが出てくるからボタンを押す
  • カレントディレクトリがC:\Windows\system32になるから、移動する

とかしなければいけなくて、非常に面倒です。
そこで、手軽に管理者権限のコマンドプロンプトを立ち上げられる方法を考えました。
欲しい機能は以下の通り。

  • パスワード入力が要らない … runasを使うとパスワード入力が必要
  • UACを出さない
  • カレントディレクトリが引き継がれる

つまり、unixでいうsuコマンドのパスワードが要らないバージョンが欲しい訳です。

UACを出さないで管理者権限で実行する方法には、タスクスケジューラを用いる方法があります。
タスクスケジューラから実行されるタスクに直接カレントディレクトリを与えることはできないため、ファイルで受け渡ししました。


処理の流れは以下の通り

  1. su.batを起動する
  2. su.batが、カレントディレクトリを記入したファイルpwd.txtを作る
  3. su.batが、あらかじめ登録しておいたタスク"su"を実行
  4. タスク"su"が、su_child.batを管理者権限で実行
  5. su_child.batがpwd.txtを読み、カレントディレクトリを取得
  6. su_child.batが、元のカレントディレクトリでコマンドプロンプトを起動

su.bat

cd>%USERPROFILE%\pwd.txt
schtasks /run /tn su

su_child.bat

for /f %%i in ('type %USERPROFILE%\pwd.txt') do cmd /k "cd %%i & del %USERPROFILE%\pwd.txt"

タスク"su"

全般タブ:"最上位の特権で実行する" をチェック
トリガー:空欄のまま
操作:プログラムの開始 su_child.bat (パスが通っていない場合は絶対パスで)
設定:"タスクが既に実行中の場合に適用される規則"を"新しいインスタンスを並列で実行"にする (複数のコマンドプロンプトを起動できるように)

これでsu.batを起動すると、カレントディレクトリを保ったまま、UAEのダイアログなしで管理者権限のコマンドプロンプトが立ち上がります。

pwd.txtはホームディレクトリ(C:\Users\ユーザ名\)に作られますが、su.batとsu_child.batの%USERPROFILE%\pwd.txtのところを変えれば自由に変えられます。
(%USERPROFILE%はホームディレクトリを示す環境変数)