我正在尝试编写一个C#程序,该程序应该从Windows调用runas工具并自动输入密码。

我尝试了什么:

Process runas = new Process();

runas.StartInfo.FileName = "runas";
runas.StartInfo.UseShellExecute = false;
runas.StartInfo.RedirectStandardInput = true;
runas.StartInfo.Arguments = "\"/user:domain\\username\" \"cmd.exe\"";

runas.Start();

StreamWriter stream = runas.StandardInput;
stream.WriteLine("our super secret password");
stream.Flush();

stream.Close();

runas.WaitForExit();
runas.Close();

发生了什么:
我得到以下输出。
Please enter the password for "...":
Trying to execute cmd.exe as user "kfz\dummy"...
RUNAS-ERROR: cmd.exe could not be executed
1326: Authentication failed: unknown username or password.

(由我从德语窗口翻译而来)

是的,我仔细检查了密码和用户名。在命令行中手动输入所有内容都可以正常工作。

我尝试了什么:
我也尝试重定向输出并从中读取,但没有成功。
我尝试了写入流的不同变体:
stream.Write("our super secret password");
stream.Write("our super secret password\n");
stream.Write("our super secret password\r\n");

所有结果都具有相同的行为。

我注意到的是:
Runas进程似乎不等我写流。
我在写之前添加了一个Sleep,我立即获得了以上输出。

恐怕runas使用一些nonstd-input .....

研究结果:
在试图找出运行符使用哪种输入时,我没有成功。
我找到了Windows内置runas here的替代方法,但是我不建议使用它,尽管如果无法执行,我可能会退一步。
编辑:
好的,我发现有消息说微软故意阻止人们这样做。
我讨厌有人这样做!如果我想使用不安全的东西,那微软是谁来阻止我!
对不起,我下了话题。

仍然有一个问题……我们还能以某种方式解决它吗?我们可以破解 rune 吗? ;)

最佳答案

您不应该这样做的全部原因是因为有一个API。

无需使用runas
ProcessStartInfo可让您直接指定UserNamePassword

例如:

var psi = new ProcessStartInfo();

psi.Domain = "YourDomain";
psi.UserName = "YourUserName";
psi.Password = securePassword;
psi.FileName = "cmd.exe";

Process.Start(psi);

10-07 15:10