Остановка MSI от запуска EXE в контексте системы - PullRequest
2 голосов
/ 27 августа 2008

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

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

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

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

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

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

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

Ответы [ 3 ]

5 голосов
/ 27 августа 2008

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

1 голос
/ 17 мая 2011

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

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

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

1 голос
/ 27 августа 2008

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

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
...