2013-07-24 88 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事件中启动需要管理员权限的对象。