Остановка MSI от запуска EXE-файла в контексте СИСТЕМЫ
-
09-06-2019 - |
Вопрос
У меня возникла проблема с развертыванием MSI, над которым я работаю (используя УстановитьЩит).У нас есть программа, работающая в фоновом режиме, которая должна запускаться для каждого пользователя и запускаться автоматически без вмешательства пользователя.
Проблема в том, Объект групповой политики/Активный каталог (GPO/AD) приложение запускается в контексте СИСТЕМЫ до того, как кто-либо войдет в систему, а не от имени пользователя, который собирается войти в систему.Приложение может запускаться только один раз для каждого пользователя, и кажется, что процесс СИСТЕМА предотвращает запуск процесса ПОЛЬЗОВАТЕЛЬ.Это означает, что компьютеры необходимо дважды перезагрузить, прежде чем программное обеспечение можно будет развернуть пользователям.Как нам остановить это?
В основном текущий рабочий процесс:
- Установка/обновление выполняется...убить фоновое приложение
- Установить новые файлы
- Фоновое приложение при запуске
Это работает для опубликованных приложений и интерактивных МСИ установки - проблемы возникают только с «назначенными» приложениями.Поскольку шаг 3 происходит в контексте СИСТЕМЫ, а не в контексте пользователя :(
В идеале я бы попросил команду разработчиков исправить EXE-файл, чтобы предотвратить запуск в контексте СИСТЕМЫ, но это еще один цикл выпуска, и я ищу временное решение на основе установщика.
(Я не знаю Installscript...Так что я предполагаю VBScript вероятно, это лучший вариант, если у меня нет встроенного компонента InstallShield, который я мог бы использовать.)
Решение
Вы можете использовать Пользователь входа в систему свойство установщика Windows как условие действия, запускающего EXE.
Другие советы
Я бы не стал полагаться на свойство установщика Windows для достижения этой цели.Если я правильно понимаю, вы хотите запускать EXE-файл один раз для каждого пользователя - возможно, для настройки пользовательских настроек по умолчанию?Единственный раз, когда вы можете гарантировать, что находитесь в правильном контексте, — это когда пользователь действительно входит в систему.Учитывая количество выдачи себя за другое лицо, происходящее в наши дни в среднем сценарии развертывания, я просто не доверяю ничему, кроме входа в систему реального пользователя, как правильного этапа для запуска EXE-файлов.
Слишком много источников проблем:блокировка настраиваемых разрешений и привилегий, блокировка сервера терминалов, перенаправление виртуализации, олицетворение, выполняемое системой развертывания, переопределения операционной системы для записи в реестр и т. д.
У Microsoft есть функция под названием Active Setup, которая позволит вам запускать «что-то работоспособное» один раз для каждого пользователя при входе в систему.Это может быть что угодно: от сценария до исполняемого файла.Более подробную информацию смотрите в моем ответе здесь: Обновление реестра каждого профиля в Windows Server 2003
АГА!Я знал, что должно быть более чистое решение...код, над которым я работал, начинал выглядеть примерно так:
On Error Resume Next
strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colProcessList = objWMIService.ExecQuery _
("Select * from Win32_Process Where Name = 'BackgroundProcess.exe'")
For Each objProcess in colProcessList
colProperties = objProcess.GetOwner(strNameOfUser,strUserDomain)
If strNameOfUser = "SYSTEM" Then
objProcess.Terminate()
End If
Next