我正在尝试使用 System Center Configuration Manager 2012 升级我们大多数计算机上安装的现有程序。该程序使用 InstallShield 安装程序。我们是 SCCM 的新手,这个程序早在 SCCM 可用之前就已经存在了。
新版本的程序和安装程序没有内置任何可以检测或删除旧版本的功能。如果您只运行新安装程序而不删除旧版本的程序,一段时间内一切似乎都正常,但最终您会发现有些不对劲。供应商建议在安装新版本之前手动删除旧版本。
我已经可以使用 SCCM 将新版本部署到干净的工作站。但是,目前我无法成功删除旧版本。
经过大量研究,我已经为 InstallShield 录制了一个应答文件。我使用虚拟 MSI 文件为旧程序创建安装模板。然后,我在 SCCM 中编辑了检测属性以准确找到旧程序。我将安装程序更改为仅退出的虚拟命令,并在 Windows 注册表中查找该程序的卸载命令。
此时,如果我从 SCCM 为这个虚拟应用程序创建卸载部署,它将正确检测程序是否已安装。我的工作站上的软件中心将显示它是否已安装,并且 SCCM 中显示的完成百分比是准确的。我还可以让卸载程序运行任意脚本,只要整个脚本适合Uninstall program:
该应用程序的 SCCM 部署类型的“程序”选项卡上的字段即可。我只需要将命令括在类似的内容中cmd /d /c"command goes here"
。
如果我编辑程序的卸载命令使其不需要任何引号,并将其放入命令语法中,我可以通过 Process Explorer 看到卸载程序确实启动了,但它隐藏在本地系统帐户的私人桌面上,在那里它将等待永远不会出现的输入。看来我需要告诉它有关应答文件的信息才能完成安装。然而,这带来了两个问题。
第一个问题是,如果不使用cmd /d /c"..."
语法,我根本看不到卸载程序启动,但如果我使用语法,我就无法包含应答文件,因为它必须用引号括起来。我看不出有什么办法可以转义我需要使用的卸载程序:字段中的引号。
即使我解决了这个问题,现在我也需要知道如何将应答文件推送到各个系统。据我所知,我不能为此使用网络共享,因为卸载程序将以本地系统帐户运行,而该帐户没有任何网络资源的权限。如果我可以将随机文件推送到计算机,我也可以推送更复杂的卸载脚本……但这也会留下我仍然需要一种方法来删除的遗留物。
我已经花了太多时间在这上面了,但似乎遇到了瓶颈。InstallShield 和 SCCM 都被广泛使用。这肯定没那么难吧?我遗漏了什么?
答案1
我还可以让卸载程序运行任意脚本,只要整个脚本适合该应用程序的 SCCM 部署类型的“程序”选项卡上的“卸载程序:”字段即可。我只需将命令括在类似 cmd /d /c“command goes here”的命令中即可。
我已经标准化了批处理文件,以托管执行(卸载)安装的命令。因此,“安装程序”字段显示为Install-Application.bat
。这样,我只需运行批处理文件,就可以完全独立于 SCCM 测试(卸载)安装过程。然后,当它正常工作时,我可以使用 SCCM 运行该批处理文件,并确信它将以我已经测试过的相同方式执行(假设您在与 SCCM 使用的相同环境中进行测试)。批处理文件与构成该应用程序内容的其他文件一起分发。
现在我需要知道如何将应答文件推送到各个系统。据我所知,我不能为此使用网络共享,因为卸载程序将以本地系统帐户运行,而该帐户没有任何网络资源的权限。如果我可以将随机文件推送到计算机,我也可以推送更复杂的卸载脚本……但这也会留下我仍然需要一种方法来删除的工件。
SCCM 负责为您分发内容(包括缓存和清理)。它在这方面做得很好。我认为您可能忽略了 SCCM 应用程序的内容和分发概念。SCCM 将负责将您放在“内容位置”字段中的任何 UNC 文件夹的内容分发给所有需要它的客户端。我发现它可靠且自动地工作。我的内容文件夹通常包括批处理文件、安装程序、powershell 脚本、XML 文件、.msp 文件和无人值守安装过程的任何其他陷阱。
这肯定没那么难吧?我漏掉了什么?
就是这么难。或者至少通常如此。值得一提的是,SCCM 无法帮助安装和卸载软件。SCCM 实际上只处理软件分发(并且做得相当好)。SCCM 完全依赖预构建的安装程序和卸载程序来执行这些任务。如果您还没有一个按您希望的方式运行的(卸载)安装程序,SCCM 就无法帮助您。问题通常是由以下某种组合造成的(我看到的大约 60% 的安装程序都是如此):
- 当您确实希望安装程序无人值守运行时,需要用户交互(据我所知,对于本机应用程序来说,没有简单的方法可以克服这个问题)
- 为单个用户安装的(卸载)安装程序,但需要提升权限(据我所知,没有可行的自动化方法)
- 安装程序(卸载程序)声称是为单个用户安装,但实际上是为系统安装,反之亦然
其中一些问题可以通过 App-V 解决(但这无法帮助您卸载现有的本机应用程序)。不过,据我所知,有些应用程序的安装和卸载无法可靠地实现自动化。
答案2
这些都是棘手的情况。一些 installsheild 应用程序构建得非常糟糕,只能在用户上下文中运行,但如果用户不是本地管理员,则该过程将永远无法运行。您可以尝试向供应商投诉以寻求新应用程序。
对于现有应用,你可以按照 Configuration Manager 运行卸载脚本的相同方式测试它们。获取执行在计算机上的管理命令提示符下输入c:\temp\psexec.exe -s -i cmd
。-s
表示系统, 表示-i
交互, 表示cmd
在系统上下文中启动的进程。 在新的系统 cmd 窗口中,输入您要运行的命令,看看它们是否真的有效。如果它们不起作用,您就无法使用 CM 运行这些命令(至少在系统环境中不是)。