【问题标题】:How to pass hidden input to another program in C#如何将隐藏的输入传递给C#中的另一个程序
【发布时间】:2017-07-15 04:08:13
【问题描述】:

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

你们是我唯一的希望。

【问题讨论】:

  • 我认为你的命令不等待密码,启动后立即结束。您可以通过手动运行命令来检查这一点吗?
  • @Dmitry 最后是一个错字吗?当我运行调试器并在两个WriteLine 处放置断点时,该命令在没有输入的情况下完成执行,甚至在它到达它之前。虽然。我可能无意中将输入发送到第一个命令,而断点只是未对齐它们。
  • @MasonSchmidgall 查看我的解决方案,如果它有效,请告诉我。

标签: c# process io


【解决方案1】:

好的!我一看到它就非常有动力解决您的问题!经过2小时的不间断调试,我有一个解决方案!

问题 .1: 您的应用程序没有管理员权限,这就是命令在您启动后立即退出的原因。使用管理员权限启动 .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";

但是您将无法重定向输出/输入流!。

【讨论】:

  • 我应该提到该命令一直正常运行,并且我以管理员身份运行我的程序。但是,我不知道您可以传递密码。我会尽快尝试您的解决方案。感谢您为我付出的时间和精力!
猜你喜欢
  • 1970-01-01
  • 2021-01-31
  • 1970-01-01
  • 2021-05-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多