在SCCM 2007中,有几个“右键单击工具”,在它们的帮助下,可以“重新安装”软件包。在SCCM 2012中,我仍然找不到方法,如何重新安装应用程序?
让我解释一下:
我从软件创建了一个安装软件包,然后将其作为“应用程序”分发。安装成功完成。一周后,一个用户致电,他在使用此应用程序时遇到了麻烦。我创建的程序包支持重新安装(通过删除软件然后再次安装它或具有修复功能)。但是,在SCCM中,我没有选择(都没有找到可以做到这一点的右键单击工具)来重新安装软件包。我必须将其删除,然后再次安装。
我以为可以为此编写一个程序,并创建自己的“右键单击工具”,但是找不到任何信息该怎么办?
所以我的问题是:
-是否有可以以某种方式重新安装应用程序的右键单击工具?
-是否有一些文档,可以从中获得有关此问题的一些信息?
我敢肯定,许多其他人也有同样的问题。还是我没有找到方法,因为没有方法?:(
提前致谢!
在我们公司中,我们也必须喜欢它并进行了一些基础研究,但到目前为止似乎还没有人做过(并不意味着这是不可能的)。我们还与两位Microsoft SCCM顾问进行了交谈,双方都表示目前没有办法。
问题是应用程序都与检测方法有关。这是唯一会触发设置的事情。因此,如果您有软件,并且不想将其作为软件包进行部署(这仍然可行,并且仍可以使用Roger Zanders客户中心之类的工具重新运行它们),那么您可以做的就是使用一种检测方法影响。就像文件或reg键一样,您可以远程删除它们。就像所有其他客户端操作一样,可以远程触发应用程序部署评估周期,因此这不是问题。
可悲的是,这只是一种解决方法,我非常想如果有人证明我错了,但是到目前为止,这是我们能想到的最好的选择。
编辑:所以您激励我更深入地进行研究,并且我也从Microsoft获得了一些非常好的幻灯片,并且我发现了一些可能的方法:
由于该应用程序始终都在进行检测,因此我的想法是伪造它。
据我所知,检测方法以某种疯狂的xml格式保存在WMIroot\ccm\CIModels
中的Class中Local_Detect_Synclet
。因此,我编写了一个脚本,该脚本在那里将检测方法替换为检查文件的空检测方法。它没有属性,因此永远无法工作。之后,我使用CCM_AppDeliveryType
相同名称空间中的类在应用程序上调用force方法。它需要一个AppdeliveryTypeID和当前版本,但两者都可以在中看到CCM_AppDeliveryTypeSynclet
。强制重新安装程序后,我将检测方法重置为旧的强制方法,并触发了第二个强制,它将什么都不做,只会告诉系统已正确检测到该应用。完成所有这些操作的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 DB本身,查询非常复杂,当然需要一些SCCM管理员来执行它。
与所有WMI脚本一样,您可以通过指定计算机名称来远程执行它,或者如果使用'。',则可以在本地执行它,因此您可以使用SCCM控制台扩展系统并基于此构建自己的右键单击工具。
即使未安装的应用程序(与重新运行软件包一样),这也将起作用。如果您不想这样做,可以检查CCM_AppDeliveryType
以仅查看已安装的应用程序。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句