CreateProcessAsUser での lpEnvironment の使用を理解する必要があります。
私のソリューションには、ローカル システムとして実行されている Windows サービスによって呼び出されるこれらの 2 行のコードがあります。
CreateProcessAsUser(hTokenCpy, null, applicationName, ref saProcess, ref saThread, false, CREATE_UNICODE_ENVIRONMENT, hEnv, null, ref si, out procInfo)
これを呼び出した後に呼び出される
CreateEnvironmentBlock(out hEnv, hTokenCpy, false) || hEnv == IntPtr.Zero)
ただし、CreateProcessAsUser の呼び出しが失敗した場合。
hEnv/IpEnvironment = 0 を渡すことで、別の試行が行われます。
CreateProcessAsUser(hTokenCpy, null, applicationName, ref saProcess, ref saThread, false, 0, IntPtr.Zero, null, ref si, out procInfo
ただし、プロセスが特定のユーザー名で作成されると、作成されたプロセスはデスクトップとの対話に失敗します。ログオンユーザーとプロセスが実行されているユーザーは同じですが。
これは、ログオンした User ではなく、Windows サービスのメモリ ブロックの下にプロセスが作成されているためですか?