2014-09-04 71 views
2

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

我试了一下:启动runas作为子进程并将密码写入stdin?

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(); 


什么happended:
我得到以下输出。

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. 

(从我的德语Windows由我翻译)

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

我尝试过:
我试图输出重定向以及和从中读取,没有成功。
我试着写流的不同变种:

stream.Write("our super secret password"); 
stream.Write("our super secret password\n"); 
stream.Write("our super secret password\r\n"); 

在相同的行为所有结果。


我注意到:
的运行方式过程似乎不等待我写信给流。
我在写入之前添加了睡眠状态,然后立即获得上述输出。

恐怕运行方式使用一些nonstd输入.....

研究结果:
在试图找出什么样的输入运行方式的使用,我没有全成。
我发现了一个替代windows内置runas here但是我不想使用它,虽然我可能会回落到它,如果它是不可能做到的。
编辑:
好吧,我发现来源称微软故意阻止人们这样做.....
我讨厌有人做的!如果我想使用一些不安全的东西,那么谁是微软来阻止我呢!
对不起,我下了话题。

还有一个问题......我们还能以某种方式避开它吗?我们可以攻击马亚斯吗? ;)

+0

这听起来不像是个好主意。你为什么想做这个?一旦打开'cmd',用户就可以做任何他想做的事情。你为什么试图绕开这样的安全?另外,你打算如何获得密码?或者这是企图推动用户告诉你他的管理员密码? :D – Luaan 2014-09-04 13:09:00

+0

调用cmd.exe只是为了测试最后的东西,我会执行某些我们编写的程序。我们希望将需要管理员权限的特定任务提供给我们的非特权用户。 – Ch33f 2014-09-04 13:28:44

回答

5

你不应该这样做的全部原因是因为有一个用于该的API。不需要使用runas

ProcessStartInfo可让您直接指定UserNamePassword

例如:

var psi = new ProcessStartInfo(); 

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

Process.Start(psi); 
+0

听起来不错,似乎与UAC合作,作为管理员。谢谢! :D现在将测试它是否适用于UAC并作为非特权用户。编辑:作品! :D非常感谢! – Ch33f 2014-09-04 13:34:12

+0

@ Ch33f很高兴听到:)您可能希望将答案设置为正确的。 – Luaan 2014-09-04 14:57:52

+0

如果上下文中的用户配置文件不存在,则不会创建配置文件。所以当需要runas时,这并不总是一个解决方案。 – MushyPeas 2016-05-11 07:14:43