【问题标题】:.NET WMI SCCM Application Install (remotel).NET WMI SCCM 应用程序安装(远程)
【发布时间】:2018-03-22 15:28:52
【问题描述】:

我正在尝试让 SCCM 应用程序通过 .Net 应用程序的 WMI 查询远程安装/卸载。

我的代码如下:

    Dim wmiLoc As ManagementScope = New ManagementScope("\\" & Target & "\root\ccm\ClientSDK", Options)
    Dim wmiProcPath As ManagementPath = New ManagementPath("CCM_Application")
    Dim mc As ManagementClass = New ManagementClass(wmiLoc, wmiProcPath, Nothing)
    Dim inParams As ManagementBaseObject = mc.GetMethodParameters("Install")

    inParams("EnforcePreference") = "0"
    inParams("Id") = ThisID
    inParams("IsMachineTarget") = ThisIMT
    inParams("IsRebootIfNeeded") = "False"
    inParams("Priority") = "High"
    inParams("Revision") = ThisRev

    Dim outParams As ManagementBaseObject = mc.InvokeMethod("Install", inParams, Nothing)
    Console.WriteLine("Job Id: {0}, Return: {1}", outParams("JobId"), outParams("ReturnValue"))

我想你可以假设 Rev#、ID 和 IsMachineTarget 是正确的,因为我是从我之前从机器查询的信息中提取它们的。

** 当我将此特定请求发送到机器时,它仅将其记录到 CCM/Logs AppDiscovery 中。它分 4 行显示:它收到了请求(不是专门用于卸载,而是查询)、执行检测、发现的应用程序和检测到的应用程序部署。

在它记录这个之后,它什么也不做。就好像它没有得到它的“卸载”或“安装”部分。 **

谁有处理这个问题的经验?我知道还有其他解决方案,但我正在尝试自己工作。我可能可以通过 powershell 做到这一点,但如果可能的话,我宁愿不这样做。

【问题讨论】:

  • 据我所知,应用程序的全部意义在于安装完全基于对检测方法的评估。 Atm 无法强制安装,如果检测到它将永远不会安装(用户语音请求更改此设置,但状态为“已计划”)
  • 我不确定我理解你的意思。如果严格来说“可用”应用程序,您可以通过 WMI 通过 powershell 执行此操作。你提到如果它被检测到它永远不会被安装?在“发现”中检测到?
  • 啊,好吧,我误解了你的意图。我说的是使用“检测方法”应用程序来确定安装是否成功。如果需要应用程序,这是确定是否在第一次安装之前安装它的唯一检查,但对于可用的应用程序,这是不正确的。如果你让它在 ps 中与 wmi 一起使用,但是我看不出这在 C# 中也不起作用,那么 wmi 的使用应该没有区别。人们有时会使用 sccm 的包装类,但正常的 wmi 实现应该仍然有效

标签: .net wmi wmi-query sccm


【解决方案1】:

我最终得到了这个工作。我有一个生产应用程序,可以帮助我加快服务器场上的 Windows 更新。其中一部分是重试应用程序和更新安装。

using (var searcher = new ManagementObjectSearcher(string.Format(@"\\{0}\root\CCM\ClientSDK", strComputerName, "SELECT * FROM CCM_Application"))
foreach (var obj in searcher.Get())
    if (((string)obj["Name"]).Equals(strApplicationName))
        using (var mInv = new ManagementClass(string.Format(@"\\{0}\root\CCM\ClientSDK", strComputerName), "CCM_Application", null))
        {
            ManagementBaseObject inParams = mInv.GetMethodParameters("Install");
            inParams["EnforcePreference"] = (uint)0;
            inParams["Id"] = obj["Id"];
            inParams["IsMachineTarget"] = obj["IsMachineTarget"];
            inParams["IsRebootIfNeeded"] = false;
            inParams["Revision"] = obj["Revision"];
            mInv.InvokeMethod("Install", inParams, null);
        }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-10-22
    • 1970-01-01
    • 2020-01-24
    • 2011-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多