【问题标题】:Is there a way to reinstall an application in SCCM 2012?有没有办法在 SCCM 2012 中重新安装应用程序?
【发布时间】:2015-05-11 02:35:39
【问题描述】:

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

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

我以为我可以为此编写一个程序,并创建我自己的“右键单击工具”,但我找不到任何信息我究竟应该做什么?

所以我的问题是:
- 有没有可以重新安装应用程序的右键工具?
- 是否有一些文档,我可以从哪里获得有关此问题的一些信息?

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

提前致谢!

【问题讨论】:

    标签: software-distribution configurationmanager sccm


    【解决方案1】:

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

    【讨论】:

    • 按照微软的说法,很多事情是不可能的。但后来有人来了,证明他们错了。我想到了您描述的这种方法,我也认为这是唯一的解决方案。尽管这并不是我想要的。我 100% 确定有解决方案。 (一定不容易,但我相信有)
    • 是的,我认为有朝一日会成为可能。但是我有点担心,即使在新的 SCCM2012 客户中心也没有它的选项。这个工具几乎可以做所有与 SCCM 相关的事情,所以它可能真的很难。如果我发现比我提议的更好的东西,我当然会在这里更新我的帖子。
    • 谢谢,如果我发现了什么,我会更新我的帖子。
    • @Syberdoor 的建议似乎是在正确的轨道上。我可能会稍有不同:让原始应用程序的安装程序创建一个标志(例如文件C:\app-ok.flg)。然后创建另一个“应用程序”,它实际上是一个脚本,用于卸载有问题的应用程序并使其检测依赖于C:\app-ok.flg) 的存在。然后你只需从受影响的机器上删除C:\app-ok.flg 并让 AppEnforce 循环应用卸载应用程序,然后应用安装应用程序。
    • 好吧,我找到了一些办法。它并不完美,但它看起来是一种很有前途的方法,所以我相应地更新了我的帖子
    猜你喜欢
    • 2023-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多