2017-03-14 64 views
1

我有這種情況的一個問題: 我做了2個節目:C#程序如何以管理員權限運行另一個程序?

第一個只是打印輸出稱與管理provileges推出與否,和第二個,執行第一條程序擁有管理員權限且不使用UAC。麻煩的是,第二個程序無法啓動具有管理員權限的第一個程序,我不知道爲什麼。 這是我的代碼:

的第一個程序的代碼:

// This only prints if you start as administrator or not. 
bool isElevated; 
WindowsIdentity identity = WindowsIdentity.GetCurrent(); 
WindowsPrincipal principal = new WindowsPrincipal(identity); 
isElevated = principal.IsInRole(WindowsBuiltInRole.Administrator); 
Console.WriteLine("I got admin privileges?: "+isElevated); 

代碼的第二方案:

// This execute the first program with admin privileges without UAC 
string username = "myuser"; 
SecureString userpass = new SecureString(); 
userpass.AppendChar('m'); 
userpass.AppendChar('y'); 
userpass.AppendChar('p'); 
userpass.AppendChar('a'); 
userpass.AppendChar('s'); 
userpass.AppendChar('s'); 

Process program = new Process(); 
program.StartInfo.UserName = username; 
program.StartInfo.Password = userpass; 
program.StartInfo.FileName = "Path/First_program.exe"; 
program.StartInfo.UseShellExecute = false; 
program.Start(); 

PD:我不希望用戶打開UAC,這就是爲什麼我已經插入用戶名和密碼。 在此先感謝。

+0

據我所知,你不能以這種方式繞開UAC。如果正在運行的程序沒有管理權限,則被調用的程序需要請求將觸發UAC的管理權限。 – itsme86

+0

你有沒有嘗試使密碼'SecureString'只讀? –

+0

@ BenVoigt,「SecureString」工作正常,因爲當我寫一個錯誤的密碼它會引發一個異常。 – suffuko

回答

2

你有一半的答案。另一半是程序必須請求以提升的特權執行。默認情況下,Windows程序以「基本」信任級別運行,而不管用戶可能的真實權限級別如何。爲了獲得行政權力,該計劃必須要求提升,根據定義將涉及UAC。

程序像你可使用在的ProcessStartInfo的runas動詞,或通過在任一應用程序的清單指定requireAdministrator提升權限(假設控制它們)請求高程。無論哪種方式,如果啓用UAC,用戶將得到提示。

解決這個問題的唯一方法是設置程序,否則需要提升權限作爲Windows服務,在services.msc中配置爲使用管理權限運行。在安裝/註冊服務以便以這種方式運行時,您將得到一個UAC提示,並且從此服務可以執行該任務而無需進一步的UAC操作。然後,您可以使用各種通信技術,從命名管道到像TCP這樣的真正的網絡通信,向服務發出信號,表明它應該做你想做的事。

+3

一個比服務更簡單的替代方案是計劃任務,其權限設置爲允許非特權用戶觸發它。然後你可以運行任何命令,它不必在主循環中擁有所有的服務管理工具。 –

+1

@KeithS令人驚歎的是,我會牢記這一點。 – suffuko

相關問題