阻止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