如何在C#中将隐藏的输入传递给另一个程序

时间:2017-07-15 04:08:13

标签: c# process io

我一直无法使用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);行之前成功完成!我试过谷歌搜索,但无济于事。

你们是我唯一的希望。

1 个答案:

答案 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";

但是你不能重定向输出/输入流!。