c# - 通过 REST 管理服务在 SMS_Collection 上执行 AddMembershipRule
问题描述
我们正在尝试使用管理服务的 REST API 来管理配置管理器(配置管理器中的管理服务是什么?)
我们已经成功地查询了不同类型的实体并执行了一些自定义的静态方法(即SMS_ObjectContainerItem 上的 MoveMembers 方法)。由于几乎没有任何文档,因此大部分都是盲目的镜头,但是这些基本功能似乎可以正常工作。
现在我们已经碰壁了,尝试将收集规则添加到 SMS_Collection(现有的或新的)。这通常是在实例本身上调用AddMembershipRule完成的,该实例之前由 egWqlConnectionManager
或其他一些代理获取。但是,对于从 REST 服务获取的普通对象,这显然是不可行的。
我们尝试使用 wmi OData 服务(通过生成的代理),因为它显然提供了类似的功能,但这最终会出现“不支持的异常”:
var savedCollection = Proxy.SMS_Collection.Where(c => c.CollectionID == result.CollectionID).FirstOrDefault();
savedCollection.AddMembershipRule(inclusionRule);
Proxy.UpdateObject(savedCollection);
Proxy.SaveChanges(); //EXCEPTION
我尝试过以多种方式运行 POST 请求,使用以下网址:
SMS_Collection.AddMembershipRule?CollectionID=DV000037 -> 404
SMS_Collection/DV000037/AddMembershipRule -> 404
SMS_Collection.DV000037.AddMembershipRule -> 404
SMS_Collection/DV000037.AddMembershipRule -> treated it as post to SMS_Collection/DV000037, and therefore triggers an update
要不就
SMS_Collection.AddMembershipRule with collectionID as param
至于我使用的请求正文(或只是 AddCollectionMembershipRuleRequestRule):
public class AddCollectionMembershipRuleRequest
{
public AddCollectionMembershipRuleRequestRule CollectionRule { get; set; }
}
public class AddCollectionMembershipRuleRequestRule
{
public string RuleName { get; set; }
public string IncludeCollectionID { get; set; }
}
我也尝试过发布一个现有的或新的集合,并CollectionRules
预先填充,但这最终会出现一个异常,抱怨IncludeCollectionID
不是CollectionRule
(基类)的一部分 - 看起来验证过于严格并且不能很好地处理继承。
var collectionRequest = new ECMCollectionCreationRequest()
{
Name = collectionName,
CollectionType = 2,
RefreshType = 4,
LimitToCollectionID = DefaultLimitingCollectionID,
CollectionRules = new List<SMS_CollectionRule>()
{
new SMS_CollectionRuleIncludeCollection()
{
RuleName = "MembershipRule",
IncludeCollectionID = "DV100020"
}
}
};
尽管如此,这些都没有运气。您是否知道 Rest /OData 服务是否支持这种场景(修改 CollectionRules)?如果是这样,实现这一目标的正确方法是什么?
解决方案
看起来这部分目前根本不支持。查看代码,服务似乎没有正确解释参数,因此导致验证问题。
但是,使用 ManagementScope 和 ManagementObject 可以实现同样的效果,但方式不那么简洁和结构化
var scope = new ManagementScope(siteAddress);
scope.Connect();
using (ManagementObject collection = new ManagementObject(scope, new ManagementPath($"SMS_Collection.CollectionID='{collectionID}'"), new ObjectGetOptions()))
{
if (collection == null)
throw new Exception($"Unable to find collection with ID '{collectionID}'");
collection.Get();
using (ManagementBaseObject inParams = collection.GetMethodParameters("AddMembershipRule"))
using (ManagementClass ruleClass = new ManagementClass(scope, new ManagementPath("SMS_CollectionRuleDirect"), new ObjectGetOptions()))
using (ManagementObject rule = ruleClass.CreateInstance())
{
rule["ResourceClassName"] = "SMS_R_System";
rule["ResourceID"] = ecmResourceID;
rule["RuleName"] = machineName;
inParams["collectionRule"] = rule;
collection.InvokeMethod("AddMembershipRule", inParams, null);
}
}
可以以类似的方式添加和删除所有其他规则类型。
另一种选择当然是使用 PowerShell。Sill,我希望在管理服务的下一次迭代中,将添加对这些方法的支持。
同样,似乎没有办法添加/删除应用程序或包并导入/导出它们,使用管理服务甚至以上述方式。
推荐阅读
- rasa-core - RASA pip 安装失败:多个要求不兼容
- r - 在R中从长格式转换为对称方形宽格式
- c++ - 我希望这个 c++ 程序找到以用户输入的字母开头的单词并使用新函数打印它们
- flutter - pubspec.yaml 第 24 行第 5 列出错:版本约束必须是字符串
- php - php代码执行后如何排除/删除输入。?
- django - TypeError:“_Serializer”类型的对象不是 JSON 可序列化的
- swagger - 如何从整数属性的 swagger 定义中删除 dataType“int32”
- android - 具有父宽度 50% 的两个项目的回收站视图(水平)
- sql - Calcite 查询从表中选择给定百分比的数据
- java - 创建名为“entityManagerFactory”的bean时出错:java.lang.NoSuchMethodError: javax.persistence.Table.indexes()