Como criar uma coleção dinâmica

No Configuration Manager, seu aplicativo usa a classe WMI do SMS_Collection Server para definir os atributos de uma coleção, como as regras de associação e o cronograma de atualização. A propriedade contém o nome de classe MemberClassName gerado pelo sistema que contém os membros da coleção.

Os membros de uma coleção são especificados usando regras diretas, regras de consulta ou ambos. As regras diretas definem um recurso explícito, enquanto as regras de consulta definem uma coleção dinâmica que é avaliada regularmente com base no estado atual do site.

Observação

Ao criar uma regra de associação direta, lembre-se de que a regra sempre deve ter o mesmo nome que o computador especificado pela regra.

Seu aplicativo usa a classe SMS_CollectionRuleQuery Server WMI para definir regras de consulta. A consulta deve ser válida e pode especificar a coleção para conter recursos como "Todos os usuários no domínio corporativo". Em seguida, o aplicativo pode usar a consulta para garantir que um programa seja direcionado para distribuição de software para todos os computadores que atendem aos critérios. À medida que o site muda e o conjunto é reavaliado, os membros da coleção são adicionados e excluídos automaticamente.

Observação

Ao executar uma consulta em uma coleção dinâmica, verifique se o Provedor de SMS está carregado ou se outro método ou consulta já foi executado.

As coleções estão intimamente vinculadas a pacotes, programas e anúncios. Para obter mais informações, consulte Visão geral da distribuição de software.

Estes exemplos exigem os seguintes valores:

  • Um Windows de conexão WMI (Instrumentação de Gerenciamento).

  • Um novo nome de coleção dinâmica.

  • Um novo comentário de coleção dinâmica.

  • O sinalizador "propriedade deste site".

  • Uma consulta (cadeia de caracteres).

  • Um nome de regra estático.

  • Um identificador de coleção para limitar o escopo da associação.

Observação

Se a coleção Todos os Sistemas (SMS00001) tiver sido removida do servidor do site, o exemplo VBScript não funcionará.

Exemplo da chamada de sub-rotina no Visual Basic:

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

Exemplo da chamada de método em C#:

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

Para criar uma coleção dinâmica

  1. Configurar uma conexão com o Provedor de SMS. Para obter mais informações, consulte Fundamentos básicos do Provedor de SMS.

  2. Crie o novo objeto de coleção usando a classe WMI SMS_Collection Server.

  3. Crie a regra usando a classe WMI SMS_CollectionRuleQuery Server.

  4. Adicione a regra à coleção.

  5. Atualize a coleção.

Exemplo

O método de exemplo a seguir cria uma coleção dinâmica usando SMS_Collection Classe WMI do Servidor e as classes e as propriedades de classe WMI do servidor SMS_CollectionRuleQuery Server.

Para obter informações sobre como chamar o código de exemplo, consulte Calling Configuration Manager Code Snippets.


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

O método example tem os seguintes parâmetros:

Parâmetro Tipo Descrição
connection - Gerenciado: WqlConnectionManager
- VBScript: SWbemServices
Uma conexão válida com o Provedor de SMS.
newCollectionName - Gerenciado: String
- VBScript: String
O nome exclusivo que representa a coleção no console do Configuration Manager.
newCollectionComment - Gerenciado: String
- VBScript: String
Comentário geral ou observação que documenta a coleção.
ownedByThisSite - Gerenciado: Boolean
- VBScript: Boolean
true se a coleção se originou no site do Configuration Manager local.
query - Gerenciado: String
- VBScript: String
Instrução SELECT WQL com resultados que são usados para preencher a coleção. A instrução deve especificar um nome de classe de recurso.
ruleName - Gerenciado: String
- VBScript: String
Nome descritivo que identifica a regra.
limitToCollectionID - Gerenciado: String
- VBScript: String
Identificador de coleção para limitar o escopo da associação.

Compilando o código

O C# exemplo exige:

Namespaces

System

System.Collections.Generic

System.ComponentModel

Microsoft.ConfigurationManagement.ManagementProvider

Microsoft.ConfigurationManagement.ManagementProvider.WqlQueryEngine

Assembly

adminui.wqlqueryengine

microsoft.configurationmanagement.managementprovider

Programação robusta

Para obter mais informações sobre o tratamento de erros, consulte About Configuration Manager Errors.

Segurança do .NET Framework

Para obter mais informações sobre como proteger aplicativos do Configuration Manager, consulte Configuration Manager role-based administration.

Confira também

SMS_Collection Server WMI Class
SMS_CollectionRuleQuery Server WMI Class
Visão geral de distribuição de software Sobre implantações Visão geral dos objetos Como Conexão para um provedor de SMS no Gerenciador de Configurações usando código gerenciado
Como Conexão um provedor SMS no Configuration Manager usando o WMI