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

时间:2020-03-05 18:43:44  来源:igfitidea点击:

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

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

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

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

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

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

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

解决方案

回答

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

回答

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

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