Compartir a través de


Creación de una colección dinámica

En Configuration Manager, la aplicación usa la clase WMI de servidor SMS_Collection para definir los atributos de una colección, como las reglas de pertenencia y la programación de actualización. La MemberClassName propiedad contiene el nombre de clase generado por el sistema que contiene los miembros de la colección.

Los miembros de una colección se especifican mediante reglas directas, reglas de consulta o ambas. Las reglas directas definen un recurso explícito, mientras que las reglas de consulta definen una colección dinámica que se evalúa periódicamente en función del estado actual del sitio.

Nota:

Al crear una regla de pertenencia directa, recuerde que la regla siempre debe tener el mismo nombre que el equipo especificado por la regla.

La aplicación usa la clase WMI SMS_CollectionRuleQuery Server para definir reglas de consulta. La consulta debe ser válida y puede especificar la colección para que contenga recursos como "Todos los usuarios del dominio corporativo". A continuación, la aplicación puede usar la consulta para asegurarse de que un programa está destinado a la distribución de software a todos los equipos que cumplen los criterios. A medida que cambia el sitio y se vuelve a evaluar la colección, los miembros de la colección se agregan y eliminan automáticamente.

Nota:

Al ejecutar una consulta en una colección dinámica, asegúrese de que el proveedor de SMS está cargado o de que ya se ha ejecutado otro método o consulta.

Las colecciones están estrechamente vinculadas a paquetes, programas y anuncios. Para obtener más información, consulte Introducción a la distribución de software.

Estos ejemplos requieren los siguientes valores:

  • Objeto de conexión de Instrumental de administración de Windows (WMI).

  • Un nuevo nombre de colección dinámica.

  • Un nuevo comentario de colección dinámica.

  • Marca "propiedad de este sitio".

  • Una consulta (cadena).

  • Nombre de regla estática.

  • Identificador de colección para limitar el ámbito de pertenencia.

Nota:

Si la colección Todos los sistemas (SMS00001) se ha quitado del servidor de sitio, el ejemplo de VBScript no funciona.

Ejemplo de la llamada a la subrutina en Visual Basic:

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

Ejemplo de la llamada al método en C#:

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

Para crear una colección dinámica

  1. Configure una conexión con el proveedor de SMS. Para obtener más información, consulte Aspectos básicos del proveedor de SMS.

  2. Cree el nuevo objeto de colección mediante la clase WMI SMS_Collection Server .

  3. Cree la regla mediante la clase WMI SMS_CollectionRuleQuery Server .

  4. Agregue la regla a la colección.

  5. Actualice la colección.

Ejemplo

El siguiente método de ejemplo crea una colección dinámica mediante la clase WMI de servidor SMS_Collection y las clases y propiedades de clase WMI de SMS_CollectionRuleQuery servidor .

Para obtener información sobre cómo llamar al código de ejemplo, vea Llamar a fragmentos de código de 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;    }}   

El método de ejemplo tiene los parámetros siguientes:

Parámetro Tipo Descripción
connection -Administrado: WqlConnectionManager
- VBScript: SWbemServices
Una conexión válida al proveedor de SMS.
newCollectionName -Administrado: String
-Vbscript: String
Nombre único que representa la colección en la consola de Configuration Manager.
newCollectionComment -Administrado: String
-Vbscript: String
Comentario general o tenga en cuenta que documenta la colección.
ownedByThisSite -Administrado: Boolean
-Vbscript: Boolean
truesi la colección se originó en el sitio de Configuration Manager local.
query -Administrado: String
-Vbscript: String
La instrucción SELECT de WQL tiene resultados que se usan para rellenar la colección. La instrucción debe especificar un nombre de clase de recurso.
ruleName -Administrado: String
-Vbscript: String
Nombre descriptivo que identifica la regla.
limitToCollectionID -Administrado: String
-Vbscript: String
Identificador de colección para limitar el ámbito de pertenencia.

Compilar el código

El ejemplo de C# requiere:

Espacios de nombres

System

System.Collections.Generic

System.ComponentModel

Microsoft. ConfigurationManagement.ManagementProvider

Microsoft. ConfigurationManagement.ManagementProvider.WqlQueryEngine

Ensamblado

adminui.wqlqueryengine

microsoft.configurationmanagement.managementprovider

Programación sólida

Para obtener más información sobre el control de errores, consulte Acerca de los errores de Configuration Manager.

Seguridad de .NET Framework

Para obtener más información sobre la protección de aplicaciones Configuration Manager, consulte Configuration Manager administración basada en roles.

Consulta también

SMS_Collection clase WMI de servidor
SMS_CollectionRuleQuery clase WMI de servidor
Información general sobre la distribución de softwareAcerca de las implementacionesIntroducción a los objetos Cómo conectarse a un proveedor de SMS en Configuration Manager mediante código administrado
Conexión a un proveedor de SMS en Configuration Manager mediante WMI