使用管理员权限运行cmd.exe

时间:2013-07-24 19:42:34

标签: vb.net

这是我的代码尝试使用admin priviligies运行cmd.exe。但是,我得到请求操作需要提升。如果我通过我的Windows运行带有“以管理员身份运行”的cmd.exe,它可以通过vb运行,但它没有。这是我的代码。

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)

感谢。

2 个答案:

答案 0 :(得分:11)

你无法实现自己想要的目标。

可以使用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即可。 shell位于更高的层中,因此能够依赖于高程。所以,你只需要调用ShellExecute来调用CreateProcess。

这样就解释了如何提升cmd,但是一旦你做了:你不能重定向输出或隐藏窗口; as only CreateProcess can do that:

  

重定向I / O并隐藏窗口只有在CreateProcess()启动进程时才能工作。

这是一个很长的说法,这个人问same question over here;但没有让某人关闭你的问题的侮辱。

  

注意:任何代码都会发布到公共域中。无需归属。

答案 1 :(得分:0)

将其设为对象,然后将其设置为在application.object.settings事件中启动需要admin priv。