我在这里遇到了一个我正在处理的MSI部署问题(使用InstallShield)。我们有一个在后台运行的程序,需要按用户运行,并且需要在没有用户干预的情况下自动启动。
问题在于Group Policy Object / Active Directory(GPO / AD)部署,应用程序在任何人登录之前在SYSTEM上下文中启动,而不是作为即将登录的用户。应用程序每个用户只能运行一次,并且似乎SYSTEM进程阻止了USER进程启动。这意味着在将软件部署到用户之前,需要重新启动PC两次。我们该怎样阻止这个?
目前的工作流程基本上是:
答案 0 :(得分:5)
您可以使用Windows Installer的LogonUser属性作为启动EXE的操作的条件。
答案 1 :(得分:1)
AHA!我知道必须有一个更清洁的解决方案...我正在研究的代码开始看起来像这样:
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
答案 2 :(得分:1)
我不会依赖Windows安装程序属性来完成此任务。如果我理解正确,你想为每个用户运行一次EXE文件 - 可能是为了设置用户默认值?唯一一次,您可以保证您处于正确的上下文中是用户实际登录的时间。在平均部署方案中,这些天的模拟次数我只是不相信任何东西,只有真正的用户登录才是正确的阶段运行EXE文件。
问题来源太多:自定义权限和特权锁定,终端服务器锁定,虚拟化重定向,部署系统运行模拟,注册表写入操作系统覆盖等等。
Microsoft有一个名为Active Setup的功能,它允许您在登录时为每个用户运行一次“可运行的东西”。这可以是从脚本到可执行文件的任何内容。有关详细信息,请参阅我的回答:Updating every profile's registry on Windows Server 2003