2014-02-20 61 views
0

我有一個文件MyUtilities.exe更改與代碼的可執行兼容性

當我運行: Process.Start("MyUtilities.exe","SomeParameter");

該進程的退出代碼爲0(OK),如果它運行沒有管理員權限。如果我以管理員退出碼的形式運行該代碼爲1!

由於我沒有創建MyUtilities.exe我無法修改它。

在我需要運行Process.Start("MyUtilities.exe","SomeParameter");作爲管理員並使其返回退出代碼末尾= 0。我設法做到這一點的方法是通過改變它的兼容性:

enter image description here

(右鍵點擊文件 - >屬性 - >兼容性 - >運行該程序作爲管理員)改變,現在我能夠運行Process.Start("MyUtilities.exe","SomeParameter");作爲管理員擁有它之後

返回0。

退出代碼所以我的問題是我如何可以改變代碼該文件的兼容性,從而確保我沒有告訴用戶右鍵點擊該文件,然後更改設置。

+0

這裏的一切有幫助嗎? http://stackoverflow.com/questions/2532769/how-to-start-a-process-as-administrator-mode-in-c-sharp – Crono

+1

是否必須直接調用MyUtilities.exe?是否可以調用調用MyUtilities.exe的MyUtilitiesStarter.exe? – Linky

+0

我不明白。你想開始另一個過程升高還是不升高? –

回答

6

這看起來很簡單。只需向註冊表添加一個值即可。

重點:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers - 或 - HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers

名稱:f:\ull\path\to\executable.exe

值:RUNASADMIN

這裏是你將如何在代碼中做到這一點。如果您寫信給HKCU,調用過程不需要以管理員身份運行。

static void SetRunAsAdmin(string exeFilePath) 
{ 
    var key = Registry.CurrentUser.OpenSubKey(@"SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers", true); 
    if (key == null) 
     throw new InvalidOperationException(@"Cannot open registry key HKCU\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers."); 
    using (key) 
     key.SetValue(exeFilePath, "RUNASADMIN"); 
} 
+0

OP詢問如何在代碼*中執行*。 – Crono

+1

如果OP無法以編程方式寫入註冊表,他就會頭痛。 :) –

+0

這不是重點。該進程可以在一個安全上下文中執行,該安全上下文不允許它寫入註冊表,但仍允許運行一個外部進程(彈出「你想以管理員身份運行」對話框)。 – Crono