2013-08-01 157 views
2

設計流程: 非管理員用戶---->程序A(非管理員) - >程序B(需要管理員)如何從nonadmin帳戶作爲管理員用戶啓動需要管理員權限的程序

我正在編寫一個程序,以啓動需要來自非管理員帳戶的管理員權限的程序。該程序在任何用戶啓動時啓動,並以具有管理權限的不同用戶身份啓動第二個程序(要求管理員權限)。我遇到的問題是該計劃是說,要啓動一個程序作爲一個不同的用戶,它需要管理員權限。我知道這不是真的,所以我知道我的代碼中有不正確的東西來啓動第二個進程。

的代碼如下:

try 
{ 
    ProcessStartInfo myProcess = new ProcessStartInfo(path); 
    myProcess.UserName = username; 
    myProcess.Password = MakeSecureString(password); 
    myProcess.WorkingDirectory = @"C:\Windows\System32"; 
    myProcess.UseShellExecute = false; 
    myProcess.Verb = "runas"; //Does not work with or without this command 
    Process.Start(myProcess); 
} 

例外如下:

System.ComponentModel.Win32Exception (0x80004005): The requested operation requires elevation 
    at System.Diagnostics.Process.StartWithCreateProcess(ProcessStartInfo startInfo) 
    at System.Diagnostics.Process.Start() 
    at System.Diagnostics.Process.Start(ProcessStartInfo startInfo) 
    at Loader.Program.RunProgram(String path, String username, String password) 
+0

我的猜測是你的第一個進程甚至沒有通過非管理員用戶的文件權限訪問可執行文件? (System32通常不能由非管理員用戶訪問,不確定可執行文件的位置)您能否將程序移動到您認爲有權訪問的目錄並重試? –

+0

在「Process.Start」之上張貼的例外需要提升。 – CoderWalker

+0

是的,我意識到這一點,對不起 –

回答

1

我想你指的是觸發新創建過程中的UAC提示。如果是這樣,短短的幾行會做的伎倆,特別是刪除用戶名/密碼屬性(因爲他們會被Windows問),並設置UseShellExecutetrue

ProcessStartInfo myProcess = new ProcessStartInfo(path); 
myProcess.WorkingDirectory = @"C:\Windows\System32"; 
myProcess.UseShellExecute = true; 
myProcess.Verb = "runas"; 
Process.Start(myProcess); 

兩個告誡我這個發現方法是,如果用戶取消提示,則會拋出異常,表明用戶已取消(您必須準備好取消處理)。另外,如果UAC在系統上被禁用/不存在,則該過程不會被提升。爲了應對這個問題,啓動的程序必須準備好檢查它是否真的具有管理權限。

一個完全不同的方法是將清單添加到目標應用程序(如果yuo're能夠重新編譯它),指定它需要管理員權限。

+0

感謝您的評論,但我正在尋找從非管理員帳戶啓動管理程序的方式,因此用戶將無法通過管理員權限的UAC提示。我知道這是可能的,因爲Fog Tray和Novell Desktop Management可以實現這一目標。想法? – CoderWalker

+0

爲了澄清,我希望程序自動啓動任何用戶帳戶,並使用我爲該程序創建的管理員帳戶執行管理操作,而無需Windows Vista和7用戶的身份驗證。再次感謝! – CoderWalker

+0

我非常確定Windows也不會允許您在管理員/非管理員安全邊界上重定向標準輸入/輸出/錯誤。你必須找到一種不同的方式來獲得作爲管理員運行的程序的輸出 - 參考:http://stackoverflow.com/a/8690661 – Kiquenet

相關問題