关于安装:阻止MSI在SYSTEM上下文中启动EXE

关于安装:阻止MSI在SYSTEM上下文中启动EXE

Stopping MSI from launching an EXE in the SYSTEM context

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

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

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

  • 安装/升级运行...杀死后台应用程序
  • 安装新文件
  • 启动后台应用
  • 此功能适用于已发布的应用程序和交互式MSI安装-似乎是唯一有问题的"已分配"应用程序。当步骤3在SYSTEM上下文而不是用户上下文中发生时:(

    理想情况下,我希望开发团队对EXE文件进行修补,以防止在SYSTEM上下文中启动,但这已经是一个发行周期了,我正在寻找一个基于安装程序的解决方案。

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


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


    我不会依赖Windows安装程序属性来完成此操作。如果我理解正确,那么您想为每个用户运行一次EXE文件-可能是为了设置用户默认值?您唯一可以保证您处于正确环境中的时间是用户实际登录的时间。在通常的部署方案中,这些天的假冒行为一直在发生,我只是不信任任何东西,只有真实的用户登录才是正确的阶段运行EXE文件。

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

    Microsoft具有一项称为"活动安装程序"的功能,该功能使您可以在登录时为每个用户运行一次"可运行的内容"。可以是任何内容,从脚本到可执行文件。请在这里查看我的答案以获取更多详细信息:在Windows Server 2003上更新每个配置文件的注册表


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

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    On Error Resume Next
    strComputer ="."
    Set objWMIService = GetObject("winmgmts:" _
        &"{impersonationLevel=impersonate}!\" & strComputer &"\
    oot\\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

    推荐阅读