如何创建动态集合

在 Configuration Manager 中,应用程序使用 SMS_Collection 服务器 WMI 类来定义集合的属性,例如成员身份规则和刷新计划。 属性 MemberClassName 包含系统生成的类名,该类名称包含集合的成员。

使用直接规则和/或查询规则指定集合的成员。 直接规则定义显式资源,而查询规则定义动态集合,该集合根据网站的当前状态定期进行评估。

注意

创建直接成员身份规则时,请记住,该规则必须始终与规则指定的计算机具有相同的名称。

应用程序使用 SMS_CollectionRuleQuery 服务器 WMI 类 类来定义查询规则。 查询必须有效,并且可以指定集合以包含资源,例如“公司域中的所有用户”。然后,应用程序可以使用查询来确保程序的目标是将软件分发到满足条件的所有计算机。 当网站更改并重新评估集合时,将自动添加和删除集合的成员。

注意

针对动态集合运行查询时,请确保已加载 SMS 提供程序,或者其他方法或查询已运行。

集合与包、程序和播发密切相关。 有关详细信息,请参阅 软件分发概述

这些示例需要以下值:

  • Windows Management Instrumentation (WMI) 连接对象。

  • 新的动态集合名称。

  • 新的动态集合注释。

  • “此网站拥有”标志。

  • 查询 (字符串) 。

  • 静态规则名称。

  • 用于限制成员资格范围的集合标识符。

注意

如果已从站点服务器中删除所有系统 (SMS00001) 集合,则 VBScript 示例不起作用。

Visual Basic 中的子例程调用示例:

Call CreateDynamicCollection(swbemconnection, "New Dynamic Collection Name", "New dynamic collection comment.", true, "SELECT * from SMS_R_System", "New Rule Name", "SMS00001")  

C# 中方法调用的示例:

CreateDynamicCollection(WMIConnection, "New Dynamic Collection Name", "New dynamic collection comment.", true, "SELECT * from SMS_R_System", "New Rule Name", "SMS00001")  

创建动态集合

  1. 设置与 SMS 提供程序的连接。 有关详细信息,请参阅 SMS 提供程序基础知识

  2. 使用 SMS_Collection 服务器 WMI 类 类创建新的集合对象。

  3. 使用 SMS_CollectionRuleQuery 服务器 WMI 类 类创建规则。

  4. 将规则添加到集合。

  5. 刷新集合。

示例

以下示例方法使用 SMS_Collection 服务器 WMI 类和SMS_CollectionRuleQuery服务器 WMI 类和类属性创建动态集合。

有关调用示例代码的信息,请参阅调用Configuration Manager代码片段


' Setup a connection to the local provider.  
Set swbemLocator = CreateObject("WbemScripting.SWbemLocator")  
Set swbemconnection= swbemLocator.ConnectServer(".", "root\sms")  
Set providerLoc = swbemconnection.InstancesOf("SMS_ProviderLocation")  

For Each Location In providerLoc  
    If location.ProviderForLocalSite = True Then  
        Set swbemconnection = swbemLocator.ConnectServer(Location.Machine, "root\sms\site_" + Location.SiteCode)  
        Exit For  
    End If  
Next  

Call CreateDynamicCollection(swbemconnection, "New Dynamic Collection Name", "New dynamic collection comment.", true, "SELECT * from SMS_R_System", "New Rule Name", "SMS00001")  

Sub CreateDynamicCollection(connection, newCollectionName, newCollectionComment, ownedByThisSite, queryForRule, ruleName, limitToCollectionID)  

    ' Create the collection.  
    Set newCollection = connection.Get("SMS_Collection").SpawnInstance_  
    newCollection.Name = newCollectionName  
    newCollection.Comment = newCollectionComment  
    newCollection.OwnedByThisSite = ownedByThisSite  
    newCollection.LimitToCollectionID = limitToCollectionID  

    ' Save the new collection and save the collection path for later.  
    Set collectionPath = newCollection.Put_      

    ' Create a new collection rule object for validation.  
    Set queryRule = connection.Get("SMS_CollectionRuleQuery")  

    ' Validate the query (good practice before adding it to the collection).   
    validQuery = queryRule.ValidateQuery(queryForRule)  

    ' Continue with processing, if the query is valid.  
    If validQuery Then  

        ' Create the query rule.  
        Set newQueryRule = QueryRule.SpawnInstance_  
        newQueryRule.QueryExpression = queryForRule  
        newQueryRule.RuleName = ruleName  

        ' Add the new query rule to a variable.  
        Set newCollectionRule = newQueryRule  

        ' Get the collection.  
        Set newCollection = connection.Get(collectionPath.RelPath)  

        ' Add the rules to the collection.  
        newCollection.AddMembershipRule newCollectionRule  

        ' Call RequestRefresh to initiate the collection evaluator.  
        newCollection.RequestRefresh False  

    End If  

