我正在使用第三方Windows服务,它通过使用CreateProcessAsUser()运行脚本和可执行文件来处理一些自动化任务。由于UAC,我遇到了Windows Server 2008上的问题,并且通过API处理LUA提升的方式。从非交互式服务(win32/.net/powershell)启动UAC提升进程
该服务作为LocalSystem运行,但未启用“与桌面交互”。这些进程以管理员组中的用户身份运行,但不是管理员帐户(它受到许多UAC限制的豁免)。所有的UAC默认设置都已到位。
我可以将任意命令或PowerShell代码传递给该服务,但似乎无法“爆发”由服务启动的非提升非交互式进程。
问题的症结似乎是启动升级过程的唯一(公共)API选项是带有'runas'动词的ShellExecute(),但据我所知,不能从一个非交互式的服务,或者你会得到像“这个操作需要一个交互式窗口站”的错误。
我发现的唯一的解决方法就是这里所说的: http://www.eggheadcafe.com/software/aspnet/29620442/how-to-proper-use-sendinp.aspx
在Vista中,官方记录的方式 提升处理仅使用 外壳API的ShellExecute(防爆)(未 的CreateProcess或CreateProcessAsUser)。 因此,您的应用程序必须调用 ShellExecute(Ex)才能启动一个帮助程序 以提升调用SendInput。 此外,由于会话0 隔离,服务只能使用 CreateProcessAsUser或 CreateProcessWithLogonW(不能用 的ShellExecute(实施例))来指定 交互式桌面。
..我认为没有直接的方式来 产生从 窗口服务的升级过程。我们只能首先使用 CreateProcessAsUser或 CreateProcessWithLogonW将 未提升进程产生到用户会话(交互式桌面) 会话中。然后在 的非升级过程中,可能会使用ShellExecute(Ex) 为实际任务产生提升的 进程。
从.NET/PowerShell代码做到这一点,它看起来像我不得不做一些精细的P/Invoke东西调用CreateProcessAsUser或CreateProcessWithLogonW由于.NET System.Diagnostics.ProcessStartInfo不具有相当于我可以设置为“winsta0 \ default”的lpDesktop。我并不清楚LocalSystem是否有权调用CreateProcessAsUser或CreateProcessWithLogonW。
我也看了 http://blogs.msdn.com/alejacma/archive/2007/12/20/how-to-call-createprocesswithlogonw-createprocessasuser-in-net.aspx 和 Process.Start with different credentials with UAC on
基于这一切,我到达的结论是,有这样做没有直接的方法。我错过了什么吗?这似乎并不像它应该那么难。感觉就像UAC从来没有设计过处理非交互式用例。
如果有任何微软的人最终读到这个,我注意到ShellExecute内部处理提升的方式是通过调用Application Information Service(AIS)。为什么对于通过一些Win32或.NET API可用的AIS进行相同的调用? http://msdn.microsoft.com/en-us/library/bb756945.aspx
对不起,跑了一会儿。感谢您的任何想法。
反而说服务器核心不支持UAC。似乎证实我的评估。 http://blogs.technet.com/server_core/archive/2009/01/19/user-account-control-uac-and-server-core.aspx – 2010-03-11 16:37:01
看到我的帖子在这里解释如何,特别是看看LinkedToken部分:http://brianbondy.com/blog/id/100/understanding-windows-at-a-deeper-level-sessions-window-stations-and-desktops – 2010-10-22 14:49:03