我在powershell中看到很多方法强制计算机从配置管理器执行客户端操作。
我在哪里工作,这是不可能的,因为我们无法在远程计算机上调用命令,因为它被阻止而高级IT人员不想解锁它。
我确实在c#中找到了一个允许我在sccm中执行某些操作的库:
AdminUI.SmsTraceListener.dll
AdminUI.WqlQueryEngine.dll
我可以在集合中添加/删除计算机,进行查询并获取数据,但我没有找到强制计算机从配置管理器中执行操作的方法。
这里是否有人知道是否可能以及如何?
感谢。
编辑1:在MSDN文档中搜索时,我确实找到了TriggerSchedule Method in Class SMS_Client,但我找不到正确使用它的方法。我认为这可能是要走的路,但我仍然坚持这一点。
答案 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;