以不同用户身份在后台通过C#代码运行.bat文件

3

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

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文件。

你为什么不使用内置的ntp设置来进行时间同步? - NotMe
那是另一回事。我可以证明,但请相信我必须这样做。让我们拿出时间同步部分,考虑其他解决方案,我们想要解决闪烁问题。 - user393014
你可以使用 info.WindowStyle = ProcessWindowStyle.Hidden,但我不确定这是否适用于控制台应用程序。 - Uwe Keim
我已经尝试过了,没有成功。:( - user393014
4个回答

1

修改你的代码行:

process.StartInfo.WindowStyle = ProcessWindowStyle.Minimized;

 process.StartInfo.WindowStyle =
 ProcessWindowStyle.Hidden;

这将隐藏窗口并永远不再显示。

希望能有所帮助!

Phil


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,如果用户提供用户名和密码,则始终会打开一个新窗口。不幸的是,这种行为没有任何解决办法。
关于禁止创建新窗口选项的详细概述,请参见此处: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

0

你试过只指定:

process.StartInfo.CreateNoWindow=true;

?


是的,他做到了,在初始问题中可以看到他的源代码摘录。 - Uwe Keim
我也尝试过使用 process.StartInfo.WindowStyle = ProcessWindowStyle.Hidden; - user393014

0

你可以使用模拟身份。我写了一个模拟身份类,它实现了IDisposable接口,而且使用起来非常简单,希望能对你有所帮助。


我正在运行的用户没有特权来模拟其他用户。 - user393014
那你为什么要问呢?“...我想用C#代码以不同的用户身份运行.bat文件…”——这是你最初的问题。这与模拟登录有什么区别? - Uwe Keim
有安全限制。看,.bat文件是解决这个安全问题的方法,而且它运行得很好。只是闪烁有点让人烦恼。 - user393014
此外,我知道需要以更高的权限运行其他进程的用户。 - user393014

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接