CreateProcessAsUser不绘制GUI

时间:2010-04-06 10:54:06

标签: c# .net windows-services createprocessasuser

我有一个在“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,或者根本不设置它,两者都给出了相同的结果:进程是以预期用户的名义启动的,我可以看到窗口的标题栏。 “不可见”窗口拦截鼠标单击事件,按预期处理它们。它只是不吸引自己。

是否有人熟悉这样的问题并且知道我做错了什么?

1 个答案:

答案 0 :(得分:1)

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

  

<强> CreateProcessAsUser() windowstations and desktops

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

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