Erstellen einer dynamischen Sammlung

In Configuration Manager verwendet Ihre Anwendung die WMI-Klasse SMS_Collection Server, um die Attribute einer Sammlung zu definieren, z. B. die Mitgliedschaftsregeln und den Aktualisierungszeitplan. Die MemberClassName -Eigenschaft enthält den vom System generierten Klassennamen, der die Member der Auflistung enthält.

Elemente einer Auflistung werden mithilfe direkter Regeln, Abfrageregeln oder beides angegeben. Direkte Regeln definieren eine explizite Ressource, während Abfrageregeln eine dynamische Sammlung definieren, die regelmäßig basierend auf dem aktuellen Zustand der Website ausgewertet wird.

Hinweis

Denken Sie beim Erstellen einer Direkten Mitgliedschaftsregel daran, dass die Regel immer denselben Namen wie der Computer haben muss, den die Regel angibt.

Ihre Anwendung verwendet die WMI-Klasse SMS_CollectionRuleQuery Server , um Abfrageregeln zu definieren. Die Abfrage muss gültig sein und kann angeben, dass die Sammlung Ressourcen wie "Alle Benutzer in der Unternehmensdomäne" enthält. Die Anwendung kann dann die Abfrage verwenden, um sicherzustellen, dass ein Programm für die Softwareverteilung an alle Computer vorgesehen ist, die die Kriterien erfüllen. Wenn sich die Website ändert und die Sammlung erneut ausgewertet wird, werden Elemente der Sammlung automatisch hinzugefügt und gelöscht.

Hinweis

Stellen Sie beim Ausführen einer Abfrage für eine dynamische Sammlung sicher, dass der SMS-Anbieter geladen ist oder dass bereits eine andere Methode oder Abfrage ausgeführt wurde.

Sammlungen sind eng an Pakete, Programme und Werbung gebunden. Weitere Informationen finden Sie unter Übersicht über die Softwareverteilung.

Für diese Beispiele sind die folgenden Werte erforderlich:

  • Ein WMI-Verbindungsobjekt (Windows Management Instrumentation).

  • Ein neuer dynamischer Sammlungsname.

  • Ein neuer dynamischer Sammlungskommentar.

  • Das Flag "im Besitz dieser Website".

  • Eine Abfrage (Zeichenfolge).

  • Ein statischer Regelname.

  • Ein Sammlungsbezeichner zum Einschränken des Mitgliedschaftsbereichs.

Hinweis

Wenn die Sammlung Alle Systeme (SMS00001) vom Standortserver entfernt wurde, funktioniert das VBScript-Beispiel nicht.

Beispiel für den Unterroutineaufruf in Visual Basic:

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

Beispiel für den Methodenaufruf in C#:

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

So erstellen Sie eine dynamische Sammlung

  1. Richten Sie eine Verbindung mit dem SMS-Anbieter ein. Weitere Informationen finden Sie unter Grundlagen des SMS-Anbieters.

  2. Erstellen Sie das neue Auflistungsobjekt mithilfe der WMI-Klasse SMS_Collection Server .

  3. Erstellen Sie die Regel mithilfe der WMI-Klasse SMS_CollectionRuleQuery Server .

  4. Fügen Sie der Auflistung die Regel hinzu.

  5. Aktualisieren Sie die Sammlung.

Beispiel

Die folgende Beispielmethode erstellt eine dynamische Auflistung mithilfe der WMI-Klasse des SMS_Collection-Servers und der SMS_CollectionRuleQuery Server-WMI-Klassen und -Klasseneigenschaften.

Informationen zum Aufrufen des Beispielcodes finden Sie unter Aufrufen von Configuration Manager Codeausschnitten.


' 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;    }}   

Die Beispielmethode verfügt über die folgenden Parameter:

Parameter Typ Beschreibung
connection -Verwalteten: WqlConnectionManager
– VBScript: SWbemServices
Eine gültige Verbindung mit dem SMS-Anbieter.
newCollectionName -Verwalteten: String
-Vbscript: String
Der eindeutige Name, der die Auflistung in der Configuration Manager-Konsole darstellt.
newCollectionComment -Verwalteten: String
-Vbscript: String
Allgemeiner Kommentar oder Hinweis, der die Sammlung dokumentiert.
ownedByThisSite -Verwalteten: Boolean
-Vbscript: Boolean
true, wenn die Sammlung auf der lokalen Configuration Manager-Website stammt.
query -Verwalteten: String
-Vbscript: String
WQL SELECT-Anweisung mit Ergebnissen, die zum Auffüllen der Auflistung verwendet werden. Die -Anweisung muss einen Ressourcenklassennamen angeben.
ruleName -Verwalteten: String
-Vbscript: String
Beschreibender Name, der die Regel identifiziert.
limitToCollectionID -Verwalteten: String
-Vbscript: String
Sammlungsbezeichner zum Einschränken des Mitgliedschaftsbereichs.

Kompilieren des Codes

Für das C#-Beispiel ist Folgendes erforderlich:

Namespaces

System

System.Collections.Generic

System.ComponentModel

Microsoft. ConfigurationManagement.ManagementProvider

Microsoft. ConfigurationManagement.ManagementProvider.WqlQueryEngine

Assembly

adminui.wqlqueryengine

microsoft.configurationmanagement.managementprovider

Robuste Programmierung

Weitere Informationen zur Fehlerbehandlung finden Sie unter Informationen zu Configuration Manager Fehlern.

.NET Framework-Sicherheit

Weitere Informationen zum Schützen Configuration Manager Anwendungen finden Sie unter Configuration Manager rollenbasierte Verwaltung.

Siehe auch

WMI-Klasse des SMS_Collection-Servers
WMI-Klasse des SMS_CollectionRuleQuery-Servers
Übersicht über die SoftwareverteilungÜber BereitstellungenObjekte :Herstellen einer Verbindung mit einem SMS-Anbieter in Configuration Manager mithilfe von verwaltetem Code
Herstellen einer Verbindung mit einem SMS-Anbieter in Configuration Manager mithilfe von WMI