CreateProcessAsUser に関する Stack Overflow のすべての投稿を読みましたが、解決された質問はほとんどないため、これについては息を止めていません。でも確実に何かが欠けているような気がするので、簡単かもしれません。
対象OSはWindows XPです。「ローカル システム」として実行されているサービスがあり、そこから別のユーザーとして実行されるプロセスを作成したいと考えています。そのユーザーのユーザー名とパスワードがあるので、LogonUser はうまくいき、ユーザー (この場合は管理者アカウント) のトークンを取得します。次に、そのトークンを使用して CreateProcessAsUser を呼び出そうとしますが、そのトークンが原因で失敗します。 SeAssignPrimaryTokenPrivilege は付属していませんが、SeIncreaseQuotaPrivilege は持っています。(GetTokenInformation を使用して、そのトークンに関連付けられているすべての特権をダンプしました。) CreateProcessAsUser の MSDN ページによると、CreateProcessAsUser を正常に呼び出すには両方の特権が必要です。
また、CreateProcessAsUser() に渡すトークンが、CreateRestrictedToken() で作成できる「呼び出しプロセスのプライマリ トークンの制限付きバージョン」である場合、SeAssignPrimaryTokenPrivilege は必要ないと言われていますが、関連付けられます。プロセスを実行しようとしているターゲットユーザーではなく、ローカルシステムユーザーです。
では、呼び出しプロセスのプライマリ トークンの制限付きバージョンであり、かつ別のユーザーに関連付けられているログオン トークンを作成するにはどうすればよいでしょうか。ありがとう!
ここではユーザーの操作は不要であることに注意してください。すべて無人です。そのため、WINSTA0 を取得するなどの操作を行う必要はありません。