阻止MSI在SYSTEM上下文中启动EXE

时间:2008-08-27 08:52:35

标签: installer installation windows-installer installshield

我在这里遇到了一个我正在处理的MSI部署问题(使用InstallShield)。我们有一个在后台运行的程序,需要按用户运行,并且需要在没有用户干预的情况下自动启动。

问题在于Group Policy Object / Active Directory(GPO / AD)部署,应用程序在任何人登录之前在SYSTEM上下文中启动,而不是作为即将登录的用户。应用程序每个用户只能运行一次,并且似乎SYSTEM进程阻止了USER进程启动。这意味着在将软件部署到用户之前,需要重新启动PC两次。我们该怎样阻止这个?

目前的工作流程基本上是:

  1. 安装/升级运行...杀死后台应用程序
  2. 安装新文件
  3. 启动后台应用程序
  4. 这适用于已发布的应用程序和交互式MSI安装 - 它只是“已分配”的应用程序似乎有问题。由于步骤3发生在SYSTEM上下文而不是用户上下文中:(

    理想情况下,我会让开发团队修补EXE文件,以防止在SYSTEM上下文中启动,但这是一个发布周期,我正在寻找一个基于安装程序的临时解决方案。

    (我不知道Installscript ......所以如果没有我可以使用的原生InstallShield内容,我猜测VBScript可能就好了。)

3 个答案:

答案 0 :(得分:5)

您可以使用Windows Installer的LogonUser属性作为启动EXE的操作的条件。

答案 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

答案 2 :(得分:1)

我不会依赖Windows安装程序属性来完成此任务。如果我理解正确,你想为每个用户运行一次EXE文件 - 可能是为了设置用户默认值?唯一一次,您可以保证您处于正确的上下文中是用户实际登录的时间。在平均部署方案中,这些天的模拟次数我只是不相信任何东西,只有真正的用户登录才是正确的阶段运行EXE文件。

问题来源太多:自定义权限和特权锁定,终端服务器锁定,虚拟化重定向,部署系统运行模拟,注册表写入操作系统覆盖等等。

Microsoft有一个名为Active Setup的功能,它允许您在登录时为每个用户运行一次“可运行的东西”。这可以是从脚本到可执行文件的任何内容。有关详细信息,请参阅我的回答:Updating every profile's registry on Windows Server 2003