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

时间:2016-11-25 21:00:36

标签: c# cmd 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

出现错误

enter image description here

我非常确定UseShellExecute = false导致了错误,但StreamWriter没有它就行不通,所以我不知道该怎么做。

3 个答案:

答案 0 :(得分:2)

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

尝试使用" / K"。 我用你的命令做到了,我在另一个窗口看到了结果。

ProcessStartInfo startInfo = new ProcessStartInfo("cmd", "/K ping PC -t");
Process.Start(startInfo);

答案 1 :(得分:1)

您的流程应该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%

答案 2 :(得分:0)

我在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);