-
Notifications
You must be signed in to change notification settings - Fork 0
MS_OperationsRequiringAdminPrivileges
-
TOP > トラブルシュート > あるある
- 管理特権が必要になる処理
- トラブルシューティング
処理に管理特権が必要になる場合の、実行方法と代表例をまとめる。
実行アカウントにローカル システム アカウントを指定する。
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 や仮想アカウントなど 権限を絞ったアカウントを使うほうが望ましい。
Administrators グループに属するユーザで、UAC にて管理特権を付与する。
管理者ツールの GUI で管理特権が必要になる処理を実行できるものがある。
これは、UAC にてアプリケーションを管理権限に昇格させて起動しているため。
なお、ClickOnce(MS_ClickOnce.md)や XBAP(MS_XBAP.md)で
UAC による管理者昇格は不可。
補足: 実行ファイル側で昇格を要求するには、 アプリケーション マニフェストに以下を記述する。
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />実行時に別プロセスとして昇格させるなら、
ProcessStartInfoのVerb = "runas"を使う (プロセス内で自身を昇格させることはできない)。
特権自体を後から獲得することはできないが、
既に付与されているが無効状態の特権を有効化することはできる
(AdjustTokenPrivileges API)。
※ このライブラリは特権付与用のライブラリではない。
移行メモ(補足): 元 Wiki には 「以下の様なコードで特権付与できるらしいが・・・」とあり、 疑問符が付いたままであった。正確には以下のとおりである。
-
C ドライブへの書き込み
(%SystemDrive%\Users\UserName(=%HOMEPATH%)を除く) -
HKEY_LOCAL_MACHINE配下のレジストリの更新 -
サービスの登録・開始・停止(SCM)
-
イベント ログのソース登録
-
ポート 1024 未満の待ち受け(※ Windows では管理者権限は不要だが、 URL 予約(
netsh http add urlacl)には必要) -
ドライバのインストール、システム時刻の変更
-
, etc.
補足: 「なぜか開発機では動くのに本番で失敗する」という事象の多くは、 開発者が管理者として実行しているためである。 UAC を有効にした標準ユーザで動作確認するのが確実である。
なお、
Program FilesやHKLMへの書き込みは UAC 仮想化によって黙って%LOCALAPPDATA%\VirtualStoreに リダイレクトされることがあり、 「書けたはずなのに他プロセスから見えない」という紛らわしい症状になる (マニフェストを持つアプリでは仮想化は無効)。
Tags: あるある, デバッグ
このWikiは「Open棟梁Project」,「OSSコンソーシアム 開発基盤部会」によって運営されています。