Запуск программы с использованием LocalSystem Service CreateProcessAsUser эквивалентен двойному щелчку по значку при входе в систему? [C #] - PullRequest
0 голосов
/ 18 сентября 2009

В моей компании есть продукт, который в значительной степени взаимодействует со всем, что вы можете себе представить ... реестром, базами данных, устройствами и т. Д. ... он состоит из множества частей, но все приложение запускается одним исполняемым файлом (начало .exe), который отвечает за запуск всего остального - это весь устаревший код, выполняемый под учетной записью USER.

В настоящее время это запускается как элемент STARTUP (или двойным щелчком по значку на рабочем столе) в Windows, что означает, что когда пользователь входит в учетную запись USER, приложение (start.exe) автоматически запускается, под этой учетной записью оно имеет все разрешения, необходимые для запуска, и все было хорошо в течение многих лет ...

Теперь пришло изменение - я написал службу (Serv.exe), которая работает как LocalSystem - эта служба отвечает за обновление различных программных компонентов нашего продукта и работает следующим образом: - когда продукт обнаруживает обновление, он сигнализирует о службе LocalSystem (Serv.exe), а затем завершает свою работу - Serv.exe выполнит все обновления

Теперь, после того, как все сделано, продукт (через start.exe) должен быть снова запущен автоматически ... и вот где мне нужен совет ... как лучше всего перезапустить продукт (запустить). ехе)

В данный момент я использую LocalSystem Service (Serv.exe) и олицетворяю учетную запись USER следующим образом: - CreateEnvironmentBlock для ПОЛЬЗОВАТЕЛЯ - CreateProcessAsUser (start.exe) как ПОЛЬЗОВАТЕЛЬ с соответствующим EnvBlock - DestroyEnvironmentBlock

Но действительно ли это на 100% эквивалентно двойному щелчку по значку в контексте учетной записи USER? Мне нужно убедиться, что все идентично, когда он запускается либо при STARTUP пользователя, либо путем олицетворения из Serv.exe (LocalSystem) - есть ли риск? Буду ли я по-прежнему иметь те же права / возможности для всех баз данных? реестр? взаимодействие устройства? и т.д ..

Загружая EnvBlock, я, кажется, получаю все, что мне нужно, но ... разве это не хороший способ сделать это ...?

Вид надежды на какое-то руководство и совет от профессионала там ... Любая помощь или советы будут высоко ценится. Спасибо,

Ответы [ 2 ]

0 голосов
/ 19 сентября 2009

Вместо того, чтобы запускать приложение напрямую как «элемент запуска», вы можете запустить «launcher.exe», который затем запустит ваше приложение. Служба может затем сигнализировать «launcher.exe», что другой экземпляр приложения должен запуститься после обновления. Используя этот метод, вы не можете использовать сервис для обновления "launcher.exe", но этот исполняемый файл должен быть очень простым и, надеюсь, не требовать каких-либо обновлений. Использование этого метода позволит избежать всех ловушек при попытке запуска интерактивного приложения из службы.

0 голосов
/ 18 сентября 2009

Обновление: Вот запись с именем: Запуск интерактивного процесса из службы Windows в Windows Vista и более поздних версиях . Что именно то, что вы ищете. Начинается с:

Первое, что вы должны сделать с этим, это; не делай этого Есть много ограничений и плохих последствий и ограничений.

Итак, сначала проверьте, работает ли ваше текущее решение. Это зависит от того, что делает процесс. Если это не связано с взаимодействием с пользователем. Или манипулирование текущим сеансом пользователя. Тогда вам не нужно это сложное решение. Если вам это нужно, тогда удачи!

До обновления: Это не на 100% эквивалентно. Кроме авторизации, в окнах, сеансах и в каждом сеансе есть рабочие столы. Процесс, запущенный из службы, будет выполняться в сеансе службы и на рабочем столе (если служба имеет его). В зависимости от того, что делает start.exe, это может быть важно или нет.

Посмотрите на функцию SetTokenInformation.

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