Остановить MSI от запуска EXE в контексте СИСТЕМЫ

У меня проблема с развертыванием MSI, над которым я работаю (с использованием InstallShield). У нас есть программа, работающая в фоновом режиме, которая должна запускаться для каждого пользователя, и она должна запускаться автоматически без вмешательства пользователя.

Проблема заключается в развертывании Объект групповой политики / Active Directory (GPO / AD), приложение запускается в контексте SYSTEM до того, как кто-либо войдет в систему, а не как пользователь, который собирается войти в систему. Приложение может запускаться только один раз для каждого пользователя, и кажется что процесс SYSTEM предотвращает запуск процесса USER. Это означает, что ПК необходимо дважды перезагрузить, прежде чем программное обеспечение можно будет развернуть для пользователей. Как нам это остановить?

В основном текущий рабочий процесс:

  1. Установка / обновление запускается ... убить фоновое приложение
  2. Установить новые файлы
  3. Запуск фонового приложения

Это работает для опубликованных приложений и интерактивных установок MSI - кажется, только «назначенные» приложения имеют проблемы. Поскольку шаг 3 происходит в контексте СИСТЕМЫ, а не в контексте пользователя :(

В идеале я бы попросил команду разработчиков исправить EXE-файл, чтобы предотвратить запуск в контексте SYSTEM, но это цикл выпуска, и я ищу решение на основе установщика на время.

(Я не знаю Installscript ... Так что я предполагаю, что VBScript, вероятно, будет подходящим вариантом, если нет собственного инструмента InstallShield, который я мог бы использовать.)

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
0
1 976
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Вы можете использовать свойство LogonUser установщика Windows в качестве условия для действия, запускающего EXE.

Просто добавили это в наш последний выпуск (заменив мой код ниже) - Работает как шарм! Спасибо :)

saschabeaumont 11.12.2008 02:09

было бы здорово, если бы вы могли объяснить, как это сделать более подробно.

Patrick Klug 15.06.2009 07:40

АГА! Я знал, что должно быть более чистое решение ... код, над которым я работал, начинал выглядеть примерно так:

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

Я бы не стал полагаться на свойство установщика Windows для этого. Если я правильно понимаю, вы хотите запускать EXE-файл один раз для каждого пользователя - возможно, для настройки пользовательских значений по умолчанию? Единственный раз, когда вы можете гарантировать, что находитесь в правильном контексте, - это когда пользователь действительно входит в систему. Учитывая количество олицетворения, происходящее в наши дни в среднем сценарии развертывания, я просто не доверяю ничему, кроме входа в систему реального пользователя как правильного stage для запуска EXE-файлов.

Слишком много источников проблем: пользовательские блокировки разрешений и привилегий, блокировка терминального сервера, перенаправления виртуализации, олицетворение, выполняемое системой развертывания, переопределения операционной системы для записи в реестр и т. д.

У Microsoft есть функция Active Setup, которая позволит вам запускать «что-то работоспособное» один раз для каждого пользователя при входе в систему. Это может быть что угодно, от сценария до исполняемого файла. Подробнее см. Мой ответ здесь: Обновление реестра каждого профиля в Windows Server 2003

Другие вопросы по теме