Я хочу периодически запускать произвольную .NET exe под указанной учетной записью пользователя из службы Windows.
Пока у меня работает служба Windows с логикой, чтобы решить, что такое целевой процесс, и когда его запускать. Целевой процесс запускается следующим образом:
- Служба Windows запускается с использованием учетных данных "administrator".
- Когда придет время, выполняется промежуточный процесс .NET с аргументами, подробно описывающими, какой процесс должен быть запущен (имя файла, имя пользователя, домен, пароль).
- Этот процесс создает новый System.Diagnostics.Process, связывает объект ProcessStartInfo, заполненный переданными ему аргументами, а затем вызывает объект Start() для объекта процесса.
первый раз это происходит, целевой процесс выполняется нормально, а затем обычно закрывается. Однако каждый последующий момент, как только начинается целевой процесс, он выдает ошибку "Приложение не удалось инициализировать правильно (0xc0000142)". Перезапуск службы Windows позволит процессу снова успешно выполнить (для первого выполнения).
Естественно, цель состоит в успешном выполнении целевого процесса каждый раз.
Относительно шага 2 выше: для запуска процесса как другого пользователя .NET вызывает функцию win32 CreateProcessWithLogonW. Эта функция требует, чтобы дескриптор окна регистрировал указанного пользователя. Поскольку служба Windows не работает в интерактивном режиме, у нее нет дескриптора окна. Этот промежуточный процесс решает проблему, поскольку он имеет дескриптор окна, который может быть передан целевому процессу.
Пожалуйста, никаких рекомендаций по использованию psexec или планировщика задач Windows. Я принял свою судьбу в жизни, и это включает решение проблемы в соответствии с изложенным выше способом.