5

这是我试图以管理员权限运行 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)

谢谢。

4

2 回答 2

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()

原因是如果要启动提升的进程,则必须使用。ShellExecuteShellExecute知道提升。

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

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

现在,要创建需要提升的进程,通常只需切换 API。外壳位于更高的层,因此能够依赖于高度。因此,您只需将对 CreateProcess 的调用替换为对 ShellExecute 的调用。

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

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

可以说这个人在这里问了同样的问题。但没有让某人结束你的问题的侮辱。

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

于 2013-07-24T19:56:31.423 回答
0

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

于 2015-11-22T15:02:44.590 回答