首页 > 解决方案 > 通过 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)?如果是这样,实现这一目标的正确方法是什么?

标签: c#restsccmconfiguration-management

解决方案


看起来这部分目前根本不支持。查看代码,服务似乎没有正确解释参数,因此导致验证问题。

但是,使用 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,我希望在管理服务的下一次迭代中,将添加对这些方法的支持。

同样,似乎没有办法添加/删除应用程序或包并导入/导出它们,使用管理服务甚至以上述方式。


推荐阅读