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

use*_*788 5 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)
Run Code Online (Sandbox Code Playgroud)

谢谢.

Ian*_*oyd 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()
Run Code Online (Sandbox Code Playgroud)

原因是,如果要启动升级过程,则必须使用ShellExecute.只ShellExecute知道如何提升.

如果您指定UseShellExecute = False,则CreateProcess使用而不是ShellExecute.CreateProcess不知道如何提升.为什么?来自AppCompat的家伙:

好吧,CreateProcess在层中确实很低.没有创建流程的能力,你能做什么?不是很多.然而,海拔是一个不同的故事.它需要访问应用程序提升服务.这然后调用consent.exe,它必须知道如何读取组策略,并在必要时切换到安全桌面并弹出一个窗口并询问用户是否有权限/凭据等.我们甚至不需要获取所有这些功能,让我们只需要对话框.

现在,为了创建需要提升的流程,通常只需切换API即可.shell位于更高的层中,因此能够依赖于高程.因此,您只需调用ShellExecute就可以调用CreateProcess.

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

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

这是一个很长的路要说这个人在这里问了同样的问题 ; 但没有让某人关闭你的问题的侮辱.

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