Skip to content

MS_OperationsRequiringAdminPrivileges

nishi_74322014 edited this page Aug 3, 2026 · 1 revision

管理特権が必要になる処理

概要

処理に管理特権が必要になる場合の、実行方法と代表例をまとめる。

実行方法

ローカル システム アカウントで実行させる

サーバーアプリケーションなら

実行アカウントにローカル システム アカウントを指定する。

デスクトップアプリケーションなら

at コマンドでタスク スケジューラに登録し、
ローカル システム アカウントで実行する。

移行メモ(最新化): at コマンドは Windows 8 / Windows Server 2012 で非推奨となり、 現在は schtasks (または PowerShell*-ScheduledTask)を使う。

schtasks /create /tn MyTask /tr "C:\app\tool.exe" /sc once /st 00:00 /ru SYSTEM /rl HIGHEST

また、Windows Vista 以降は セッション 0 分離により、 サービスやローカル システムで動作するプロセスは 対話ユーザのデスクトップに UI を表示できない。 「デスクトップ アプリを SYSTEM で動かす」という手法は、 画面を伴う処理では成立しない点に注意すること。

なお、恒常的に SYSTEM で動かすより、 gMSA仮想アカウントなど 権限を絞ったアカウントを使うほうが望ましい。

UACにて管理特権を付与する

Administrators グループに属するユーザで、UAC にて管理特権を付与する。

管理者ツールの GUI で管理特権が必要になる処理を実行できるものがある。
これは、UAC にてアプリケーションを管理権限に昇格させて起動しているため。

なお、ClickOnce(MS_ClickOnce.md)や XBAP(MS_XBAP.md)で
UAC による管理者昇格は不可。

補足: 実行ファイル側で昇格を要求するには、 アプリケーション マニフェストに以下を記述する。

<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />

実行時に別プロセスとして昇格させるなら、 ProcessStartInfoVerb = "runas" を使う (プロセス内で自身を昇格させることはできない)。

プログラムから付与

特権自体を後から獲得することはできないが、
既に付与されているが無効状態の特権を有効化することはできる
AdjustTokenPrivileges API)。

※ このライブラリは特権付与用のライブラリではない。

移行メモ(補足): 元 Wiki には 「以下の様なコードで特権付与できるらしいが・・・」とあり、 疑問符が付いたままであった。正確には以下のとおりである。

  • Windows の特権(privilege) は、 ログオン時にアクセス トークンへ列挙され、 既定では多くが 無効(disabled) 状態になっている。
  • AdjustTokenPrivileges は、 そのトークンが既に保持している特権を有効化するだけであり、 持っていない特権を新たに付与することはできない。
  • 特権そのものの付与は ローカル ポリシーグループ ポリシーの 「ユーザー権利の割り当て」で行う(次回ログオンから有効)。

処理の例

  • C ドライブへの書き込み
    %SystemDrive%\Users\UserName(= %HOMEPATH%)を除く)

  • ローカル マシンの証明書ストアの更新処理

  • HKEY_LOCAL_MACHINE 配下のレジストリの更新

  • サービスの登録・開始・停止(SCM

  • イベント ログのソース登録

  • ポート 1024 未満の待ち受け(※ Windows では管理者権限は不要だが、 URL 予約(netsh http add urlacl)には必要)

  • ドライバのインストール、システム時刻の変更

  • , etc.

補足: 「なぜか開発機では動くのに本番で失敗する」という事象の多くは、 開発者が管理者として実行しているためである。 UAC を有効にした標準ユーザで動作確認するのが確実である。

なお、Program FilesHKLM への書き込みは UAC 仮想化によって黙って %LOCALAPPDATA%\VirtualStore に リダイレクトされることがあり、 「書けたはずなのに他プロセスから見えない」という紛らわしい症状になる (マニフェストを持つアプリでは仮想化は無効)。

参考


Tags: あるある, デバッグ

NetDevInfraWiki

マイクロソフト系技術情報 Wiki
Open 棟梁 Wiki

(未着手)

開発基盤部会 Wiki

移行管理: DONETODO

Clone this wiki locally