Служба Windows Process.Start не работает под учетной записью сетевой службы - PullRequest
1 голос
/ 14 августа 2010

Редактировать Для всех, у кого возникла проблема, она, как обычно, легко решается. Ключи необходимо установить под учетной записью службы. Войдите на рабочую станцию ​​под учетной записью службы, установите ключи, и затем ее можно будет запустить из любого сеанса, который запускает ее в контексте учетной записи службы. Проблема решена.

Редактировать: Сервис ОС - это Win 2003 Редактировать: Работает при запуске notepad.exe. Приводит меня к мысли, что где-то в консольном приложении вызывается GnuPG.

У меня есть служба Windows, которая действует как механизм для передачи файлов в / из сети. Для некоторых из этих процессов я хотел бы запустить консольное приложение до передачи или после нее.

У меня возникли проблемы с правильной работой консольных приложений под учетной записью сетевой службы.

Вот схема задачи:

Служба Windows работает под учетной записью сетевой службы, назовем ее Company\ServiceAccount Company\ServiceAccount хочет запустить Transfer A. Transfer A необходимо запустить Console App A перед перемещением файлов. Console App A также оболочка сторонней консольной прикладной программы. (Причина в том, что мы хотели внедрить больше бизнес-логики в Console A, а не помещать этот код в сам сервис)

Console App A вызывает бесплатную программу командной строки PGP (GnuPG для всех, кто интересуется). Console App A ожидает завершения работы GnuPG и перемещает некоторые файлы в точку отбрасывания, чтобы Transfer A мог взять их и переместить.

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

Вопросы:

  1. Есть ли очевидные проблемы? Сервисная учетная запись действительно действительна и не имеет проблем с подключением к сети.
  2. Нужно ли Console App A также использовать имя пользователя / домен / пароль в команде Process.Start() при вызове сторонней программы?
  3. Очевидно, могут быть альтернативы тому, как я это делаю, но - должен ли я полностью отказаться от этого? Я чувствую, что это должно сработать.

Код:

      System.Diagnostics.Process process = null;
        System.Diagnostics.ProcessStartInfo psi = new System.Diagnostics.ProcessStartInfo(executable, args);

        string pwd = "mypassword"; //edited for security
        System.Security.SecureString securePwd = new System.Security.SecureString();

        foreach (char c in pwd)
            securePwd.AppendChar(c);

        try
        {
            psi.UseShellExecute = false;
            psi.WindowStyle = ProcessWindowStyle.Hidden;
            psi.CreateNoWindow = true;
            psi.ErrorDialog = false;
            psi.Password = securePwd;
            psi.UserName = "myserviceaccount"; //edited for security
            psi.Domain = "MyCompanyDomain"; //edited for security
            process = System.Diagnostics.Process.Start(psi);
            //Wait for the process to finish
            process.WaitForExit();
            process.Close();
        }
        catch (System.InvalidOperationException iox) { } //handle
        catch (System.ArgumentException ax) { } //handle
        catch (System.ComponentModel.Win32Exception wx) { } //handle 
        catch (System.IO.FileNotFoundException fnfx) { } //handle

Ответы [ 2 ]

4 голосов
/ 25 февраля 2011

Для любого, у кого возникла проблема, оказывается, как обычно, простая проблема, которую нужно решить. Ключи необходимо установить под учетной записью службы. Войдите на рабочую станцию ​​под учетной записью службы, установите ключи, и затем ее можно будет запустить из любого сеанса, который запускает ее в контексте учетной записи службы. Проблема решена.

0 голосов
/ 14 августа 2010

Начиная с Windows Vista, сервисам явно запрещено взаимодействовать с сеансом пользователя, , даже если он помечен как интерактивный . См. Интерактивные услуги :

Важно Услуги не могут напрямую взаимодействовать с пользователем с Windows Vista. Поэтому методы упоминается в разделе под названием Использование Интерактивная служба не должна быть используется в новом коде.

Если какое-либо из ваших 'консольных приложений * выполняет какое-либо взаимодействие с пользователем, оно не будет выполнено. Может ли это быть так? Если да, то вы не можете запускать «консольные приложения» из службы, их нужно будет запускать из сеанса пользователя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...