在我们公司,我们也必须喜欢这一点并做了一些基础研究,但到目前为止似乎没有人这样做过(并不意味着这是不可能的)。我们也和微软的两位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
仅查看已安装的应用程序。