5

CreateProcessAsUser に関する Stack Overflow のすべての投稿を読みましたが、解決された質問はほとんどないため、これについては息を止めていません。でも確実に何かが欠けているような気がするので、簡単かもしれません。

対象OSはWindows XPです。「ローカル システム」として実行されているサービスがあり、そこから別のユーザーとして実行されるプロセスを作成したいと考えています。そのユーザーのユーザー名とパスワードがあるので、LogonUser はうまくいき、ユーザー (この場合は管理者アカウント) のトークンを取得します。次に、そのトークンを使用して CreateProcessAsUser を呼び出そうとしますが、そのトークンが原因で失敗します。 SeAssignPrimaryTokenPrivilege は付属していませんが、SeIncreaseQuotaPrivilege は持っています。(GetTokenInformation を使用して、そのトークンに関連付けられているすべての特権をダンプしました。) CreateProcessAsUser の MSDN ページによると、CreateProcessAsUser を正常に呼び出すには両方の特権が必要です。

また、CreateProcessAsUser() に渡すトークンが、CreateRestrictedToken() で作成できる「呼び出しプロセスのプライマリ トークンの制限付きバージョン」である場合、SeAssignPrimaryTokenPrivilege は必要ないと言われていますが、関連付けられます。プロセスを実行しようとしているターゲットユーザーではなく、ローカルシステムユーザーです。

では、呼び出しプロセスのプライマリ トークンの制限付きバージョンであり、かつ別のユーザーに関連付けられているログオン トークンを作成するにはどうすればよいでしょうか。ありがとう!

ここではユーザーの操作は不要であることに注意してください。すべて無人です。そのため、WINSTA0 を取得するなどの操作を行う必要はありません。

4

1 に答える 1

4

SE_ASSIGNPRIMARYTOKEN_NAMEは、プロセス/スレッドで OpenProcessToken/OpenThreadToken+LookupPrivilegeValue+AdjustTokenPrivileges を使用して有効にできる特権です (これをTOKEN_ASSIGN_PRIMARYと混同するのは簡単です。MSDN は、プロセスにプライマリ トークンをアタッチするには両方が必要だと言っています)。

この XP:SP2 マシンでは、LogonUser(...,LOGON32_LOGON_INTERACTIVE,...)+CreateProcessAsUser を呼び出すだけで、特権をいじらずに問題なく動作します (偽の cmd.exe サービスを使用しますが、問題にはなりません)。

MSDN のこの引用:

必要な特権がまだ有効になっていない場合、CreateProcessAsUser は呼び出し中にそれらを有効にします。

そして、あなたがSYSTEMとして実行していて、あらゆる特権を有効にできるはずであるという事実は、この割り当てプライマリのものは問題ではないと私に信じさせます.

于 2010-06-03T18:40:24.493 に答える