2008-08-27 26 views
2

我在这里遇到了一个我正在使用的MSI部署(使用InstallShield)的问题。我们有一个程序在后台运行,需要按用户运行,并且需要在没有用户干预的情况下自动启动。停止MSI在SYSTEM环境中启动EXE

问题是与Group Policy Object/Active Directory(GPO/AD)的应用程序在系统范围内开始有人在登录前的部署,而不是谁是即将登录。该应用程序只能在每个用户运行一次用户,似乎SYSTEM进程阻止了USER进程启动。这意味着在将软件部署到用户之前,PC需要重新启动两次。我们如何制止这一点?

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

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

这适用于已发布应用程序和互动MSI安装 - 它只是“分配”的应用程序,似乎有问题。因为步骤3发生在SYSTEM环境而不是用户环境中:理想情况下,我希望开发团队修补EXE文件以防止在SYSTEM环境中启动,但这是一个释放周期, m寻找基于安装程序的过渡解决方案

(我不知道Installscript ...所以我猜VBScript可能是如果没有本机InstallShield我可以使用的东西去。)

回答

5

您可以使用Windows Installer的LogonUser财产的行动启动EXE的条件。

+0

刚刚在我们的最新版本中添加了这个(替换下面的代码) - 像魅力一样工作!谢谢:) – saschabeaumont 2008-12-10 23:09:07

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 
1

我不会依赖一个Windows Installer属性来实现这一点。如果我理解正确,你想为每个用户运行一次EXE文件 - 可能要设置用户默认值?唯一一次可以保证您处于正确的环境中的是用户实际登录的时间。在平均部署情况下,随着模拟量的增加,我只是不信任任何东西,只是真正的用户登录名是正确的阶段运行EXE文件。

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

微软有一个功能叫做主动安装程序,它允许您在登录时为每个用户运行一次“可运行的程序”。这可以是从脚本到可执行文件的任何内容。 Updating every profile's registry on Windows Server 2003