Запустите файл .bat через код C # от имени другого пользователя. - PullRequest
3 голосов
/ 10 января 2011

Я запускаю один пакетный файл каждые несколько секунд, чтобы выполнить синхронизацию с сервером, используя следующий код:

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 и не предоставляю имя пользователя и пароль, окно команды не мигает.

Так что, в основном, я хочу запустить .bat файл, используя код c # от имени другого пользователя.

Ответы [ 4 ]

1 голос
/ 09 марта 2011

Измените свою строку:

process.StartInfo.WindowStyle = ProcessWindowStyle.Minimized;

на

 process.StartInfo.WindowStyle =
 ProcessWindowStyle.Hidden;

Это будет скрывать окно и никогда не показывать его.

Надеюсь, что поможет!1010 * Phil

1 голос
/ 23 января 2011

Поскольку вы передаете имя пользователя и пароль, параметры CreateNoWindow не соблюдаются.Это особенность (то есть ошибка) в Windows.Вот пятилетняя информация о соединении:

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

Process.Start () вызывает метод advProi32.dll в CreateProcessWithLogonW, если пользователь вводит имя пользователя и пароль, и CreateProcessWithLogonWвсегда открывается новое окно.К сожалению, нет обходного пути для этого поведения

Отличный обзор опции «создать без окна» приведен здесь: http://blogs.msdn.com/b/jmstall/archive/2006/09/28/createnowindow.aspx, которая также указывает на ошибки в документации msdn по этой теме.

И в этом ответе stackoverflow есть очень хороший обзор: Как скрыть окно cmd при запуске пакетного файла?

В конце концов, я думаю, что вы хотите создатьотдельное небольшое приложение, которое вы вызываете только один раз, и оно работает все время как расширенный пользователь.Затем он может выполнять синхронизацию времени так часто, как вы хотите, таким же образом, как вы описали выше, но без указания имени пользователя и пароля.Таким образом, будет только одна «вспышка» окна консоли на все время работы приложения.

Надеюсь, это поможет lb

0 голосов
/ 10 января 2011

Вы можете использовать олицетворение. Я написал класс олицетворения , который реализует интерфейс IDisposable и довольно прост в использовании, я надеюсь.

0 голосов
/ 10 января 2011

Вы пытались просто указать:

process.StartInfo.CreateNoWindow=true;

?

...