2010-04-06 57 views
2

我有一个在“SYSTEM”帐户下运行的windows服务,它检查每个登录用户是否运行特定的应用程序。如果应用程序没有运行,服务将启动它(在相应的用户名下)。
我试图用CreateProcessAsUser()完成我的目标。该服务确实在相应的用户名下启动应用程序,但未绘制GUI。 (是的,我确保启用“允许服务与桌面交互”复选框)。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 \默认”;应该使用了相应用户的桌面。
即使与此处所述的内容相反:http://support.microsoft.com/kb/165194,我尝试将lpDesktop设置为null,或者根本不设置它,两者都给出相同的结果:进程是以预期用户的名义启动的,我可以看到窗口标题的一部分酒吧。 “不可见”窗口拦截鼠标点击事件,按预期处理它们。它只是不吸引自己。

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

+0

我面临同样的问题,您是否能够找到解决方案? – 2011-01-30 21:55:30

回答

1

MSDN对如何创建一个进程作为另一个用户在窗口站和桌面对象设置明确的权限样本:

CreateProcessAsUser() windowstations and desktops

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

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