C# SCCM - 客户端操作
C# SCCM - Client Action
我在 powershell 中见过很多强制计算机从配置管理器执行客户端操作的方法。
在我工作的地方,这是不可能的,因为我们无法在远程计算机上调用命令,因为它被阻止并且高级 IT 不想解锁它。
我确实在 c# 中找到了一个库,它允许我在 sccm 中执行一些操作:
AdminUI.SmsTraceListener.dll
AdminUI.WqlQueryEngine.dll
我可以 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;
我在 powershell 中见过很多强制计算机从配置管理器执行客户端操作的方法。
在我工作的地方,这是不可能的,因为我们无法在远程计算机上调用命令,因为它被阻止并且高级 IT 不想解锁它。
我确实在 c# 中找到了一个库,它允许我在 sccm 中执行一些操作:
AdminUI.SmsTraceListener.dll
AdminUI.WqlQueryEngine.dll
我可以 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;