Jak utworzyć kolekcję dynamiczną

W Configuration Manager aplikacja używa klasy WMI serwera SMS_Collection do definiowania atrybutów kolekcji, takich jak reguły członkostwa i harmonogram odświeżania. Właściwość MemberClassName zawiera nazwę klasy wygenerowaną przez system, która zawiera elementy członkowskie kolekcji.

Elementy członkowskie kolekcji są określane przy użyciu reguł bezpośrednich, reguł zapytań lub obu tych elementów. Reguły bezpośrednie definiują jawny zasób, natomiast reguły zapytań definiują kolekcję dynamiczną, która jest regularnie oceniana na podstawie bieżącego stanu witryny.

Uwaga

Podczas tworzenia reguły członkostwa bezpośredniego należy pamiętać, że reguła musi zawsze mieć taką samą nazwę jak komputer określony przez regułę.

Aplikacja używa klasy WMI serwera SMS_CollectionRuleQuery do definiowania reguł zapytań. Zapytanie musi być prawidłowe i może określić kolekcję zawierającą zasoby, takie jak "Wszyscy użytkownicy w domenie firmowej". Następnie aplikacja może użyć zapytania, aby upewnić się, że program jest przeznaczony do dystrybucji oprogramowania na wszystkich komputerach spełniających kryteria. Po zmianie witryny i ponownym obliczeniu kolekcji elementy członkowskie kolekcji są automatycznie dodawane i usuwane.

Uwaga

Podczas uruchamiania zapytania względem kolekcji dynamicznej upewnij się, że dostawca programu SMS został załadowany lub że została już uruchomiona inna metoda lub zapytanie.

Kolekcje są ściśle powiązane z pakietami, programami i anonsami. Aby uzyskać więcej informacji, zobacz Omówienie dystrybucji oprogramowania.

Te przykłady wymagają następujących wartości:

  • Obiekt połączenia instrumentacji zarządzania windows (WMI).

  • Nowa nazwa kolekcji dynamicznej.

  • Nowy dynamiczny komentarz kolekcji.

  • Flaga "należąca do tej witryny".

  • Zapytanie (ciąg).

  • Nazwa reguły statycznej.

  • Identyfikator kolekcji w celu ograniczenia zakresu członkostwa.

Uwaga

Jeśli kolekcja Wszystkie systemy (SMS00001) została usunięta z serwera lokacji, przykład VBScript nie działa.

Przykład wywołania podprocedury w języku Visual Basic:

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

Przykład wywołania metody w języku C#:

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

Aby utworzyć kolekcję dynamiczną

  1. Skonfiguruj połączenie z dostawcą programu SMS. Aby uzyskać więcej informacji, zobacz Podstawy dostawcy programu SMS.

  2. Utwórz nowy obiekt kolekcji przy użyciu klasy WMI serwera SMS_Collection.

  3. Utwórz regułę przy użyciu klasy WMI serwera SMS_CollectionRuleQuery .

  4. Dodaj regułę do kolekcji.

  5. Odśwież kolekcję.

Przykład

Poniższa przykładowa metoda tworzy kolekcję dynamiczną przy użyciu klasy WMI serwera SMS_Collection oraz klas i właściwości klasy WMI serwera SMS_CollectionRuleQuery Server .

Aby uzyskać informacje na temat wywoływania przykładowego kodu, zobacz Wywoływanie fragmentów kodu 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;    }}   

Przykładowa metoda ma następujące parametry:

Parametr Wpisać Opis
connection -Zarządzane: WqlConnectionManager
- VBScript: SWbemServices
Prawidłowe połączenie z dostawcą programu SMS.
newCollectionName -Zarządzane: String
-Vbscript: String
Unikatowa nazwa reprezentująca kolekcję w konsoli Configuration Manager.
newCollectionComment -Zarządzane: String
-Vbscript: String
Ogólny komentarz lub zwróć uwagę, że dokumentuje kolekcję.
ownedByThisSite -Zarządzane: Boolean
-Vbscript: Boolean
truejeśli kolekcja pochodzi z lokalnej witryny Configuration Manager.
query -Zarządzane: String
-Vbscript: String
Instrukcja SELECT języka WQL zawierająca wyniki, które są używane do wypełniania kolekcji. Instrukcja musi określać nazwę klasy zasobów.
ruleName -Zarządzane: String
-Vbscript: String
Opisowa nazwa identyfikująca regułę.
limitToCollectionID -Zarządzane: String
-Vbscript: String
Identyfikator kolekcji w celu ograniczenia zakresu członkostwa.

Kompilowanie kodu

Przykład języka C# wymaga:

Obszary nazw

System

System.collections.generic

System.componentmodel

Microsoft. ConfigurationManagement.ManagementProvider

Microsoft. ConfigurationManagement.ManagementProvider.WqlQueryEngine

Zestawu

adminui.wqlqueryengine

microsoft.configurationmanagement.managementprovider

Niezawodne programowanie

Aby uzyskać więcej informacji na temat obsługi błędów, zobacz Informacje o błędach Configuration Manager.

zabezpieczenia .NET Framework

Aby uzyskać więcej informacji na temat zabezpieczania aplikacji Configuration Manager, zobacz Configuration Manager administracja oparta na rolach.

Zobacz też

SMS_Collection Server WMI Class
SMS_CollectionRuleQuery Server WMI Class
Omówienie dystrybucji oprogramowaniaomówienieobiektów wdrożeń— jak nawiązać połączenie z dostawcą programu SMS w Configuration Manager przy użyciu kodu zarządzanego
Jak nawiązać połączenie z dostawcą programu SMS w Configuration Manager przy użyciu usługi WMI