End Sub  
public void CreateDynamicCollection(WqlConnectionManager connection, string newCollectionName, string newCollectionComment, bool ownedByThisSite, string query, string ruleName, string LimitToCollectionID){    try    {        // Create new SMS_Collection object.        IResultObject newCollection = connection.CreateInstance("SMS_Collection");        // Populate the new collection object properties.        newCollection["Name"].StringValue = newCollectionName;        newCollection["Comment"].StringValue = newCollectionComment;        newCollection["OwnedByThisSite"].BooleanValue = ownedByThisSite;        newCollection["LimitToCollectionID"].StringValue = LimitToCollectionID;        // Save the new collection object and properties.        // In this case, it seems necessary to 'get' the object again to access the properties.        newCollection.Put();        newCollection.Get();        // Validate the query.        Dictionary<string, object> validateQueryParameters = new Dictionary<string, object>();        validateQueryParameters.Add("WQLQuery", query);        IResultObject result = connection.ExecuteMethod("SMS_CollectionRuleQuery", "ValidateQuery", validateQueryParameters);        // Create query rule.        IResultObject newQueryRule = connection.CreateInstance("SMS_CollectionRuleQuery");        newQueryRule["QueryExpression"].StringValue = query;        newQueryRule["RuleName"].StringValue = ruleName;        // Add the rule. Although not used in this sample, QueryID contains the query identifier.                           Dictionary<string, object> addMembershipRuleParameters = new Dictionary<string, object>();        addMembershipRuleParameters.Add("collectionRule", newQueryRule);        IResultObject queryID = newCollection.ExecuteMethod("AddMembershipRule", addMembershipRuleParameters);        // Start collection evaluator.        newCollection.ExecuteMethod("RequestRefresh", null);        Console.WriteLine("Created collection: " + newCollectionName);    }    catch (SmsException ex)    {        Console.WriteLine("Failed to create collection. Error: " + ex.Message);        throw;    }}   

示例方法具有以下参数:

参数 类型 说明
connection -管理: WqlConnectionManager
- VBScript: SWbemServices
与 SMS 提供程序的有效连接。
newCollectionName -管理: String
- VBScript: String
表示Configuration Manager控制台中集合的唯一名称。
newCollectionComment -管理: String
- VBScript: String
记录集合的一般注释或注意。
ownedByThisSite -管理: Boolean
- VBScript: Boolean
true如果集合源自本地Configuration Manager站点,则为 。
query -管理: String
- VBScript: String
具有用于填充集合的结果的 WQL SELECT 语句。 语句必须指定资源类名称。
ruleName -管理: String
- VBScript: String
标识规则的描述性名称。
limitToCollectionID -管理: String
- VBScript: String
用于限制成员资格范围的集合标识符。

编译代码

C# 示例需要:

命名空间

System

System.Collections.Generic

System.ComponentModel

Microsoft。ConfigurationManagement.ManagementProvider

Microsoft。ConfigurationManagement.ManagementProvider.WqlQueryEngine

Assembly

adminui.wqlqueryengine

microsoft.configurationmanagement.managementprovider

可靠编程

有关错误处理的详细信息,请参阅关于Configuration Manager错误

.NET Framework 安全性

有关保护Configuration Manager应用程序的详细信息,请参阅Configuration Manager基于角色的管理

另请参阅

SMS_Collection服务器 WMI 类
SMS_CollectionRuleQuery 服务器 WMI 类
软件分发概述关于部署对象概述如何使用托管代码在 Configuration Manager 中连接到 SMS 提供程序
如何使用 WMI 连接到 Configuration Manager 中的短信提供程序