2

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

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

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

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

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

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

(我不知道 Installscript ......所以我猜如果没有我可以使用的本地 InstallShield 东西, VBScript可能是要走的路。)

4

3 回答 3

5

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

于 2008-08-27T09:18:24.917 回答
1

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

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
于 2008-08-27T09:39:07.660 回答
1

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

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

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

于 2011-05-17T00:20:08.667 回答