有没有办法在SCCM 2012中重新安装应用程序?

时间:2015-03-09 19:41:51

标签: software-distribution configurationmanager sccm

在SCCM 2007中,有几个"右键单击工具",在他们的帮助下,可以重新安装"一套。在SCCM 2012中,我仍然无法找到方法,我该如何重新安装应用程序?

让我解释一下:
我从软件创建了一个安装包,然后将其作为" Application"进行分发。安装成功完成。一周后用户打电话,他在使用此应用程序时遇到问题。我创建的软件包支持重新安装(通过删除软件并再次安装或使用修复功能)。但是,在SCCM中我没有选择(既没有找到可以做到这一点的右键单击工具),也没有重新安装包。我必须将其删除,然后重新安装。

我以为我可以编写一个程序,并创建我自己的"右键单击工具"但是我无法找到任何信息到底应该做什么?

所以我的问题是:
- 是否有可以某种方式重新安装应用程序的右键单击工具?
- 是否有一些文档,我可以从中获得有关此问题的一些信息?

我确信,其他许多人也有同样的问题。 或者我找不到方法,因为没有? :(

提前致谢!

1 个答案:

答案 0 :(得分:3)

在我们公司,我们也不得不喜欢这个并做了一些基础研究,但到目前为止似乎没有人做过(并不意味着它是不可能的)。我们还与两位微软SCCM顾问讨论了这个问题,两人都表示目前没办法。

事情是应用程序都是关于检测方法。这是唯一会触发设置的东西。因此,如果你有一个软件,并且你不想将它作为软件包部署(这仍然是可能的,它们仍然可以使用Roger Zanders客户中心等工具重新运行),你可以做的就是使用一种检测方法,你可以影响。像文件或注册表一样,您可以远程删除。可以像所有其他客户端操作一样远程触发应用程序部署评估周期,因此这不会成为问题。

可悲的是,这只是一种解决方法,我非常希望如果有人证明我错了,但到目前为止这是我们能想到的最好的。

编辑: 所以你激励我深入挖掘一下,我也从微软获得了一些非常好的幻灯片,我发现了一些可能的方法:

由于应用程序一直都是关于检测,我的想法是伪造它。

据我所知,检测方法在类root\ccm\CIModels的{​​{1}}中的WMI中以某种疯狂的xml格式保存。所以我编写了一个脚本,用一个检查文件的空检测方法替换检测方法。它没有属性,所以它永远不会工作。之后,我使用同一名称空间中的类Local_Detect_Synclet在我的应用程序上调用enforce方法。它需要AppdeliveryTypeID和当前版本,但这两个版本都可以在CCM_AppDeliveryType中看到。强制重新安装程序后,我将检测方法重置为旧程序并触发第二次强制执行,除了告诉系统正确检测到应用程序之外什么都不做。完成所有这些的Vbscript看起来像这样:

CCM_AppDeliveryTypeSynclet

ExpressionXML非常长,但我通过试验和错误删除了所有内容。

为简单起见,我对AppdeliTypeTypeID和版本进行了硬编码,但您可以使用以下查询获取包含好名称的列表:

computername = "WS0000xxxx"

Set wmiCIModels = GetObject("winmgmts:\\" & computername & "\root\ccm\CIModels")
Set wmiAppDeliveryType = GetObject("winmgmts:\\" & computername & "\root\ccm\CIModels:CCM_AppDeliveryType")


deploymentTypeID = "ScopeId_79903130-730F-48B7-8165-6088B83359BE/DeploymentType_68a80836-208e-401b-a69f-ae4c184b9f85"

Set installedDelTypes = wmiCIModels.ExecQuery("select * from Local_Detect_Synclet where AppDeliveryTypeId = '" & deploymentTypeID & "'" )

For Each instDelType In installedDelTypes
    strOldDetectionMethod = instDelType.ExpressionXml
    instDelType.ExpressionXml = "<LocalDetectionMethod><Settings><File></File></Settings><Rule xmlns=""http://schemas.microsoft.com/SystemsCenterConfigurationManager/2009/06/14/Rules""><Expression><Operator>Equals</Operator><Operands><SettingReference AuthoringScopeId="""" DataType=""Version"" SettingLogicalName=""X"" Method=""Value""/><ConstantValue DataType=""Version""/></Operands></Expression></Rule></LocalDetectionMethod>"
    instDelType.Put_ 0

    wmiAppDeliveryType.EnforceApp deploymentTypeID, "4", "", "Install", "", "1"

    instDelType.ExpressionXml = strOldDetectionMethod
    instDelType.Put_ 0

    wmiAppDeliveryType.EnforceApp deploymentTypeID, "4", "", "Install", "", "1" 
Next

这也是我迄今为止发现的最大缺点。只能轻松获取AppDeliveries的名称。例如,这些不是应用程序在软件中心中显示的名称。我调查了这个,但到目前为止我发现的唯一方法是查询SCCM数据库本身,查询非常复杂,当然需要一些SCCM管理员来执行它。

与所有WMI脚本一样,您可以通过指定计算机名称远程执行它,如果使用“。”,则可以在本地执行,因此您可以使用SCCM控制台扩展系统并基于此构建自己的右键单击工具。

这甚至可以在未安装类似于重新运行包的应用程序上运行。如果您不想这样做,可以查看Set wmiCIModels = GetObject("winmgmts:\\" & computername & "\root\ccm\CIModels") Set delTypes = wmiCIModels.ExecQuery("select * from CCM_AppDeliveryTypeSynclet" ) For Each delType In delTypes WScript.Echo "Deployment Name: " & delType.AppDeliveryTypeName & VbCrLf & "AppdeliveryTypeID: " & delType.AppDeliveryTypeId & VbCrLf & "Revision: " & delType.Revision & VbCrLf Next 以仅查看已安装的应用程序。