我正在使用第三方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