我一直无法使用C#以编程方式将输入传递给系统net user
程序。我正在尝试激活并为某个用户帐户设置密码。通过我的调查,看起来这个过程在任何事情都可以通过之前完成。我不知道为什么后台net user
程序在退出之前不等待输入。
以下是我以编程方式运行的命令:
net user username /active:yes & net user username *
第二个命令的输出如下:
Type a password for the user:
Retype the password to confirm:
The command completed successfully
如果您要手动运行上述命令,它会要求您输入密码并隐藏您在屏幕上输入的内容。但是,程序运行时程序似乎没有停止。
要调用程序,我有一个启动程序的函数,并将进程返回给另一个函数,该函数将输入发送给进程。这是第一个功能:
static Process RunCommandGetProcess(string command)
{
Process process = new Process();
ProcessStartInfo psInfo = new ProcessStartInfo();
psInfo.FileName = "CMD.exe";
psInfo.Arguments = "/C " + command + "& PAUSE";
// Allow for Input redirection
psInfo.UseShellExecute = false;
psInfo.RedirectStandardInput = true;
// Window style
psInfo.WindowStyle = ProcessWindowStyle.Normal;
// Start the mothertrucker!
process.StartInfo = psInfo;
process.Start();
return process;
}
和通话功能:
static int ActivateUserWithPassword(string password)
{
// Start net user with that other function
Process process = RunCommandGetProcess("net user username /active:yes & net user username *");
StreamWriter streamWriter = process.StandardInput;
streamWriter.WriteLine(password); // First Prompt
streamWriter.WriteLine(password); // Second Prompt
process.WaitForExit();
return process.ExitCode;
}
但是,当我运行调试器时,命令甚至在满足两个streamWriter.WriteLine(password);
行之前成功完成!我试过谷歌搜索,但无济于事。
你们是我唯一的希望。
答案 0 :(得分:1)
好!我一看到它就一直很有动力解决你的问题!经过2个小时的不间断调试,我有一个解决方案!。
问题编号1:您的应用程序没有管理员权限,这就是命令在您启动后立即退出的原因。使用Admin Privileges启动.exe。
问题2:由于密码在输入中被屏蔽,即使我执行了streamWriter.WriteLine(password)
一次,输出也是“命令执行成功”。无法知道密码是否实际传递或者是否将空字符串作为密码。
<强>解决方案强>
您可以将net user
命令与密码参数一起使用
net user user_name password
。无需 提示 用户输入密码,即在用户名之后不要使用'*',因为您将其传递给程序。
这就是它的工作原理
Process proc = new Process();
ProcessStartInfo start = new ProcessStartInfo();
start.FileName = "cmd";
start.Arguments = "/k";
start.RedirectStandardInput = true;
start.WorkingDirectory = Environment.CurrentDirectory;
start.UseShellExecute = false;
proc.StartInfo = start;
proc.Start();
proc.StandardInput.WriteLine("net user \"username\" password");
以管理员启动exe,或者您必须执行此操作
start.UseShellExecute = true;
start.Verb = "runas";
但是你不能重定向输出/输入流!。