我每隔几秒运行一个批处理文件,使用以下代码与服务器进行时间同步:
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 = @"/C C:\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文件。
答案 0 :(得分:1)
因为您传递的是用户名和密码,所以不遵守CreateNoWindow参数。这是Windows中的一个功能(即bug)。这是五年前的连接细节:
Process.Start()调用advapi32.dll 事件中的CreateProcessWithLogonW 用户提供用户名和 密码和CreateProcessWithLogonW 总是打开一个新窗口。 不幸的是,没有解决方法 对于这种行为
此处给出了创建无窗口选项的精彩概述: http://blogs.msdn.com/b/jmstall/archive/2006/09/28/createnowindow.aspx 这也指出了msdn文档中关于这个主题的错误。
这个stackoverflow答案中有一个非常好的概述: How to hide cmd window while running a batch file?
最后,我认为你想要创建一个独立的小应用程序,你只需要调用一次,它会像升级的用户一样运行。然后,它可以按照您上面所述的相同方式执行时间同步,但无需指定用户名和密码。因此,在整个应用程序期间,只有一个控制台窗口的“闪存”。
希望这会有所帮助 lb
答案 1 :(得分:1)
更改行:
process.StartInfo.WindowStyle = ProcessWindowStyle.Minimized;
到
process.StartInfo.WindowStyle =
ProcessWindowStyle.Hidden;
这会隐藏窗口而不会显示它。
希望有所帮助!
菲尔
答案 2 :(得分:0)
您是否尝试指定:
process.StartInfo.CreateNoWindow=true;
答案 3 :(得分:0)
你可以使用模仿。我写了一个实现IDisposable
接口的impersonation class,我希望它非常简单易用。