在控制台应用程序中编写 cmd 命令

Writing a cmd Command in a Console Application

我正在尝试编写一个 C# 控制台应用程序,它将通过 cmd runas.exe 启动,然后 运行 作为该用户启动另一个应用程序。我采纳了下面列出的建议之一(并添加了一点),因为它看起来最有希望。

Process cmd = new Process();
ProcessStartInfo startinfo = new ProcessStartInfo("cmd.exe", @"/K C:\Windows\System32\runas.exe /noprofile /user:DOMAIN\USER'c:\windows\system32\notepad.exe\'")
{
    RedirectStandardInput = true,
    UseShellExecute = false
};
cmd.StartInfo = startinfo;
cmd.Start();
StreamWriter stdInputWriter = cmd.StandardInput;
stdInputWriter.Write("PASSWORD");
cmd.WaitForExit();

当我启动应用程序时,它在命令本身之前要求输入密码,导致 runas.exe

出现错误

我很确定 UseShellExecute = false 是导致错误的原因,但是 StreamWriter 没有它就无法工作,所以我不确定该怎么做。

/c 参数运行命令行并终止,所以你看不到结果(而且它是一个大 C),见她:http://ss64.com/nt/cmd.html

尝试使用“/K”。 我用你的命令完成了,我在另一个 window.

中看到了结果
ProcessStartInfo startInfo = new ProcessStartInfo("cmd", "/K ping PC -t");
Process.Start(startInfo);

您的流程应该 RedirectStandardInput = true

var p  = new Process();
var startinfo = new ProcessStartInfo("cmd.exe", @"/C C:\temp\input.bat")
{
    RedirectStandardInput = true,
    UseShellExecute = false
};
p.StartInfo = startinfo;
p.Start();
StreamWriter stdInputWriter = p.StandardInput;           
stdInputWriter.Write("y");      

此程序启动 input.bat,然后将值 y 发送到它的标准输入。

为了完整性,input.bat示例:

set /p input=text?: 
echo %input%

我在 following post 中找到了解决方案。我不得不放弃我正在使用的大部分结构,但我现在可以使用下面列出的代码成功地 运行 记事本作为我想要的用户。

var pass = new SecureString();
pass.AppendChar('p');
pass.AppendChar('a');
pass.AppendChar('s');
pass.AppendChar('s');
pass.AppendChar('w');
pass.AppendChar('o');
pass.AppendChar('r');
pass.AppendChar('d');
var runFileAsUser = new ProcessStartInfo
{
    FileName = "notepad",
    UserName = "username",
    Domain = "domain",
    Password = pass,
    UseShellExecute = false,
    RedirectStandardOutput = true,
    RedirectStandardError = true
};
Process.Start(runFileAsUser);