我正在尝试使用System Center Configuration Manager 2012来升级安装在大多数计算机上的现有程序。 该程序使用InstallShield安装程序。 我们在这里是SCCM的新手,这个程序早在我们有SCCM的时候就已经出现了。
程序和安装程序的新版本没有内build的东西,我可以find检测或删除旧版本。 如果你只是运行新的安装程序,而不删除旧版本的程序,事情似乎好一段时间,但最终你开始发现不对的东西。 供应商build议在安装新版本之前手动删除旧版本。
我已经可以使用SCCM将新版本部署到干净的工作站。 不过,我现在还不能在这个时候成功删除旧版本。
在做了大量的研究之后,我已经logging了InstallShield的应答文件。 我用一个虚拟MSI文件为旧程序创build一个安装模板。 然后,我编辑了SCCM中的检测属性,以准确地find旧的程序。 我将安装程序更改为刚刚退出的虚拟命令,并查找了Windowsregistry中程序的卸载命令。
此时,如果我为此虚拟应用程序从SCCM创build一个卸载部署,它将正确检测程序是否已安装。 我工作站上的软件中心会显示是否安装,SCCM中显示的完成百分比是否准确。 只要整个脚本适合该应用程序的SCCM部署types的“程序”选项卡上的“ Uninstall program:字段,我也可以让卸载程序运行任意脚本。 我只需要用cmd /d /c"command goes here"这样的命令来封装命令cmd /d /c"command goes here" 。
如果我编辑该程序的卸载命令,不需要任何引号并将其放在该命令语法中,我可以通过Process Explorer看到卸载程序确实启动,但隐藏在本地系统帐户的私人桌面上等待从未到来的input。 它看起来像我需要告诉它关于答案文件来完成安装。 但是,这提出了两个问题。
第一个问题是,如果不使用cmd /d /c"..."语法,我看不到卸载程序曾经开始,但如果我使用语法,我不能包括答案文件,因为它必须用引号括起来。 我不能在Uninstall程序中看到要引用的字段:我需要使用。
即使我解决了这个问题,现在我需要知道如何将答案文件推送到单个系统。 从我看到的,我不能使用networking共享为此,因为卸载程序将作为本地系统帐户运行,将不具有任何networking资源的权限。 如果我可以将随机文件推送到计算机上,我也可以推送更复杂的卸载脚本…但是这也会留下工件,我仍然需要删除。
我已经在这方面花了太多的时间,似乎正在碰壁。 InstallShield和SCCM都被广泛使用。 当然这不是很难吗? 我错过了什么?
只要整个脚本适合该应用程序的SCCM部署types的“程序”选项卡上的“卸载程序:”字段,我也可以让卸载程序运行任意脚本。 我只需要用cmd / d / c这样的命令来封装命令“command goes here”。
我已经标准化了batch file来托pipe命令来执行(un)安装。 所以“安装程序”字段读取Install-Application.bat 。 这允许我通过简单地运行batch file来testing完全独立于SCCM的(未)安装过程。 然后当这个工作的时候,我可以使用SCCM来运行这个batch file,并确信它将以我已经testing过的相同方式执行(假设你在SCCM使用的同一个上下文中进行了testing)。 batch file与构成该应用程序内容的其他文件一起分发。
现在我需要知道如何将答案文件推送到各个系统。 从我看到的,我不能使用networking共享为此,因为卸载程序将作为本地系统帐户运行,将不具有任何networking资源的权限。 如果我可以将随机文件推送到计算机上,我也可以推送更复杂的卸载脚本…但是这也会留下工件,我仍然需要删除。
SCCM负责为您分配内容(包括caching和清理)。 它做得很好。 我想你可能会错过SCCM应用程序的内容和分发的概念。 SCCM将处理将您在“内容位置”字段中input的任何UNC文件夹的内容分发给所有需要它的客户端。 我发现这个工作可靠和自动化。 我的内容文件夹通常包括batch file,安装程序,PowerShell脚本,XML文件,.msp文件以及无人参与安装过程的其他任何configuration。
当然这不是很难吗? 我错过了什么?
这是很难的。 或者至less它经常是。 可能值得指出的是,SCCM不能帮助安装和卸载软件。 SCCM确实只处理软件分发 (而且做得相当好)。 SCCM完全依靠预先构build的安装程序和卸载程序来执行这些任务。 如果您尚未安装(un)安装程序,则SCCM无法为您提供帮助。 通常由以下的一些组合产生疼痛(对于我所看到的大约60%的安装者):
其中一些问题可以通过App-V解决(但是这不会帮助您卸载现有的本地应用程序)。 但是,据我所知,有一些应用程序的安装和卸载不能可靠地自动化。
这些是艰难的情况。 某些installsheild应用程序构build得非常差,只能在User上下文中运行,但如果用户不是本地pipe理员,则该过程将无法工作。 您可以尝试向供应商申诉新的应用程序。
对于现有的应用程序,您可以使用configurationpipe理器以相同的方式testing卸载脚本。 在pipe理命令提示符下的计算机上获取psexec ,然后键入c:\temp\psexec.exe -s -i cmd 。 -s用于系统, -i用于交互,而cmd是在系统上下文中启动的进程。 在新的System cmd窗口中,input您正在尝试运行的命令并查看它们是否实际工作。 如果他们不工作,你不能使用CM来运行这些命令 (至less不是在系统上下文中)。