隐藏控制台窗口,同时使用具有不同用户名的 Process.StartInfo

本文关键字:用户 StartInfo Process 窗口 控制台 隐藏 | 更新日期: 2023-09-27 18:35:59

我正在使用特殊的用户、域和密码启动一个进程。尽管我告诉 C# 隐藏控制台窗口,但它还是显示出来了。

这是我的代码:

Process process = new Process();
process.StartInfo.RedirectStandardOutput = true;
process.StartInfo.RedirectStandardError = true;
process.StartInfo.UseShellExecute = false;
process.StartInfo.CreateNoWindow = true;
process.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
process.StartInfo.UserName = strUsername;
process.StartInfo.Domain = strDomain;
process.StartInfo.Password = secPassword;
process.StartInfo.FileName = "PsExec.exe";
process.StartInfo.Arguments = @"/accepteula -s ''" + strServername + @"program.exe";
process.Start();
process.WaitForExit();

我可以在另一个论坛中找到一些提示:

如果使用 ProcessStartInfo..::.用户名和进程启动信息..::.密码 属性集,非托管 CreateProcessWithLogonW 函数为 调用,这将在新窗口中启动进程,即使 属性值为 true 或 WindowStyle 属性 值为隐藏。

其实,我对这种说法并不满意...

提前谢谢。

干杯亚历克斯

隐藏控制台窗口,同时使用具有不同用户名的 Process.StartInfo

据我所知,这个问题有解决方法。您可以使用参数启动隐藏的cmd。像这样:

 ProcessStartInfo psi = new ProcessStartInfo("cmd.exe", String.Format("/accepteula -s ''{0}program.exe", strServername));
 psi.UseShellExecute = false;
 psi.CreateNoWindow = true;
 Process.Start(psi);
            using (Process LMUTIL = new Process())
            {
                string arg1 ="argument"
                LMUTIL.StartInfo.FileName = "program.exe";
                LMUTIL.StartInfo.Arguments = arg1
                LMUTIL.StartInfo.UseShellExecute = false;
                LMUTIL.StartInfo.RedirectStandardOutput = true;
                LMUTIL.StartInfo.CreateNoWindow = true;
                LMUTIL.EnableRaisingEvents = true;
                LMUTIL.OutputDataReceived += p_WriteData;
                LMUTIL.Start();
                LMUTIL.BeginOutputReadLine();
            }
    private void p_WriteData(object sender, DataReceivedEventArgs e)
    {
        if (e.Data != null)
        {
           Debug.WriteLine(e.Data.ToString());
        }
    }

我直接从一个满足您需求的项目中提升了这一点。订阅 p_WriteData 事件以捕获命令窗口中显示的内容。

毕竟,不可能使用进程类隐藏此 psexec 控制台窗口。没有必要使用psexec。我改用了 WMI 的东西:

ConnectionOptions remoteConnectionOptions = new ConnectionOptions();
remoteConnectionOptions.Impersonation = ImpersonationLevel.Impersonate;
remoteConnectionOptions.EnablePrivileges = true;
remoteConnectionOptions.Authentication = AuthenticationLevel.Packet;
remoteConnectionOptions.Username = strDomain + @"'" + strUsername;
remoteConnectionOptions.SecurePassword = secPassword;
ManagementScope scope = new ManagementScope(@"''" + strServername + @"'root'CIMV2", remoteConnectionOptions); ManagementPath p = new ManagementPath("Win32_Process");
ManagementClass classInstance = new ManagementClass(scope, p, null); object[] theProcessToRun = { "myExecutable.exe" };
classInstance.InvokeMethod("Create", theProcessToRun);