c# 为 SCCM 2012 创建直接成员资格规则

c# to create direct membership rules for SCCM 2012

我正在尝试构建一个 C# 应用程序,提供我们全球一级支持团队使用的最常见的 SCCM 2012 函数。

因此,最重要的功能之一是将计算机 (resourceID) 作为 DirectMembershipRule 添加到集合中。

我已经用 Powershell 做了类似的事情,还创建了一个 GUI。但是由于多重威胁和 GUI 使 "script" 越来越不稳定,我想继续使用 DotNet 应用程序。 不幸的是,我在 C# 方面一点经验都没有。虽然我已经可以设法从我们的 SQL 数据库中读取并收集集合名称、集合的计算机和其他信息。

添加到集合似乎是通过 WMI 方法最可靠,但我完全卡住了。我设法从我们的服务器接收 WMI 数据,如 Bios 信息或磁盘信息,但无法触发为成员资格规则创建新实例的方法。

我很乐意在这里得到一些帮助。 :-)

没有太多可找到的内容,但如果您查看 this example,则有第二部分以注释 "Add to All System collection." 开头,这基本上解释了这一点。您需要的是系统中心配置管理器控制台文件夹中的两个 dll,AdminUI.WQLQueryengine.dll 和 Microsoft.ConfigurationManagement.Managementprovider.dll。有了这些,您基本上可以编写几乎与可以找到的 VBS 的许多 WMI 示例完全一样的代码。它看起来像这样:

using Microsoft.ConfigurationManagement.ManagementProvider;
using Microsoft.ConfigurationManagement.ManagementProvider.WqlQueryEngine;

 SmsNamedValuesDictionary namedValues = new SmsNamedValuesDictionary();
 using (WqlConnectionManager connection = new WqlConnectionManager(namedValues)) {
    connection.Connect("<site server>");
    IResultObject collection = connection.GetInstance("SMS_Collection.collectionId='<CollectionID>'");

    IResultObject collectionRule = connection.CreateEmbeddedObjectInstance("SMS_CollectionRuleDirect");
    collectionRule["ResourceClassName"].StringValue = "SMS_R_System";
    collectionRule["ResourceID"].IntegerValue = <ResourceID>;

    Dictionary<string, object> inParams = new Dictionary<string, object>();
    inParams.Add("collectionRule", collectionRule);
    collection.ExecuteMethod("AddMembershipRule", inParams);
}

Imo 这基本上也可以在没有这些 dll 帮助的情况下通过 "normal" WMI 调用来实现,但因为这是在 MS 示例中完成的方式,所以我总是假设有某种优势并以这种方式完成.