在我们公司,我们也必须喜欢这一点,并进行了一些基础研究,但目前似乎没有人这样做(并不意味着不可能)。我们还就此与两位 Microsoft SCCM 顾问进行了交谈,均表示目前没有办法。
问题是应用程序都是关于检测方法的。这是唯一会触发设置的东西。因此,如果您有一个软件,并且您不想将其部署为软件包(这仍然是可能的,并且仍然可以使用 Roger Zanders 客户端中心等工具重新运行它们),您可以做的是使用您可以使用的检测方法影响。就像文件或注册密钥一样,您可以远程删除它。应用程序部署评估周期可以像所有其他客户端操作一样远程触发,因此这不是问题。
遗憾的是,这只是一种解决方法,如果有人证明我错了,我非常希望,但到目前为止,这是我们能想到的最好的方法。
编辑:
所以你激励我更深入地挖掘,我还从微软那里得到了一些非常好的幻灯片,我找到了一些可能的方法:
由于该应用程序一直都是关于检测的,所以我的想法是伪造它。
据我所知,检测方法以某种疯狂的 xml 格式保存在 WMI 中的 root\ccm\CIModels 类 Local_Detect_Synclet 中。所以我写了一个脚本去那里并将检测方法替换为检查文件的空检测方法。它没有属性,所以它永远无法工作。之后,我使用同一命名空间中的 CCM_AppDeliveryType 类在我的应用程序上调用强制方法。它需要一个 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 以仅查看已安装的应用程序。