C#SCCM - 客户行动

时间:2018-02-15 13:10:42

标签: c# sccm

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

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

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

  • AdminUI.SmsTraceListener.dll

  • AdminUI.WqlQueryEngine.dll

我可以在集合中添加/删除计算机,进行查询并获取数据,但我没有找到强制计算机从配置管理器中执行操作的方法。

这里是否有人知道是否可能以及如何?

感谢。

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

3 个答案:

答案 0 :(得分:2)

可以通过TriggerSchedule触发机器策略更新,如此

from PIL import Image, ImageTk
try:                        # In order to be able to import tkinter for
    import tkinter as tk    # either in python 2 or in python 3
except ImportError:
    import Tkinter as tk


if __name__ == '__main__':
    root = tk.Tk()
    frame = tk.Frame(root, width=320, height=180, bg='#f48024')
    img = Image.new('RGB', (640, 360), color=(0, 121, 152))
    frame.image = ImageTk.PhotoImage(img)
    frame_s_label = tk.Label(frame, image=frame.image)
    button = tk.Button(frame, text="Button")
    button.place(relx=.5, rely=.5, anchor='center')

    frame.grid()
    #frame.grid_propagate(False) # uncomment if children use pack
    frame.pack_propagate(False) # uncomment if children use grid
    frame_s_label.pack()
    tk.mainloop()

您已在发布的链接中找到sScheduleID的其他参数。这使用标准WMI。使用WqlQueryEngine,您可以访问一些基本上可以执行相同操作的WMI包装器。但是,我没有看到很多优点。

使用像这样的范围

    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);
如果我理解正确的话,

使整个事情只在本地工作,这就是你想要的。否则更换。使用主机名或IP可以使其远程工作。我发现有点奇怪的是它需要管理权限,理论上这对于策略更新请求来说并不是必需的。

答案 1 :(得分:0)

如果有人遇到什么都没发生的问题,那是因为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;

    }

答案 2 :(得分:0)

对我来说,EvaluateMachinePolicy 类中的 SMS_Client 类方法有效。代码如下:

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;
相关问题