代码之家  ›  专栏  ›  技术社区  ›  saschabeaumont

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

  •  3
  • saschabeaumont  · 技术社区  · 17 年前

    我正在处理的MSI部署(使用 InstallShield ).我们有一个在后台运行的程序,需要为每个用户运行,并且需要在没有用户干预的情况下自动启动。

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

    基本上,当前的工作流程是:

    1. 安装/升级运行。..终止后台应用程序
    2. 安装新文件
    3. 启动后台应用程序

    这适用于已发布的应用程序和交互式应用程序 MSI 安装-似乎只有“分配”的应用程序有问题。由于步骤3发生在SYSTEM上下文中,而不是用户上下文中:(

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

    (我不知道Installscript…所以我猜 VBScript 如果没有我可以使用的原生InstallShield东西,这可能是正确的做法。)

    3 回复  |  直到 12 年前
        1
  •  5
  •   On Freund    17 年前

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

        2
  •  1
  •   Community CDub    8 年前

    我不会依赖Windows安装程序属性来实现这一点。如果我没理解错的话,您想为每个用户运行一次EXE文件——可能是为了设置用户默认值?只有当用户实际登录时,你才能保证自己处于正确的上下文中。随着这些天在平均部署场景中进行的模拟量的增加,我只相信真正的用户登录是运行EXE文件的正确阶段。

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

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

        3
  •  1
  •   Stein Åsmul    11 年前

    哈哈!我知道必须有一个更清洁的解决方案。..我正在编写的代码开始看起来像这样:

    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