【问题标题】:Running cmd.exe with admin priviliges以管理员权限运行 cmd.exe
【发布时间】:2013-07-24 11:40:39
【问题描述】:

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

谢谢。

【问题讨论】:

  • runas param 使这个过程请求权限升级。这是完全正确的行为。尝试使用管理工具中的psexec

标签: vb.net


【解决方案1】:

你无法实现你想要的。

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

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

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

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

这家伙问了same question over here 的说法很长;但不会因为有人结束你的问题而感到丢脸。

注意:任何代码都会发布到公共领域。无需注明出处。

【讨论】:

  • process.StartInfo.RedirectStandardOutput = True 是读取输出所必需的。但看起来它不能用UseShellExecute 设置。如有解决方案,请提供。
【解决方案2】:

将其作为一个对象,然后在 application.object.settings 中将其设置为需要管理员权限。

【讨论】:

    猜你喜欢
    • 2014-05-18
    • 2012-11-07
    • 2015-11-22
    • 1970-01-01
    • 1970-01-01
    • 2017-07-03
    • 2019-10-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多