通过 REST 管理服务在 SMS_Collection 上执行 AddMembershipRule

Executing AddMembershipRule on SMS_Collection through REST Admin Service

我们正在尝试使用管理服务的 REST API 来管理配置管理器 (What is the administration service in Configuration Manager?)

我们已经成功查询了不同类型的实体并执行了一些自定义静态方法(即MoveMembers Method on SMS_ObjectContainerItem)。由于几乎没有任何文档,所以大部分都是盲目拍摄,但这些基本功能似乎工作正常。

现在我们碰壁了,试图将收集规则添加到 SMS_Collection(现有的或新的)。这通常是在实例本身上调用 AddMembershipRule 完成的,该实例之前由例如WqlConnectionManager 或其他一些代理。但是,对于从 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; }
    }

我也曾尝试 Post 一个现有的或新的集合,并预先填充 CollectionRules,但这最终会出现一个异常,抱怨 IncludeCollectionID 不是 [=19 的一部分=] (base class) - 看起来验证过于严格并且不能很好地处理继承。

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

同样,似乎没有办法 add/remove 应用程序或打包 import/export 它们,使用管理服务,甚至以上述方式。