以管理员身份运行 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 和命令?的主要内容,如果未能解决你的问题,请参考以下文章