У меня проблема с развертыванием MSI, над которым я работаю (с использованием InstallShield). У нас есть программа, работающая в фоновом режиме, которая должна запускаться для каждого пользователя, и она должна запускаться автоматически без вмешательства пользователя.
Проблема заключается в развертывании Объект групповой политики / Active Directory (GPO / AD), приложение запускается в контексте SYSTEM до того, как кто-либо войдет в систему, а не как пользователь, который собирается войти в систему. Приложение может запускаться только один раз для каждого пользователя, и кажется что процесс SYSTEM предотвращает запуск процесса USER. Это означает, что ПК необходимо дважды перезагрузить, прежде чем программное обеспечение можно будет развернуть для пользователей. Как нам это остановить?
В основном текущий рабочий процесс:
Это работает для опубликованных приложений и интерактивных установок MSI - кажется, только «назначенные» приложения имеют проблемы. Поскольку шаг 3 происходит в контексте СИСТЕМЫ, а не в контексте пользователя :(
В идеале я бы попросил команду разработчиков исправить EXE-файл, чтобы предотвратить запуск в контексте SYSTEM, но это цикл выпуска, и я ищу решение на основе установщика на время.
(Я не знаю Installscript ... Так что я предполагаю, что VBScript, вероятно, будет подходящим вариантом, если нет собственного инструмента InstallShield, который я мог бы использовать.)





Вы можете использовать свойство LogonUser установщика Windows в качестве условия для действия, запускающего EXE.
было бы здорово, если бы вы могли объяснить, как это сделать более подробно.
АГА! Я знал, что должно быть более чистое решение ... код, над которым я работал, начинал выглядеть примерно так:
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
Просто добавили это в наш последний выпуск (заменив мой код ниже) - Работает как шарм! Спасибо :)