CreateProcessAsUser不绘制GUI

我有一个在“SYSTEM”帐户下运行的Windows服务,它检查每个登录用户是否正在运行特定的应用程序。 如果应用程序未运行,则服务启动它(在相应的用户名下)。
我正在尝试使用CreateProcessAsUser()来实现我的目标。 该服务确实以相应的用户名启动应用程序,但未绘制GUI。 (是的,我确保启用“允许服务与桌面交互”复选框)。

系统:XP SP3,语言:C#

以下是一些可能感兴趣的代码:

PROCESS_INFORMATION processInfo = new PROCESS_INFORMATION(); startInfo.cb = Marshal.SizeOf(startInfo); startInfo.lpDesktop = "winsta0\\default"; bResult = Win32.CreateProcessAsUser(hToken, null, strCommand, IntPtr.Zero, IntPtr.Zero, false, 0, IntPtr.Zero, null, ref startInfo, out processInfo); 

据我了解,设置startInfo.lpDesktop =“winsta0 \ default”; 应该使用相应用户的桌面。
甚至与此处所述相反: http : //support.microsoft.com/kb/165194 ,我尝试将lpDesktop设置为null,或者根本不设置它,两者都给出相同的结果:进程以预期的名称启动用户和我可以看到窗口标题栏的一部分。 “不可见”窗口拦截鼠标单击事件,按预期处理它们。 它只是没有吸引自己。

有人熟悉这样的问题,知道我做错了什么吗?

MSDN有一个如何创建进程的示例,因为另一个用户在窗口站和桌面对象上设置了显式权限:

CreateProcessAsUser()窗口站和桌面

您可以使用P / Invoke将代码移植到C#,也可以使用C ++ / CLI程序集。

但是,请注意您的方案不受支持,可能会破坏Vista(和Windows 7)的Session-0隔离 (下载右侧的白皮书)。