Поделиться через


Создание динамической коллекции

В Configuration Manager приложение использует класс WMI сервера SMS_Collection для определения атрибутов коллекции, таких как правила членства и расписание обновления. Свойство MemberClassName содержит имя класса, созданного системой, которое содержит члены коллекции.

Члены коллекции задаются с помощью прямых правил, правил запросов или и того, и другого. Прямые правила определяют явный ресурс, тогда как правила запросов определяют динамическую коллекцию, которая регулярно вычисляется на основе текущего состояния сайта.

Примечание.

При создании правила прямого членства следует помнить, что правило всегда должно иметь то же имя, что и компьютер, на котором указано правило.

Приложение использует класс WMI сервера SMS_CollectionRuleQuery для определения правил запросов. Запрос должен быть допустимым и может указывать коллекцию для хранения ресурсов, например "Все пользователи в корпоративном домене". Затем приложение может использовать запрос, чтобы убедиться, что программа ориентирована на распространение программного обеспечения на все компьютеры, которые соответствуют критериям. По мере изменения сайта и повторной оценки коллекции члены коллекции автоматически добавляются и удаляются.

Примечание.

При выполнении запроса к динамической коллекции убедитесь, что поставщик SMS загружен или что другой метод или запрос уже выполнен.

Коллекции тесно связаны с пакетами, программами и объявлениями. Дополнительные сведения см. в статье Общие сведения о распространении программного обеспечения.

Для этих примеров требуются следующие значения:

  • Объект подключения инструментария управления Windows (WMI).

  • Новое имя динамической коллекции.

  • Новый комментарий к динамической коллекции.

  • Флаг "принадлежит этому сайту".

  • Запрос (строка).

  • Статическое имя правила.

  • Идентификатор коллекции для ограничения области членства.

Примечание.

Если коллекция All Systems (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. Создайте объект коллекции с помощью класса WMI сервера SMS_Collection .

  3. Создайте правило с помощью класса WMI сервера SMS_CollectionRuleQuery .

  4. Добавьте правило в коллекцию.

  5. Обновите коллекцию.

Пример

В следующем примере метод создает динамическую коллекцию с помощью класса WMI SMS_Collection Server и классов и свойств класса WMI сервера SMS_CollectionRuleQuery .

Сведения о вызове примера кода см. в разделе Вызов фрагментов кода 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

Майкрософт. ConfigurationManagement.ManagementProvider

Майкрософт. ConfigurationManagement.ManagementProvider.WqlQueryEngine

Assembly

adminui.wqlqueryengine

microsoft.configurationmanagement.managementprovider

Надежное программирование

Дополнительные сведения об обработке ошибок см. в разделе Сведения об ошибках Configuration Manager.

Безопасность .NET Framework

Дополнительные сведения о защите приложений Configuration Manager см. в статье Configuration Manager администрирование на основе ролей.

См. также

класс WMI сервера SMS_Collection
Класс WMI сервера SMS_CollectionRuleQuery
Обзор распространения программного обеспеченияОбщие сведения об объектах развертыванияКак подключиться к поставщику SMS в Configuration Manager с помощью управляемого кода
Подключение к поставщику SMS в Configuration Manager с помощью WMI