2011-01-10 94 views
3

我运行一个批处理文件,每隔几秒钟做时间同步与服务器使用下面的代码:运行.BAT通过C#代码为不同的用户文件默默

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

为什么不使用内置的ntp设置进行时间同步? – NotMe 2011-01-10 19:41:37

+0

这是不同的故事。我可以证明这一点,但相信我必须这样做。让我们拿出时间片并思考其他事情,我们想要解决这个问题。 – user393014 2011-01-10 19:43:17

+0

你可以使用`info.WindowStyle = ProcessWindowStyle.Hidden`,但我不确定这是否适用于控制台应用程序。 – 2011-01-10 19:48:43

回答

1

因为您正在传递用户名和密码,所以不遵守CreateNoWindow参数。这是Windows中的一个功能(即错误)。下面是五岁的连接细节:

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 始终打开新窗户。 不幸的是,有没有解决办法 这种行为

的创建无窗口选项这里给出的是一个很好的概括: http://blogs.msdn.com/b/jmstall/archive/2006/09/28/createnowindow.aspx 其关于这一主题的MSDN文档中还指出了错误。

并有一个很好的概述这个计算器的答案: How to hide cmd window while running a batch file?

最后,我想你想创建你叫唤一次单独的小应用程序,它运行的全部时间,作为升级的用户。然后,可以按照您上述的相同方式随时执行时间同步,但无需指定用户名和密码。因此,在整个应用程序的整个过程中,只有一个控制台窗口会出现'闪现'。

希望这有助于 磅

0

你有没有尝试只需指定:

process.StartInfo.CreateNoWindow=true; 

0

您可以使用模拟。我写了一个impersonation class,实现了IDisposable接口,我希望可以直接使用。

1

更改行:

process.StartInfo.WindowStyle = ProcessWindowStyle.Minimized; 

process.StartInfo.WindowStyle = 
ProcessWindowStyle.Hidden; 

,将隐藏的窗口,从来没有表现出来。

希望有帮助!

菲尔