2011-01-10 86 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; 

,將隱藏的窗口,從來沒有表現出來。

希望有幫助!

菲爾