umq (4421) の日記

○ ◎ ●

RunAs on Windows

umq による 2005年01月13日 20時51分 の日記 (#275312)

伊原さんの日記に、Windows の RunAs について書かれている。
RunAs は、su(1)sudo(8) に近く、現在とは異なるユーザコンテキストでプログラムを実行させることができる。

件の日記で問題になっていたのは、コマンドプロンプトから RUNAS.EXE を起動させる場合と、EXPLORER.EXE のコンテキストメニューからダイアログを開いて実行する場合で挙動に違いがある、ということだった。
具体的には、EXPLORER.EXE からダイアログを開いたときに選択できるオプション、「許可されていないプログラムの動作からコンピュータとデータを保護する(P)」に相当するスイッチが RUNAS.EXE コマンドには、ないのではないか、という話。

RUNAS.EXE/? スイッチつきで実行して得られるヘルプに表れない /trustlevel というスイッチがあるようなので、コメント欄にそのように書いたのだが、調べていってみるとどうも違うようである。

ちょっと分量もあるので、ここにまとめてみる。

RunAs ダイアログの「許可されていないプログラムの動作からコンピュータとデータを保護する(P)」オプションは、どういう意味を持つか。
英語版では "Protect my computer and data from unauthorized program activity" と表示される(らしい)このオプションの文字列で検索をかけてみると、 Well-Known Security Identifiers の記述にあたる。

S-1-5-12
Restricted
An identity used by a process that is executed in a restricted security context. When you launch a program in Windows XP Professional with the graphical RunAs utility, selecting "Protect my computer and data from unauthorized program activity" runs the program with a restricted token that contains the S-5-12 SID.

SID(Security Identity) 云々とあるので、関連しそうな情報について、MSDN を調べてみると、SHCreateProcessAsUser() が、"This function is similar to ShellExecuteEx with runas as the verb." と書かかれている。
尤も、SHCreateProcessAsUser() は、Windows XP ではサポートされないとも書いてあるので、リンクをたどって、CreateProcessAsUser() に行き着く。

CreateProcessAsUser() についての説明を読み進めて行くと、ImpersonateLoggedOnUser() を使うとセキュリティコンテキスト下でディレクトリや実行ファイルにアクセスできるとある。
どうやら、これが答えのようだ。

ところで、RUNAS.EXE/trustlevel スイッチは、どういう役割になるのだろう。
ちゃんと調べてないが、COM+ の Software Restriction Policy に関連するプロパティ、SRPTrustLevel を指定するものじゃないかと思われる。

参考資料

おまけ
参考に、制限設定を変えて起動した CMD.EXE 上で Windows 2000 リソースキットの WHOAMI.EXE を使って、権限を比べてみた。
Windows Server 2003 の WHOAMI.EXE は "You can use Whoami to display the complete contents of a user's access token in the command window." とあるので、もっといろいろな情報がとれるかもしれない。

通常起動時:
C:\PROGRA~1\RESOUR~1>whoami /priv

(X) SeChangeNotifyPrivilege =
(O) SeSecurityPrivilege =
(O) SeBackupPrivilege =
(O) SeRestorePrivilege =
(O) SeSystemtimePrivilege =
(O) SeShutdownPrivilege =
(O) SeRemoteShutdownPrivilege =
(O) SeTakeOwnershipPrivilege =
(O) SeDebugPrivilege =
(O) SeSystemEnvironmentPrivilege =
(O) SeSystemProfilePrivilege =
(O) SeProfileSingleProcessPrivilege =
(O) SeIncreaseBasePriorityPrivilege =
(X) SeLoadDriverPrivilege
(O) SeCreatePagefilePrivilege
(O) SeIncreaseQuotaPrivilege
(X) SeUndockPrivilege
(O) SeManageVolumePrivilege
(X) SeCreateGlobalPrivilege
(X) SeImpersonatePrivilege

RunAs ダイアログから「保護」オプションありで起動した場合:
C:\PROGRA~1\RESOUR~1>whoami /priv

(X) SeChangeNotifyPrivilege =

この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。

人生の大半の問題はスルー力で解決する -- スルー力研究専門家

処理中...