今日はちょっとしたTIPS。
わけあってユーザ権限でバッチファイルを実行してOSシャットダウンをさせたい用事がありrunasコマンドを試しました。
そのとき、試したことをご報告します。自分用備忘録です。
文中はshutdown.exeコマンドを対象にしていますが、別のコマンド実行も同様に考えることができます。また利用にはご注意を。
シャットダウンコマンドの実行権限
コマンドラインから
>shutdown.exe -s -t 0
と実行するのを、バッチファイルにしてショートカットから実行するようにしたい、という用事がありました。
「デスクトップ上のこのアイコン(ショートカットを)ダブルクリックすればPCの電源がOFFになるからね~」
という具合にシンプルにしたかったことがありまして。
※普通はスタートメニューからシャットダウンを選択すれば望みの動作ができます。なので結構特殊な用事ではあるのですが。
じゃあバッチファイルでやればいいかってことで、バッチファイルにシャットダウンコマンドの実行文を記載したのですが、テスト環境では実行する権限不足でエラー。
実際にショートカットをダブルクリックするのがユーザ権限で管理者権限がないのであれば、shutdown.exeコマンドを実行してOSの電源管理を実行することができないと思われるエラーメッセージ。
※シャットダウンコマンドの実行には管理者権限が要求される。
※いや、でも実行できる環境もあったのでここの記載を実行する必要がないことも。多分ポリシーの「ユーザ権利の割り当て」にある「システムのシャットダウン」が関係している。
うーん。
runasコマンドを使おう
基本はrunasコマンド、runasコマンドでは別ユーザを指定してコマンド実行が可能なコマンド。sudoみたいだけど実際には別ユーザ実行なので実行ユーザのパスワードが要求されます。
基本の形は、コマンドプロンプトを実行するだけなら
> runas /user:%USERNAME% cmd
でOK。
%USERNAME%で指定したユーザの権限で一時的に別のコマンドプロンプトウインドウが起動してきます。
しかしこの実行にはパスワード入力が要求されてしまいます。うーんパスワードは公開したくない、そんなとき。
まとめると…
- ユーザ権限で実行できないコマンドをユーザがログイン中に実行したい。
このときは「runas /savecred」でユーザ権限のユーザでログインしていてもrunasコマンドでユーザ名を指定して一時的にPower Users権限や管理者権限を利用可能にしておきます。
※ただしユーザ名を知っているだけでそのPCでは権限の強いユーザでコマンド実行可能になってしまうので、使う環境には注意が必要。
今回の方法
今回は自分ひとりだけで利用するテスト環境だったので、「runas /savecred」でUsersグループのユーザでログインしていても、より権限の強いユーザ権限をrunasコマンドで利用できるようにしました。
簡単にやり方をメモ。
事前に
-------------------------------------------------------
runas /savecred /user:%USERNAME% cmd
%USERNAME% のパスワードを入力してください:
cmd をユーザー "%COMPUTERNAME%\%USERNAME% " として開始しています...
-------------------------------------------------------
という動作を一回実行、/savecredオプションで管理者権限のあるユーザの認証情報を記録しておく。管理者権限が強すぎるようであればPower UsersグループのユーザIDを一つ作成しておき、そのPower Usersグループのユーザアカウントを利用する。
次いで、登録した認証情報のユーザを使って以下のようなバッチを用意する。
-------------------------------------------------------
@echo off
runas /savecred /user:%USERNAME% "c:\Windows\System32\shutdown.exe -s -t 0"
-------------------------------------------------------
このバッチファイルをショートカットにしてデスクトップに置いておくと、
ユーザ権限でログインしたユーザのデスクトップ上のショートカットをダブルクリックするだけでユーザ権限でもシャットダウンが実行できるようになります。
※もちろんUsersグループがshutdown.exeを実行する権限があればこのようなことをする必要もなく、普通にコマンド実行するだけでOKです。