Редактировать Для всех, у кого возникла проблема, она, как обычно, легко решается. Ключи необходимо установить под учетной записью службы. Войдите на рабочую станцию под учетной записью службы, установите ключи, и затем ее можно будет запустить из любого сеанса, который запускает ее в контексте учетной записи службы. Проблема решена.
Редактировать: Сервис ОС - это 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, я не получаю никаких отзывов от консольного приложения. Я не получаю сообщения об отказе в доступе или что-то еще, что не помогает при попытке отладки.
Вопросы:
- Есть ли очевидные проблемы? Сервисная учетная запись действительно действительна и не имеет проблем с подключением к сети.
- Нужно ли
Console App A
также использовать имя пользователя / домен / пароль в команде Process.Start()
при вызове сторонней программы?
- Очевидно, могут быть альтернативы тому, как я это делаю, но - должен ли я полностью отказаться от этого? Я чувствую, что это должно сработать.
Код:
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