Запуск процессов из службы Windows - PullRequest
0 голосов
/ 31 января 2019

Я написал C # Windows Service (для использования в Windows 8.1 (32/64 бит) и Windows 10), который отслеживает определенные условия, и когда они выполняются, он запускает другое приложение Windows Forms с некоторыми аргументами, управляющими сообщениемотображается для пользователя.Мне хорошо известны проблемы взаимодействия службы с сеансом пользователя, и служба использует (слегка) измененную версию кода MSDN для запуска процессов из службы в сеансе пользователя, которая доступна здесь: https://code.msdn.microsoft.com/windowsapps/CSCreateProcessAsUserFromSe-b682134e#content

Когда служба запущена, она с радостью запустит Блокнот в сеансе пользователя, если указанная мной переменная launchpath имеет значение C: \ Windows \ sysnative \ notepad.exe

Однако, если япопробуйте вызвать мое другое приложение WinForms с помощью командной строки:

string launchpath = "\"{0}Kiosk.exe\" \"{1}\" \"{2}\"";

Где {0} заменяется на:

launchpath = launchpath.Replace("{0}", AppDomain.CurrentDomain.BaseDirectory);

и два других заполнителя ({1} и {2}) заменяются аргументами запуска, машина, на которой запускается служба, регистрирует системный код ошибки 123, который, как мне говорит эта ссылка https://docs.microsoft.com/en-us/windows/desktop/debug/system-error-codes--0-499-), означает «неверный синтаксис имени файла, имени каталога или метки тома».

Я попытался жестко запрограммировать путь, переместив приложение WinForms, чтобы путь выполнения также находился в каталоге c: \ windows \ sysnative, но, похоже, ничего не работает, я всегда получаюта же ошибка в логах и приложение не загружается.Если я сделаю ярлык для приложения kiosk.exe, чтобы передать некоторые тестовые аргументы, он запустится нормально.

Кто-нибудь еще сталкивался с этим?Буду благодарен за любой совет.

1 Ответ

0 голосов
/ 31 января 2019

Оказывается, у меня были некоторые параметры в методе CreateProcessAsUser (), который вызывал неверный путь.Мой первоначальный вызов был:

if (CreateProcessAsUser(hToken, launchpath, null, IntPtr.Zero, IntPtr.Zero, false, 0, null, null, ref tStartupInfo, out tProcessInfo)) { ... }

, который не работал, однако при изменении на:

if (CreateProcessAsUser(hToken, null, launchpath, IntPtr.Zero, IntPtr.Zero, false, 0, null, null, ref tStartupInfo, out tProcessInfo)) { ... }

Он работал нормально.Я все еще не уверен, почему он смог запустить блокнот нормально, но это загадка для другого дня ...

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