umqの日記: RunAs on Windows
伊原さんの日記に、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 を指定するものじゃないかと思われる。
参考資料
- RunAs
- Running with Special Privileges
- Client Impersonation
- CreateProcessAsUser()
CreateProcessAsUser()(日本語だがちょっと古い) - ImpersonateLoggedOnUser()
ImpersonateLoggedOnUser()(日本語だがちょっと古い) - CreateProcessWithLogonW()
CreateProcessWithLogonW()(日本語だがちょっと古い) - CreateProcessWithTokenW()
- SHCreateProcessAsUser()
- Security Principals Technical Reference→Active Directory Accounts and Security Groups→Active Directory Groups→Special Identities
- Security Principals Tools
- Using the Software Restriction Policy in COM+
- 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 =
RunAs on Windows More ログイン