通过C#代码以静默方式的不同用户运行.bat文件

我每隔几秒运行一个批处理文件,使用以下代码与服务器进行时间同步:

Process process = new Process(); process.StartInfo.WorkingDirectory = Environment.GetFolderPath(Environment.SpecialFolder.System); process.StartInfo.FileName = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.System), "cmd.exe"); process.StartInfo.Arguments = @"/CC:\TimeSync.bat"; process.StartInfo.CreateNoWindow = true; process.StartInfo.UseShellExecute = false; process.StartInfo.WindowStyle = ProcessWindowStyle.Minimized; process.StartInfo.RedirectStandardOutput = true; process.StartInfo.UserName = "username"; SecureString pwd = new SecureString(); Char[] pwdCharacters = "password".ToCharArray(); foreach (char t in pwdCharacters) { pwd.AppendChar(t); } process.StartInfo.Password = pwd; process.Start(); string output = process.StandardOutput.ReadToEnd(); 

问题是它在屏幕上闪烁了我不想要的命令窗口。 我怎么能防止这种情况?

我看到的一个行为是,如果我使用UseShellExecute = true运行相同的代码并且不提供用户名和密码,那么命令窗口不会闪烁。

所以基本上我想使用c#代码作为不同的用户静默运行.bat文件。

因为您传递的是用户名和密码,所以不会遵守CreateNoWindow参数。 这是Windows中的一个function(即错误)。 这是五年前的连接细节:

http://connect.microsoft.com/VisualStudio/feedback/details/98476/cmd-windows-shows-using-process-with-createnowindow-when-using-username-password-option

在用户提供用户名和密码的情况下,Process.Start()调用advapi32.dll的CreateProcessWithLogonW,并且CreateProcessWithLogonW始终打开一个新窗口。 不幸的是,这种行为没有解决方法

这里给出了一个关于create no window选项的精彩概述: http : //blogs.msdn.com/b/jmstall/archive/2006/09/28/createnowindow.aspx ,它还指出了msdn文档中有关此主题的错误。

这个stackoverflow答案中有一个非常好的概述: 如何在运行批处理文件时隐藏cmd窗口?

最后,我认为你想要创建一个独立的小应用程序,你只需要调用一次,它会像升级的用户一样运行。 然后,它可以按照您上面所述的相同方式执行时间同步,但无需指定用户名和密码。 因此,在整个应用程序期间,只有一个控制台窗口的“闪存”。

希望这有助于lb

改变你的行:

 process.StartInfo.WindowStyle = ProcessWindowStyle.Minimized; 

  process.StartInfo.WindowStyle = ProcessWindowStyle.Hidden; 

这将隐藏窗口,永远不会显示它。

希望有所帮助!

菲尔

您是否尝试仅指定:

 process.StartInfo.CreateNoWindow=true; 

你可以使用模仿。 我希望,我编写了一个实现IDisposable接口的模拟类 ,使用起来相当简单。