C# SCCM - 客户端操作

C# SCCM - Client Action

我在 powershell 中见过很多强制计算机从配置管理器执行客户端操作的方法。

在我工作的地方,这是不可能的,因为我们无法在远程计算机上调用命令,因为它被阻止并且高级 IT 不想解锁它。

我确实在 c# 中找到了一个库,它允许我在 sccm 中执行一些操作:

我可以 add/remove 计算机到一个集合,进行查询并获取数据,但我没有找到强制计算机从配置管理器执行操作的方法。

这里有人知道这是否可行以及如何实现吗?

谢谢。

编辑 1:在 MSDN 文档中搜索时,我确实找到了 TriggerSchedule Method in Class SMS_Client,但我没有找到正确使用它的方法。我认为这可能是要走的路,但我仍然坚持这一点。

可以像这样通过 TriggerSchedule 触发机器策略更新

    ManagementScope scope = new ManagementScope(@"\.\root\ccm");
    ManagementClass cls = new ManagementClass(scope.Path.Path, "SMS_Client", null);

    ManagementBaseObject inParams = cls.GetMethodParameters("TriggerSchedule");
    inParams["sScheduleID"] = "{00000000-0000-0000-0000-000000000021}";

    ManagementBaseObject outMPParams = cls.InvokeMethod("TriggerSchedule", inParams, null);

您已经在您发布的 link 中找到了 sScheduleID 的其他参数。这使用标准 WMI。使用 WqlQueryEngine,您可以访问一些基本上可以做同样事情的 WMI 包装器。然而,我没有看到太多优势。

像这样使用范围

\.\root\ccm

使整个事情只在本地工作,如果我理解正确的话,这就是你想要的。否则更换 .使用主机名或 IP 可以使其远程工作。我唯一觉得有点奇怪的是它需要管理权限,理论上应该不需要策略更新请求。

如果有人遇到没有任何反应的问题,那是因为 WMI 需要更高的权限。为了让用户也能触发操作,我转而使用 CPApplet:

TriggerSccmActions("Request & Evaluate", true);


private static List<string> TriggerSccmActions(string stringActions, bool boolContains)
        {
            List<string> actionName = new List<string>();

        try { 
            const string ProgID = "CPApplet.CPAppletMgr";

            Type foo = Type.GetTypeFromProgID(ProgID);

            dynamic COMobject = Activator.CreateInstance(foo);

            var oClientActions = COMobject.GetClientActions;

            foreach (var oClientAction in oClientActions)
            {
                if (oClientAction.Name.ToString().Contains(stringActions) && boolContains)
                {
                    var result = oClientAction.PerformAction();
                    actionName.Add(oClientAction.Name.ToString());
                }
                else if (!(oClientAction.Name.ToString().Contains(stringActions)) && !(boolContains))
                {
                    var result = oClientAction.PerformAction();
                    actionName.Add(oClientAction.Name.ToString());
                }
            }

        } catch(Exception e)
        {
            actionName.Add("Error: " + e.Message.ToString());
        }

        return actionName;

    }

对我来说,EvaluateMachinePolicy Class SMS_Client class 中的方法有效。这是代码:

public static void RefreshMachinePolicy(string machineName)
{
    ManagementScope scope = new ManagementScope(string.Format(@"\{0}\root\ccm", machineName));
    ManagementClass cls = new ManagementClass(scope.Path.Path, "SMS_Client", null);
    ManagementBaseObject inParams = cls.GetMethodParameters("EvaluateMachinePolicy");
    ManagementBaseObject outMPParams = cls.InvokeMethod("EvaluateMachinePolicy", inParams, null);
    Console.WriteLine("Policy refreshed successfully by EvaluateMachinePolicy method");
}

这里是方法详细信息的 MSDN link。请在源代码文件的顶部包含以下命名空间:

using System.Management;