我正在尝试编写一个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
没有它就行不通,所以我不知道该怎么做。
答案 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);