2008-09-25 100 views
114

我正在嘗試使用InstallUtil.exe安裝服務,但通過Process.Start進行調用。下面的代碼:以編程方式提升進程權限?

ProcessStartInfo startInfo = new ProcessStartInfo (m_strInstallUtil, strExePath); 
System.Diagnostics.Process.Start (startInfo); 

其中m_strInstallUtil是完全合格的路徑和EXE爲「InstallUtil.exe」和strExePath是完全合格的路徑/名稱,以我的服務。

從提升的命令提示符運行命令行語法工作;從我的應用程序運行(使用上面的代碼)不會。我假設我正在處理一些進程提升問題,那麼我將如何在升級狀態下運行我的進程?我需要查看ShellExecute嗎?

這些都在Windows Vista上。我正在將VS2008調試器中的進程提升爲管理員權限。

我也試過設置startInfo.Verb = "runas";,但它似乎沒有解決問題。

回答

138

您可以指定新的過程應該提升的權限由您的StartInfo對象的動詞屬性設置爲「運行方式」來啓動,如下所示:

startInfo.Verb = "runas"; 

這將導致Windows行爲,如果過程已經從Explorer以「以管理員身份運行」菜單命令啓動。

這意味着UAC提示會出現並需要用戶確認:如果這是不受歡迎的(例如,因爲它會在漫長的過程中發生),則需要運行整個主機進程使用提升的權限Create and Embed an Application Manifest (UAC)來要求「最高可用」執行級別:這將使您的應用程序啓動後立即顯示UAC提示,並使所有子進程以提升的權限運行而無需額外的提示。

編輯:我看到你剛編輯你的問題,說「runas」不適合你。這真的很奇怪,因爲它應該(並且適用於我的幾個生產應用程序)。但是,通過嵌入清單來要求父級進程使用提升的權限運行,這絕對有用。

+6

「runas」也不適合我。可能是因爲它只能在UAC關閉的情況下工作? – 2009-04-03 12:43:11

+0

它幫助我,我不知道這是否適用於所有的Windows操作系統? – 2012-04-17 14:04:49

+1

這似乎不適用於Windows 8.在以前的版本上工作良好。 – Despertar 2013-01-26 00:17:31

1

您應該使用模擬來提升狀態。

WindowsIdentity identity = new WindowsIdentity(accessToken); 
WindowsImpersonationContext context = identity.Impersonate(); 

當您完成時,不要忘記撤消模擬的上下文。

+21

你還沒有說過如何獲取accessToken。當啓用UAC時,LogonUser將提供用戶的受限安全上下文。 – cwa 2011-03-30 18:45:39

19

根據this article,只有ShellExecute檢查嵌入式清單並在需要時提示用戶提升,而CreateProcess和其他API則不提供。希望能幫助到你。

5
[PrincipalPermission(SecurityAction.Demand, Role = @"BUILTIN\Administrators")] 

這將做到沒有UAC - 不需要開始一個新的過程。如果正在運行的用戶是我的情況下管理員組的成員。

34

這段代碼放在上面一起,並重新啓動與管理PRIVS當前WPF應用程序:在視覺

右鍵單擊項目:

if (IsAdministrator() == false) 
{ 
    // Restart program and run as admin 
    var exeName = System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName; 
    ProcessStartInfo startInfo = new ProcessStartInfo(exeName); 
    startInfo.Verb = "runas"; 
    System.Diagnostics.Process.Start(startInfo); 
    Application.Current.Shutdown(); 
    return; 
} 

private static bool IsAdministrator() 
{ 
    WindowsIdentity identity = WindowsIdentity.GetCurrent(); 
    WindowsPrincipal principal = new WindowsPrincipal(identity); 
    return principal.IsInRole(WindowsBuiltInRole.Administrator); 
} 


// To run as admin, alter exe manifest file after building. 
// Or create shortcut with "as admin" checked. 
// Or ShellExecute(C# Process.Start) can elevate - use verb "runas". 
// Or an elevate vbs script can launch programs as admin. 
// (does not work: "runas /user:admin" from cmd-line prompts for admin pass) 

更新:應用程序清單的方法是首選工作室,添加新的應用程序清單文件,更改文件,以便您按照上面所示設置requireAdministrator。

原始方式的問題:如果將重新啓動代碼放入app.xaml.cs的OnStartup中,即使調用Shutdown,仍可能會短暫地啓動主窗口。如果app.xaml.cs init沒有運行,並且在某些競爭條件下它會執行此操作,那麼我的主窗口會崩潰。

相關問題