2013-07-24 248 views
5

這是我的代碼嘗試運行具有管理權限的cmd.exe。但是,我得到請求操作需要提升。如果我通過我的窗口運行「Run as Admin」運行cmd.exe,它可以工作,但是,通過vb,它不會。這是我的代碼。以管理員權限運行cmd.exe

Try 
     Dim process As New Process() 
     process.StartInfo.FileName = "cmd.exe " 
     process.StartInfo.Verb = "runas" 
     process.StartInfo.UseShellExecute = False 
     process.StartInfo.RedirectStandardInput = True 
     process.StartInfo.RedirectStandardOutput = True 
     process.StartInfo.RedirectStandardError = True 
     process.StartInfo.CreateNoWindow = True 

     process.Start() 
     process.StandardInput.WriteLine("route add 8.31.99.141 mask 255.255.255.255 " & cmdorder) 
     process.StandardInput.WriteLine("exit") 
     Dim input As String = process.StandardOutput.ReadToEnd 
     process.Close() 
     Dim regex As Regex = New Regex("(ok)+", RegexOptions.IgnoreCase) ' wa requested 
     ' txtLog.AppendText(input) 
     Return regex.IsMatch(input) 

謝謝。

+0

'runas' param使這個過程要求特權升級的權限。這是完全正確的行爲。嘗試從管理工具中使用'psexec'。 –

回答

10

你不能達到你想要的。

可以使用Process.Start()推出升高的過程,但只有如果你UseShellExecute = true

Dim process As New Process() 
process.StartInfo.FileName = "cmd.exe " 
process.StartInfo.Verb = "runas" 
process.StartInfo.UseShellExecute = True 
process.Start() 

的原因是因爲你必須使用ShellExecute如果要啓動一個提升的過程。只有ShellExecute知道如何提升。

如果指定UseShellExecute = False,則使用CreateProcess而不使用ShellExecuteCreateProcess不知道如何提升。爲什麼? From the AppCompat guy:

那麼,CreateProcess在層中真的很低。如果沒有創建流程的能力,你能做什麼?不是很多。然而,仰角是一個不同的故事。它需要前往應用高程服務。然後調用consent.exe,它必須知道如何閱讀組策略,並在必要時切換到安全桌面並彈出一個窗口並詢問用戶的許可/憑證等。我們甚至不需要採取所有這些功能,讓我們拿走對話框。

現在,爲了創建需要提升的進程,通常只需切換API。外殼坐落在更高層,因此能夠依賴於高程。所以,你只需要調用ShellExecute將調用換成CreateProcess即可。

因此,這解釋瞭如何提升cmd,但一旦你這樣做:你不允許重定向輸出或隱藏窗口; as only CreateProcess can do that:

只有當進程由CreateProcess()啓動時,重定向I/O和隱藏窗口才能工作。

這是一個很長的路要說這傢伙問same question over here;但沒有讓某人關閉你的問題的侮辱。

注意:任何代碼被釋放到公共領域。無需歸屬。

+0

'process.StartInfo.RedirectStandardOutput = True'是讀取輸出所必需的。但它看起來不能用UseShellExecute設置。如果有的話,請提供解決方案。 – Ammar

0

將其設爲對象,然後將其設置爲在application.object.settings事件中啓動需要管理員權限的對象。