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

问题在于 组策略对象/活动目录 (GPO/AD) 部署应用程序在任何人登录之前在系统上下文中启动,而不是以即将登录的用户身份启动。该应用程序每个用户只能运行一次,并且 SYSTEM 进程似乎阻止了 USER 进程启动。这意味着电脑需要重新启动两次才能将软件部署给用户。我们如何阻止这种情况?

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

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

这适用于已发布的应用程序和交互式 微星指数 安装 - 只有“指定”的应用程序似乎有问题。因为步骤 3 发生在系统上下文中而不是用户上下文中:(

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

(我不知道安装脚本...所以我猜测 VB脚本 如果没有我可以使用的原生 InstallShield 东西,这可能是可行的方法。)

有帮助吗?

解决方案

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

其他提示

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

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

微软有一个称为“活动安装”的功能,它允许您在每个用户登录时运行一次“可运行的东西”。这可以是从脚本到可执行文件的任何内容。请参阅我的回答以了解更多详细信息: 更新 Windows Server 2003 上每个配置文件的注册表

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

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
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top