2008-08-27 7 views
2

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

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

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

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

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

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

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

ответ

5

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

+0

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

+1

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

1

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 
1

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

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

Microsoft имеет функцию Active Setup, которая позволит вам запускать «что-то runnable» один раз для каждого пользователя при входе в систему. Это может быть что угодно: от скрипта до исполняемого файла. См. Мой ответ здесь для получения более подробной информации: Updating every profile's registry on Windows Server 2003