2013-05-13 203 views
4

我想以管理員身份運行cmd.exe,參數爲C#,以防止出現UAC彈出窗口。這是必要的,以便將其用作自動化安裝過程。我傳入的命令只是安裝文件(.exe)的一個路徑,其安裝文件爲/q以C#參數的管理員身份運行CMD

當我運行這個代碼時,有一個CMD彈出窗口,但它運行時就好像它沒有執行任何操作。

public static string ExecuteCommandAsAdmin(string command) 
{ 

    ProcessStartInfo procStartInfo = new ProcessStartInfo() 
    { 
     RedirectStandardError = true, 
     RedirectStandardOutput = true, 
     UseShellExecute = false, 
     CreateNoWindow = true, 
     FileName = "runas.exe", 
     Arguments = "/user:Administrator cmd /K " + command 
    }; 

    using (Process proc = new Process()) 
    { 
     proc.StartInfo = procStartInfo; 
     proc.Start(); 

     string output = proc.StandardOutput.ReadToEnd(); 

     if (string.IsNullOrEmpty(output)) 
      output = proc.StandardError.ReadToEnd(); 

     return output; 
    } 
} 
+3

這就是UAC存在的原因,以防止不必要的/潛在的惡意特權升級悄然發生。 – 2013-05-13 19:32:59

+0

它是不是更容易提升它的自我微星:http://stackoverflow.com/questions/8721349/how-do-install-with-elevated-permissions-using-a-wix-installer但記住,你可以不跳過UAC .... – rene 2013-05-13 19:36:55

回答

6

沒有與你的命令,這條線的至少一個問題:

Arguments = "/user:Administrator cmd /K " + command 

應該是:

Arguments = "/user:Administrator \"cmd /K " + command + "\"" 

而且,這將無法工作作爲一個完全自動化的過程,因爲它會要求輸入Windows Vista及更新版本中的管理員密碼未知。

+0

它如何完全自動化。 – 2015-09-09 05:22:33

1

根據「用戶帳戶控制設置」中的用戶設置,UAC將彈出。一個程序不能繞過這個。只有當用戶具有「從不通知」設置時,您的程序纔會執行您正在嘗試執行的操作。

+2

實際上,「從不通知」會使程序默默失敗。 – Rafael 2013-05-13 19:39:31

+0

根據MSFT文檔: With Never notify,「在對您的計算機進行任何更改之前,您都不會收到通知。如果您以管理員身份登錄,程序可以在您不知情的情況下對計算機進行更改「。 如果您以標準用戶身份登錄,則任何需要管理員權限的更改都將被自動拒絕。 – edtheprogrammerguy 2013-05-13 19:41:54

1

兩種解決方案: 首先,您可能會在用戶的appdata目錄下。這將使您不必首先需要管理員權限。 (用更普遍的方法 - 仔細想想是否真的需要這些權限)

另一種解決方案是我們創建一個具有這些權限的Windows服務。該服務的首次安裝需要管理員權限,但在此之後,您可以將您的工作委託給該服務。

第二種解決方案是潛在的安全漏洞 - 因此您必須考慮該服務能夠謹慎執行哪些操作。

6

那些誰也找不到解決他們的問題,我發現這個解決方案對我來說: 在解決方案文件,選擇

添加=>新項目=>應用程序清單文件

然後打開它在C#上。

enter image description here

在應用程序清單文件重命名 「asInvoker」 爲 「requireAdministrator」。 最後,應用程序清單文件應該是這樣:

enter image description here

現在,建立自己的解決方案。 然後,您將能夠以管理員權限打開所有應用程序。

+0

適用於我。謝謝 – 2017-01-31 21:54:20

+0

不客氣。 – 2017-04-12 19:59:04

0

我一直用這個代碼:

 string[] commands = File.ReadAllLines(commandFile); 
     foreach (string command in commands) 
     { 
      Process process = new Process(); 
      ProcessStartInfo startInfo = new ProcessStartInfo(); 
      //startInfo.WindowStyle = ProcessWindowStyle.Hidden; 
      startInfo.WorkingDirectory = @"C:\Windows\System32"; 
      startInfo.FileName = "cmd.exe"; 
      startInfo.Arguments = "/user:Administrator \"cmd /K " + command + "\""; 
      process.StartInfo = startInfo; 
      process.Start(); 
     } 

正如你可以看到:從「運行」中VS嘗試這個代碼不會給管理員,但是如果你編譯這個程序和外部運行它作爲管理它將。我使用這個批處理文件來測試特權級別。

@echo off 
goto check_Permissions 

:check_Permissions 
echo Administrative permissions required. Detecting permissions... 

net session >nul 2>&1 
if %errorLevel% == 0 (
    echo Success: Administrative permissions confirmed. 
) else (
    echo Failure: Current permissions inadequate. 
) 

pause >nul