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

Is there a way to reinstall an application in SCCM 2012?

在 SCCM 2007 中,有几个 "Right Click Tools",在他们的帮助下,可以 "reinstall" 一个包。在 SCCM 2012 中我仍然找不到方法,我该如何重新安装应用程序?

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

我以为我可以为此编写一个程序,然后创建我自己的 "Right Click Tool",但我找不到任何信息,我究竟应该怎么做?

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

我敢肯定,很多其他人也有同样的问题。 还是我没找到办法,因为有none? :(

提前致谢!

在我们公司,我们也必须喜欢这个并进行一些基础研究,但到目前为止似乎还没有人这样做(并不意味着这不可能)。我们也跟微软的两位SCCM顾问谈过,都说目前没有办法。

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

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

编辑: 所以你激励我更深入地挖掘,我也从微软那里得到了一些非常好的幻灯片,我找到了一些可能的方法:

由于该应用程序始终与检测有关,所以我的想法是伪造它。

据我所知,检测方法在 Class Local_Detect_Synclet 中的 root\ccm\CIModels 中的 WMI 中以某种疯狂的 xml 格式保存。所以我写了一个脚本,用一个检查文件的空检测方法替换检测方法。它没有属性,因此永远无法工作。之后,我使用同一命名空间中的 class CCM_AppDeliveryType 在我的应用程序上调用 enforce 方法。它需要一个 AppdeliveryTypeID 和当前版本,但这两者都可以在 CCM_AppDeliveryTypeSynclet 中看到。在 enforce 重新安装程序后,我将检测方法重置为旧方法并触发第二次 enforce,除了告诉系统正确检测到该应用程序外什么都不做。执行所有这些操作的 Vbscript 如下所示:

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

ExpressionXML 太长了,但我通过反复试验似乎可能删除了所有内容。

为简单起见,我对 AppdeliveryTypeID 和修订版进行了硬编码,但您可以通过以下查询获得这些列表,包括好听的名称:

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

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

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

这甚至适用于未安装的应用程序,类似于重新运行软件包。如果您不想这样做,您可以检查 CCM_AppDeliveryType 以仅查看已安装的应用程序。