我试图通过.Net应用程序的WMI查询远程安装/卸载SCCM应用程序。
我的代码如下:
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行显示:它获得了请求(不是专门卸载而是查询),执行检测,发现应用程序和检测到的应用程序部署。
记录完之后,它什么也没做。它几乎就像它没有得到“卸载”#34;或"安装"一部分。 **
任何人都有处理此事的经验吗?我知道还有其他的解决方案,但我试图在自己的工作。我可以通过powershell做到这一点,但如果可能的话,我宁愿不这样做。
答案 0 :(得分:0)
我最终使它开始工作。我有一个生产应用程序,可以帮助我加快服务器场上的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);
}