2011-08-09 73 views
4

好的,這是我的問題:我正在嘗試啓動第三方應用程序。這個應用程序顯然被配置爲需要提升,大概是通過嵌入式清單。我的程序正在非管理用戶的上下文中運行,我希望第三方應用程序在相同的上下文中運行。啓動新流程時繞過海拔

當我調用CreateProcess時,它返回錯誤代碼740,「請求的操作需要提升」。

我試過CREATE_PRESERVE_CODE_AUTHZ_LEVEL標誌,這聽起來有關,但它沒有區別。

第三方應用程序確實沒有管理員權限,例如,如果我禁用UAC然後以非管理員身份運行它。

在此先感謝您提供的任何提示/建議。

+0

供應商已經解釋了提升的原因 - 應用程序需要與用戶的其他進程進行交互,如果提升而不是提升,則不能執行此操作。在這種情況下,這當然不是問題,因爲沒有用戶的進程會被提升。 –

回答

7

將您的過程的環境變量__compat_layer設置爲RunAsInvoker。如果設置了這個環境變量,CreateProcess將會成功。

您可以使用SetEnvironmentVariable函數來實現此目的。

0

恐怕沒有辦法解決它。

如果啓用了UAC並且程序顯示它需要提升,那麼系統會嘗試將此過程作爲提升運行。如果你沒有提升,CreateProcess不會啓動這樣的過程。

使用ShellExecuteShellExecuteEx函數啓動此第三方應用程序。如果用戶點擊,這些功能將顯示UAC確認並啓動該過程。啓動此第三方應用程序的UI元素應具有UAC-shield,以通知用戶將顯示UAC確認。

+0

謝謝。我覺得沒有任何簡單的方法可以忽略清單,這似乎很奇怪。我相信從我讀過的內容可以看出,Microsoft應用程序兼容性工具包可能提供了一個解決方案。 –

+0

此外,在這種情況下,ShellExecute將不起作用,因爲最終用戶實際上不具有使用UAC提示所需的管理憑據。 –

+0

@哈利我還沒有看到任何提及清單的文章可以忽略。這就是它的要點:如果程序聲明它需要管理員權限,則操作系統信任程序作者並嘗試提供它們。順便說一下,聲明的級別是什麼:'requireAdministrator'或'highestAvailable'? –

1

對於某些非常簡單的程序,在其名稱中有UPDATE或SETUP或INSTALL也需要此標高;與清單無關。我們在PICK BASIC中編寫代碼,在Win2008上運行,如果我們編寫一個名爲UPDATE.TEST的HELLO WORLD程序,我們不能在沒有提升的情況下運行它。我們所需要做的就是重命名程序來修復...但煩人,並btws。

+1

這與清單有關!如果EXE不包含清單,則Windows會嘗試猜測程序是否需要提升。該邏輯僅適用於32位可執行映像,像_setup_,_install_和_update_這樣的字會觸發UAC。如果將清單添加到請求'asInvoker'執行級別的.exe,則Windows將尊重該設置,並且不顯示UAC確認。 –

0

另一種可能的解決方案是使用Microsoft Application Compatibility Toolkit來創建和安裝自定義兼容性數據庫,該數據庫將RunAsInvoker fixRunAsHighest fix應用於相關應用程序。儘管文檔沒有說明這是否適用於需要在清單中設置管理員的應用程序,但我已經測試過這個方法,它適用於我。

您可以使用sdbinst command-line tool以編程方式安裝兼容性數據庫。

(在大多數情況下,Norbert's answer將是相當簡單的使用,但也有可能是邊緣的情況下,特別是使用兼容性修補程序可能是優選的,如果你的程序是不是啓動問題的可執行文件直接負責。)