要旨
Windows Server 等で定期的に管理系のスクリプトを実行したいことがある。例えば様々なユーザーが使用するテンポラリフォルダの削除、全フォルダーの使用量調査など。 これらは管理者権限での実行が必要だが、PowerShell で書いたスクリプトはタスクスケジューラ経由だと一筋縄では実行できない。10年以上前から国内外のフォーラムでも繰り返し質問が出ているが、若干特殊なテクニックが必要なので試行錯誤の結果をメモしておく。
決して美しい解決方法とは言えないので、今後マシな方法が見つかったら更新する。
手順概要
- (管理者で実行する必要のある) PowerShell スクリプト (.ps1) を作成し、管理者モードの PowerShell コンソールから実行可能であることを確認しておく。
- 1.を管理者権限で実行するバッチファイル (.bat) を作成する。
- 2.をタスクスケジューラに管理者権限で実行されるよう登録する。
手順
1. PowerShell スクリプトの作成
.ps1 ファイルを作成し、単体で実行を確認しておく。
例) c:\batch\admin-test.ps1
2. バッチファイル作成
ps1 と同名で拡張子を .bat に変更して作成
例) c:\batch\admin-test.bat
@powershell -Command "Start-Process powershell.exe -ArgumentList c:\batch\admin-test.ps1 -WindowStyle Hidden -Wait -Verb runas"
3. タスクスケジューラに登録
タスクスケジューラ登録例:
タスクの名前と説明は、実際に実行する操作のわかりやすい説明にしておくことをお勧め。
無人実行を想定しているので「ユーザーがログオンしているかどうかにかかわらず実行する(W)」、かつ「最上位の特権で実行する(I)」、「表示しない(E)」をチェック。実行ユーザーは管理者権限のあるユーザーを指定。
※これだけで管理者権限が付与される気がするのだが、実際には付与されない。
実行には単純に上記で作成したバッチファイルを指定する。
タスクの登録時に実行ユーザーのパスワードを聞かれるので入力。
実行テスト
登録したタスクを右クリック→「実行する(R)」をクリックし、想定する挙動になるか確認する。
あとがき
この件をもろもろ調査したのだが、10年以上前から国内外のフォーラムでも繰り返し質問が出ており、明確に解決できている例は少なかった。
管理者権限を伴わないスクリプトは比較的簡単に登録できる。が、権限の昇格において、タスクスケジューラの仕様か挙動での壁があるようだ。PowerShell は全 Windows に搭載されている強力な言語のため、セキュリティ問題が出ないよう厚くガードされているのかもしれない。
フォーラムや QA サイトで紹介されていた例をいくつか試したが、いずれも Windows Server 2019 では正常動作しなかった。
- コマンドに Powershell のフルパス “%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe” を指定し、 -verb RunAs で起動
- powershell の起動オプションに -executionpolicy bypass を追加する