以管理员身份运行 cmd 和命令?

Posted

技术标签:

【中文标题】以管理员身份运行 cmd 和命令?【英文标题】:To run cmd as administrator along with command? 【发布时间】:2011-09-30 13:00:56 【问题描述】:

这是我的代码:

try

    ProcessStartInfo procStartInfo = new ProcessStartInfo(
                                            "cmd.exe", 
                                            "/c " + command);
    procStartInfo.UseShellExecute = true;
    procStartInfo.CreateNoWindow = true;
    procStartInfo.Verb = "runas";
    procStartInfo.Arguments = "/env /user:" + "Administrator" + " cmd" + command;

    ///command contains the command to be executed in cmd
    System.Diagnostics.Process proc = new System.Diagnostics.Process();
    proc.StartInfo = procStartInfo;
    proc.Start();

catch (Exception ex)

    MessageBox.Show(ex.Message);

我想保留

procStartInfo.UseShellExecute = true 
procStartInfo.RedirectStandardInput = false;

是否可以不使用process.standardinput 执行命令? 我尝试执行我传入参数的命令,但该命令没有执行。

【问题讨论】:

是否可以不使用 process.standardinput 来执行命令?我尝试执行我传入参数的命令,但该命令没有执行。您目前没有使用它,所以这个问题没有多大意义。请帮助您的用户,让命令提示符可见,以便他们知道发生了什么。 你不想要Verb。这并不意味着你认为它意味着什么。我想。 @Ramhound procStartInfo.Arguments = "/env /user:" + "管理员" + " cmd" + 命令; @mtijn 是的,它在那一点上失败了。所以我想知道是否可以通过其他方式给出命令 这可能会有所帮助:Start Process with administrator right in C# 【参考方案1】:

正如@mtijn 所说,你有很多事情要做,你稍后也会覆盖。您还需要确保正确地转义。

假设您要运行以下命令提升权限:

dir c:\

首先,如果您只是通过Process.Start() 运行此命令,一个窗口会立即弹出并关闭,因为没有任何东西可以让窗口保持打开状态。它处理命令并退出。为了使窗口保持打开状态,我们可以将命令包装在单独的命令窗口中,并使用/K 开关保持其运行:

cmd /K "dir c:\"

要运行提升的命令,我们可以像您一样使用runas.exe,只是我们需要更多地逃避一些事情。根据帮助文档 (runas /?),我们传递给 runas 的命令中的任何引号都需要用反斜杠转义。不幸的是,使用上面的命令这样做会给我们一个双反斜杠,这混淆了 cmd 解析器,因此也需要转义。所以上面的命令最终会是:

cmd /K \"dir c:\\\"

最后,使用您提供的语法,我们可以将所有内容包装到 runas 命令中,并将上述命令括在另一组引号中:

runas /env /user:Administrator "cmd /K \"dir c:\\\""

从命令提示符运行上述命令以确保其按预期工作。

鉴于最终代码变得更容易组装:

        //Assuming that we want to run the following command:
        //dir c:\

        //The command that we want to run
        string subCommand = @"dir";

        //The arguments to the command that we want to run
        string subCommandArgs = @"c:\";

        //I am wrapping everything in a CMD /K command so that I can see the output and so that it stays up after executing
        //Note: arguments in the sub command need to have their backslashes escaped which is taken care of below
        string subCommandFinal = @"cmd /K \""" + subCommand.Replace(@"\", @"\\") + " " + subCommandArgs.Replace(@"\", @"\\") + @"\""";

        //Run the runas command directly
        ProcessStartInfo procStartInfo = new ProcessStartInfo("runas.exe");
        procStartInfo.UseShellExecute = true;
        procStartInfo.CreateNoWindow = true;

        //Create our arguments
        string finalArgs = @"/env /user:Administrator """ + subCommandFinal + @"""";
        procStartInfo.Arguments = finalArgs;

        //command contains the command to be executed in cmd
        using (System.Diagnostics.Process proc = new System.Diagnostics.Process())
        
            proc.StartInfo = procStartInfo;
            proc.Start();
        

【讨论】:

我确实运行了您在 cmd runas /env /user:Administrator "cmd /K \"dir c:\\\"" 中建议的以下命令,即使我输入密码它也会询问密码它失败它给出了以下输出 Unable to run cmd /k "dir c:\" 您运行的是runas /env /user:Administrator "cmd /K \"dir c:\\\"" 还是cmd runas /env /user:Administrator "cmd /K \"dir c:\\\""?第一个是你应该运行的。 我以 runas /env /user:Administrator "cmd /K \"dir c:\\\"" 运行它,但它给出的错误如下 Unable to run cmd /k "dir c:\ " 如果您收到错误RUNAS ERROR: Unable to run - cmd /K "dir c:\",您也应该收到主要错误,例如1326: Logon failure: unknown user name or bad password.,是吗? 如果错误是 1326,那么它的用户名/密码组合错误,您需要修复它。问题不在于命令,而在于凭据。如果您在域环境中,您可能会将Administrator 更改为YOURDOMAIN\Administrator。如果您收到错误代码 1327,则说明存在某种阻止它的组策略。【参考方案2】:

为什么要使用参数初始化流程对象,然后再覆盖这些参数?顺便说一句:你设置参数的最后一点,你将'command'连接到'cmd',这没有多大意义,可能是它失败的地方(看起来你缺少一个空格)。

另外,您当前使用的是标准命令行,您可能想考虑使用 the runas tool 代替。你也可以从命令行调用 runas。

另外,你为什么从命令行运行“命令”?为什么不直接从 Process.Start 使用当时提供的管理员权限启动它呢?这是一些伪代码:

Process p = Process.Start(new ProcessStartInfo()

    FileName = <your executable>,
    Arguments = <any arguments>,
    UserName = "Administrator",
    Password = <password>,
    UseShellExecute = false,
    WorkingDirectory = <directory of your executable>
);

【讨论】:

感谢您的想法,但我不知道如何在 process.start 期间授予管理员权限。您能提供一些示例代码或示例吗?

以上是关于以管理员身份运行 cmd 和命令?的主要内容,如果未能解决你的问题,请参考以下文章

Win10怎么以管理员身份运行CMD命令提示符

如何以管理员身份运行cmd

XP怎样用管理员身份运行cmd

如何设置cmd以管理员身份运行

如何使用 Nodejs 和 spawn 在 Windows 10 上以管理员身份运行一些 CMD 命令?

敲啥命令可以以管理员身份启动cmd