我正在尝试使用 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 都被广泛使用。肯定没这么难吧?我错过了什么?
我已经标准化了批处理文件来托管执行(卸载)安装的命令。因此“安装程序”字段显示为
Install-Application.bat
. 这允许我通过简单地运行批处理文件来测试完全独立于 SCCM 的(卸载)安装过程。然后,当它工作时,我可以使用 SCCM 运行该批处理文件,并确信它将以与我已经测试过的方式相同的方式执行(假设您在与 SCCM 使用的相同上下文中进行测试)。批处理文件与构成该应用程序内容的其他文件一起分发。SCCM 会为您处理内容分发(包括缓存和清理)。它在这方面做得很好。我认为您可能缺少 SCCM 应用程序的内容和分发的概念。SCCM 将处理将您放在“内容位置”字段中的任何 UNC 文件夹的内容分发给所有需要它的客户端。我发现它可以可靠且自动地工作。我的内容文件夹通常包括批处理文件、安装程序、powershell 脚本、XML 文件、.msp 文件以及无人值守安装过程的任何其他陷阱。
这很难。或者至少经常如此。值得一提的是,SCCM 对软件的安装和卸载没有帮助。SCCM 实际上只处理软件分发(并且做得相当好)。SCCM 完全依赖预构建的安装程序和卸载程序来执行这些任务。如果您还没有按您希望的方式运行的(卸载)安装程序,SCCM 将无法帮助您。疼痛通常是由以下某些组合引起的(对于我看到的大约 60% 的安装人员):
App-V 可以解决其中一些问题(但这不会帮助您卸载现有的本机应用程序)。然而,据我所知,有些应用程序的安装和卸载无法可靠地自动化。
这些都是艰难的情况。一些 installsheild 应用程序构建得很差,只能在用户上下文中运行,但如果用户不是本地管理员,则该过程将永远无法工作。您可以尝试向供应商投诉新应用程序。
对于现有应用,您可以使用 Configuration Manager 运行它们的相同方式测试您的卸载脚本。在管理命令提示符下在计算机上获取psexec
c:\temp\psexec.exe -s -i cmd
并键入.-s
用于系统,用于-i
交互,cmd
是在系统上下文中启动的进程。在新的 System cmd 窗口中,输入您尝试运行的命令,看看它们是否真的有效。如果它们不起作用,则不能使用 CM 运行这些命令(至少不能在系统上下文中)。