通过 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 它们,使用管理服务,甚至以上述方式。
我们正在尝试使用管理服务的 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 它们,使用管理服务,甚至以上述方式。