我在“ 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提供了一个示例,该示例说明了如何以另一个用户的身份在window station和桌面对象上设置显式权限的过程:
CreateProcessAsUser() windowstations and desktops
您可以使用P / Invoke将代码移植到C#,也可以使用C ++ / CLI程序集。
但是,请注意,您的方案不受支持,并且可能会因Vista(和Windows 7)Session-0 isolation中断(请下载右侧的白皮书)。