2011-01-10 2 views
3

Ich bin mit einer Batch-Datei timesync mit Server mit folgenden Code zu tun:Run .BAT C# -Code als verschiedene Benutzer-Datei durch alle paar Sekunden still

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(); 

Das Problem ist, es den Befehl Fenster auf dem Bildschirm blinkt was ich nicht will. Wie kann ich das verhindern?

Ein Verhalten, das ich gesehen habe, ist, wenn ich den gleichen Code mit UseShellExecute = true laufen lasse und keinen Benutzernamen und kein Kennwort zur Verfügung stelle, dann blinkt das Befehlsfenster nicht.

Also im Grunde möchte ich .bat Datei mit C# -Code als anderen Benutzer im Hintergrund ausführen.

+0

Warum nicht verwenden Sie die in ntp Einstellungen gebaut Zeit Synchronisationen zu tun? – NotMe

+0

Das ist eine andere Geschichte. Ich kann das rechtfertigen, aber glauben Sie mir, dass ich das tun muss. Lassen Sie uns das Timesync-Stück herausnehmen und etwas anderes denken, wir wollen dieses Problem des Flatterns lösen. – user393014

+0

Sie könnten 'info.WindowStyle = ProcessWindowStyle.Hidden' verwenden, aber ich bin nicht sicher, ob dies für Konsolenanwendungen gültig ist. –

Antwort

1

Da Sie einen Benutzernamen und ein Kennwort übergeben, werden die CreateNoWindow-Parameter nicht berücksichtigt. Dies ist eine Funktion (d. H. Fehler) in Windows. Hier ist die fünf Jahre alte connect Details:

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

Process.Start() ruft die advapi32.dll CreateProcessWithLogonW im Falle , dass ein Benutzer einen Benutzernamen und Passwort liefert, und CreateProcessWithLogonW immer öffnet sich ein neues Fenster. Leider gibt es keine Abhilfe für dieses Verhalten

Eine ausgezeichnete Übersicht über die kein Fenster Option gegeben wird hier erstellen: http://blogs.msdn.com/b/jmstall/archive/2006/09/28/createnowindow.aspx die auch zu diesem Thema Fehler in der MSDN-Dokumentation weist darauf hin.

Und es gibt einen sehr guten Überblick in dieser Stackoverflow Antwort: How to hide cmd window while running a batch file?

Am Ende denke ich, dass Sie eine separate kleine Anwendung erstellen möchten, die Sie nur einmal rufen, und es läuft die ganze Zeit, als eskalierter Benutzer. Es kann dann die Zeitsynchronisation so oft wie Sie möchten durchführen, auf die gleiche Weise wie oben beschrieben, aber ohne Benutzername und Passwort angeben zu müssen. Somit wird es nur ein einziges "Flash" eines Konsolenfensters für die gesamte Dauer der Anwendung geben.

Hope this lb

0

Haben Sie versucht, nur spezifizieren:

process.StartInfo.CreateNoWindow=true; 

?

+0

Ja, er tat, siehe seine Quelle Auszug in der ersten Frage. –

+0

Yep citrrect, tut mir leid, ich wurde von der .Minimized ... –

+0

Ich habe auch versucht mit process.StartInfo.WindowStyle = ProcessWindowStyle.Hidden; – user393014

0

Sie könnten Identitätswechsel verwenden. Ich habe eine impersonation class geschrieben, die die IDisposable Schnittstelle implementiert und ist ziemlich einfach zu bedienen, hoffe ich.

+0

Der Benutzer, den ich gerade betreibe, hat keine Berechtigung, sich als anderer Benutzer auszugeben – user393014

+0

Warum fragen Sie danach? _ "... Ich möchte die .bat-Datei mit C# -Code als anderen Benutzer ausführen ..." _ war Ihre Initiale Frage: Was ist der Unterschied zwischen diesem und Identitätswechsel? –

+0

Es gibt Sicherheitseinschränkung. Siehe, die .bat-Datei ist die Problemumgehung für diese Sicherheit und es funktioniert gut. Es ist nur nur blinkt, was nervt. – user393014

1
hilft

Ihre Linie ändern:

process.StartInfo.WindowStyle = ProcessWindowStyle.Minimized; 

zu

process.StartInfo.WindowStyle = 
ProcessWindowStyle.Hidden; 

, dass das Fenster verbergen und es nie zeigen.

Hoffe, dass hilft!

Phil