別のユーザー アカウントの (昇格されていない) 資格情報で、そのユーザーが既にログインしている間にアプリケーションを実行したいと考えています。具体的には、アプリケーションのインストーラー (任意の管理者アカウントで実行される) が、ログインしている各ユーザーのデスクトップ セッションにプロセスを生成するようにします。これらのプロセスはサービスと通信し、ユーザーが操作できるようにデスクトップにウィンドウを表示します。
通常、 として実行されているサービスからLocalSystem
のアプローチはWTSQueryUserToken
->CreateProcessAsUser
です。ただし、アカウントWTSQueryUserToken
の外部で(特権を使用して) 実行されないため、ここではそのアプローチは失敗します。LocalSystem
SE_TCB_NAME
ユーザーがまだログインしていない場合は、アプリケーションを で実行するように登録するだけで、ログインしているHKLM\...\Run
ユーザーはログイン時にアプリケーションのコピーを取得できます。しかし、ユーザーが既にログインしている場合は、どちらも機能しません (少なくとも、ログアウトして再度ログインするまでは機能しません)。
考えられる答えは 2 つあります。
これはできません。ごめん。
別の場所からトークンを取得し (おそらく、explorer.exe プロセスを列挙し、それぞれからアクセス トークンを取得しますか?)、 を呼び出し
DuplicateTokenEx
て、 に渡しCreateProcessAsUser
ます。このアプローチを試してみたところ、OpenProcessToken
別のユーザー セッションで実行中のプロセスを実行しようとすると、デバッグ権限が有効になっており、プロセスがPROCESS_ALL_ACCESS
.
どう思いますか?
答えが #1 (「これを行うことはできません」) の場合、昇格されていないプロセスを生成してサービスとユーザーの間を仲介するための推奨されるベスト プラクティスは何ですか? サービスが CreateProcessAsUser を介してこれらのプロセスを各セッションに生成するのがベスト プラクティスですか? または、昇格されていないプロセスを個別に実行するのがベスト プラクティスですか (たとえば、HKLM\...\Run
またはを介してHKCU\...\Run
)?