Utilitário em destaqueCmdlets SMS para Windows PowerShell

Don Brown

Faça download do código deste artigo: Utility2007_11.exe (1211KB)

Não havia uma forma de gerenciar seus clientes Microsoft SMS (System Management Server) 2003 a partir da linha de comando. Felizmente, entre as ótimas tecnologias que surgiram nos últimos tempos para ajudar administradores a gerenciar complexidade, alterações e configuração, o Windows PowerShell chegou para resolver esse problema.

Para aproveitá-lo, escrevi um pequeno "utilitário", o SMS2003PowerShellSnapinSample (que pode ser encontrado no download de código que acompanha esta coluna, disponível em technetmagazine.com/code07.aspx). Na verdade, esse utilitário se resume em uma coleção de seis cmdlets organizados em um único snap-in do Windows PowerShellTM. Usando esses cmdlets, você pode configurar a diretiva local de cliente SMS a partir do Windows PowerShell para a máquina local ou para grupos de máquinas remotas.

Quanto mais eu usei a diretiva local de cliente SMS, mas isso fez sentido. E, como vantagem adicional, também compreendi melhor o funcionamento do SMS. Eu aprendi que, com a aplicação cuidadosa da diretiva local de cliente SMS, o cliente SMS poderia ser controlado de uma forma totalmente nova: nem todas as máquinas que fornecem relatórios ao mesmo site precisam ser configuradas da mesma forma. As idéias começaram a fluir — desde a definição de certas máquinas para que não fosse necessário haver permissão para o controle remoto da máquina, passando pela alteração da periodicidade em que o cliente verificaria a existência de uma nova diretiva, até a desativação de componentes específicos em vários momentos do dia — o céu é o limite quando você utiliza a diretiva local de cliente SMS. Vamos examiná-la mais de perto.

Sobre a diretiva local do SMS Advanced Client

Recursos de programação

Todos os SMS 2003 Advanced Clients funcionais possuem uma diretiva de configuração, basicamente uma lista de definições que orienta seus vários componentes. Todas as definições de clientes, coleção de inventário e de distribuição de software (entre outras) estão incluídas nessas diretivas de configuração. As próprias diretivas são criadas no servidor do site e entregues ao Advanced Client por meio do SMS management point.

O corpo real de uma diretiva do SMS é similar a um arquivo MOF (Managed Object Format), já que contém um conjunto de instâncias que será compilado nos namespaces \\.\root\CCM WMI (Instrumentação de Gerenciamento do Windows®) no Advanced Client. Os vários outros agentes lerão essas definições, localizadas no namespace \\.\root\ccm\policy\machine\requestedconfig. Quando estiver aplicando a diretiva local via MOF, entretanto, você só poderá compilar um MOF em uma única máquina e ele terá de ser executado de forma local (ou ainda, quando você estiver conectado diretamente na máquina). Mas o WMI, por causa de sua natureza distribuída, pode ser acessado tanto local como remotamente, o que significa uma variedade maior de opções de auxílio para os administradores do SMS. Isso significa que você pode se conectar ao WMI em uma máquina remota tão facilmente como se conecta ao WMI em sua máquina local, dados os direitos administrativos adequados.

A diretiva de cliente SMS consiste na configuração de vários componentes de cliente, mas também pode incluir instruções para a execução de conteúdo de pacote de software. Assim como a Diretiva de Grupo do Active Directory®, a diretiva do SMS 2003 Advanced Client obtida de um SMS management point deve ser substituída pela diretiva local de cliente SMS. Não é possível substituir todas as partes de uma diretiva, mas algumas propriedades realmente interessantes podem ser substituídas. Isso oferece aos administradores do SMS um grau de controle maior sobre a configuração e sobre as operações do SMS Client, já que permite exceções à configuração padrão aplicada ao site SMS.

Veja o exemplo de um ambiente seguro e consolidado, onde os administradores do SMS gerenciam os servidores e as estações de trabalho como clientes de um único site primário SMS. Nesse ambiente imaginário, uma diretiva de segurança poderia declarar que a permissão do usuário deve ser solicitada antes que técnicos de suporte possam obter o controle remoto de sua máquina. Obviamente isso será um problema caso os técnicos queiram utilizar o controle remoto para se conectar aos servidores: tipicamente, nenhum usuário fica conectado nos servidores e, portanto, não há ninguém para conceder permissão ao controle remoto. Por meio da aplicação cuidadosa da diretiva local, no entanto, o requisito de permissão de usuário pode ser substituído em clientes específicos. Provavelmente, você pode imaginar dezenas de outras circunstâncias em que a diretiva local do SMS pode ser útil em conceder uma exceção à configuração de um agente de cliente SMS específico.

Por dentro do snap-in do Windows PowerShell

Depois que já estiver mais familiarizado com os aspectos básicos do Windows PowerShell, você poderá fazer adições ao código-fonte fornecido com esta coluna para expandir o que pode ser feito com a diretiva local de cliente SMS a partir da linha de comando. Existem atributos específicos que devem ser aplicados a uma classe antes de serem expostos ao Windows PowerShell. Você precisa decidir qual será a função do cmdlet e que ação deve ser executada. Isso é conhecido como emparelhamento "Verbo-Substantivo". Alguns verbos comuns vistos no Windows PowerShell são Add, Get e Set. A parte do substantivo descreve o objeto sobre o qual você deseja agir. Normalmente, os cmdlets possuem parâmetros declarados em uma classe Cmdlet como propriedades públicas de vários tipos. Por fim, a função ProcessRecord é o principal local onde você fará a maior parte do seu trabalho. A Figura 1 mostra um modelo genérico que você pode usar em seus próprios cmdlets.

Figure 1 Modelo de cmdlet

[Cmdlet( "Verb", "Noun", SupportsShouldProcess = true )]
public class Verb_Noun : PSCmdlet
{
  [Parameter( ValueFromPipeline = true, ValueFromPipelineByPropertyName = true, 
    HelpMessage = "Parameter" )]
  [ValidateNotNullOrEmpty]
  [Alias( "param" )]
  public string Parameter
  {
    get { return MyParameter; }
    set { MyParameter = value; }
  }
  private string MyParameter;

  protected override void ProcessRecord( )
  {
    //Do your stuff here!
  }
}

Depois de compilar seu snap-in, você o registrará no Windows PowerShell incluindo uma classe em seu projeto que possua o atributo RunInstaller definido, além de algumas propriedades específicas. Consulte o código-fonte que acompanha este artigo para obter informações mais específicas. Para registrar o seu snap-in, você precisará usar a ferramenta InstallUtil.exe incluída no Microsoft® .NET Framework. A Figura 2 mostra a sintaxe usada no registro do seu snap-in. Observe que, no Windows Vista®, esta é uma operação que requer a elevação de privilégios e, portanto, você terá de abrir o Windows PowerShell com a opção "Executar como administrador" ou usar os PowerToys de elevação de script para Windows Vista (que podem ser baixados de technetmagazine.com/issues/2007/06/UtilitySpotlight).

Figure 2 Instalando o snap-in a partir do Windows PowerShell

PS> set-alias installutil $env:windir\Microsoft.NET\Framework\v2.0.50727\installutil 
PS> installutil C:\MySMSTools\SMS2003PowerShellSnapinSample.dll 
Microsoft (R) .NET Framework Installation utility Version 2.0.50727.42 
Copyright (C) Microsoft Corporation. All rights reserved. 
Running a transacted installation. 
... 
The transacted install has completed.

A próxima etapa é descobrir se o seu snap-in é reconhecido pelo Windows PowerShell. Use o cmdlet Get-PSsnapin com o parâmetro Registered para que o Windows PowerShell resuma os snap-ins carregados no momento, seguidos por uma lista de snap-ins registrados e que estão para ser adicionados. O seu snap-in deve ser encontrado nesta lista:

PS> Get-PSsnapin -registered

Agora você pode adicionar o snap-in do Windows PowerShell ao shell usando o cmdlet Add-Pssnapin, como a seguir:

PS> add-pssnapin SMS2003PowerShellSnapinSample

Se a operação tiver êxito, você será capaz de executar os cmdlets em seu snap-in do Windows PowerShell.

Para ver todos os cmdlets disponibilizados por qualquer snap-in do Windows PowerShell, basta especificar o snap-in em particular com o cmdlet Get-Command, passando o nome do seu snap-in como o valor do parâmetro PSsnapin. O snap-in de exemplo que acompanha esta coluna exibe seis cmdlets, incluindo o modelo do cmdlet Verb-Noun, como mostra a Figura 3.

Figura 3 Exibindo os cmdlets em um snap-in

Figura 3** Exibindo os cmdlets em um snap-in **(Clique na imagem para aumentar a exibição)

No código-fonte de exemplo, escrevi ajuda somente para o cmdlet Get-SMSServerConnection para demonstrar como ele é criado. Se quiser expandir a ajuda, depois você terá um exemplo em que poderá se basear, no arquivo XML. A Figura 4 mostra a saída da ajuda.

Figure 4 Saída do Get-Help de exemplo

PS > get-help Get-SMSServerConnection

NAME
  Get-SMSServerConnection

SYNOPSIS
  This cmdlet establishes a connection to the specified SMS primary site server using your current credentials. An object of type "SMSProvider" is returned through the pipeline.

SYNTAX
  Get-SMSServerConnection [-SMSServerName] [<string>] [<CommonParameters>]

DETAILED DESCRIPTION
  This Cmdlet makes a connection to the specified SMS primary site server. An object of type "SMSProvider" is returned. The "SMSProvider" object is not serializable and is used only to forward on through the pipeline to other cmdlets.

RELATED LINKS

Agora que você já viu como instalar o snap-in do Windows PowerShell, como descobrir que comandos estão presentes nele e como obter ajuda em um cmdlet típico, vamos começar a usar os cmdlets. Para mostrar uma lista de todas as coleções em um servidor de site primário SMS, utilize o seguinte comando:

PS > Get-SMSServerConnection -server MYSMSSERVER | Get-Collections | Format-Table Name

Observe o pipeline. Ele é uma parte fundamental do funcionamento do Windows PowerShell e é uma ferramenta muito poderosa. No Windows PowerShell, é possível fazer quase tudo em somente uma linha. O cmdlet Get-SMSServerConnection estabelece uma conexão com o servidor SMS. Uma vez que o cmdlet Get-Collections possui um único parâmetro de entrada do tipo retornado por Get-SMSServerConnection, você pode simplesmente passar a saída de Get-SMSServerConnection para Get-Collections. É dessa forma que o pipeline funciona e é um bom exemplo de como você pode passar objetos complexos de um cmdlet para outro. Também é possível armazenar objetos em variáveis e, se você estiver fazendo isso em um script do Windows PowerShell, poderia se parecer com o código a seguir:

$SMS = Get-SMSServerConnection 
   -server MYSMSSERVER
Get-Collections -SMSServerProvider $SMS

A saída pode ser um pouco difícil de ler sem alguma boa formatação da saída, já que Get-Collections retorna um objeto do tipo SMSCollections (que é, basicamente, uma matriz de objetos do tipo SMSCollection). Em resumo, não é uma exibição muito bonita, até que você filtre as coleções em que não está interessado em ver ou formate a exibição em uma tabela somente com as propriedades desejadas. Faça isso passando a saída do cmdlet Get-Collections pelo pipeline para o cmdlet Format-Table, que pode exibir somente as propriedades especificadas. Por exemplo, você pode acrescentar | Format-Table Name, Members.

Ah, mas existe uma forma melhor de mostrar todos os membros de uma determinada coleção e, neste exemplo, é Get-CollectionMembers. Esse cmdlet retorna uma matriz de cadeias de caracteres que representa o nome de cada membro da coleção. Como você já deve ter percebido, esse é um ótimo candidato para a passagem pelo pipeline para o próximo cmdlet.

Até este ponto, não houve uma diretiva local de SMS Advanced Client — somente conexões ao servidor de site primário SMS e a enumeração de coleções e de membros de coleção. Mais dois cmdlets foram incluídos neste snap-in do Windows PowerShell de exemplo, Enable-SoftwareDistribution e Disable-SoftwareDistribution, respectivamente. É aí que entra em cena a diretiva local de cliente SMS. Esses dois últimos cmdlets manipulam a diretiva local de cliente SMS para o componente do agente do cliente de distribuição de software do SMS Advanced Client. Como você poderia esperar por causa da parte verbal do cmdlet, Disable substitui a diretiva local de cliente que especifica que o agente do cliente de distribuição de software também deve ser desabilitado. Da mesma forma, o verbo Enable remove todas as substituições de diretiva local de cliente, fazendo com que o agente de cliente de distribuição de software volte ao seu estado normal, definido pela diretiva do SMS gerenciada pelo SMS management point. A Figura 5 mostra um exemplo de uma linha do Windows PowerShell que coloca uma substituição de diretiva local de cliente SMS no agente de cliente de distribuição de software que impõe a desabilitação de todos os membros da coleção personalizada dos sistemas Windows Server 2003. A linha que remove toda a diretiva local de cliente SMS e substitui o agente de cliente de distribuição de software na mesma coleção também é listada. Os cmdlets Disable-SoftwareDistribution e Enable-SoftwareDistribution também podem ser usados por conta própria, se você tiver somente algumas máquinas em que deseja manipular a diretiva local de cliente SMS.

Figure 5 Montando os cmdlets — exemplos

PS >Get-SMSServerConnection -server MYSMSSERVER | Get-Collections | where-object {$_.Name -eq "Windows Server 2003 Systems"} | Get-CollectionMembers | Disable-SoftwareDistribution 
PS >
PS > Get-SMSServerConnection -server MYSMSSERVER | Get-Collections | where-object {$_.Name -eq "Windows Server 2003 Systems"} | Get-CollectionMembers | Enable-SoftwareDistribution
PS >
PS >Disable-SoftwareDistribution –hosts SMSCLIENT1, SMSCLIENT2, SMSCLIENT3
PS >
PS >Enable-SoftwareDistribution –hosts SMSCLIENT1, SMSCLIENT2, SMSCLIENT3

Próximas etapas

O código-fonte de exemplo que vem com este artigo pode oferecer a você um bom ponto de partida para a aplicação de substituições de diretiva local de cliente SMS a grupos de computadores. Este exemplo só aborda o agente de cliente de distribuição de software do SMS e a propriedade Enabled. Os outros agentes de cliente possuem mais propriedades que você pode substituir da mesma forma. Agora que você possui um ponto de partida em comum, a próxima etapa lógica é examinar outras partes da diretiva local de cliente SMS. Pense nos grupos de sistemas gerenciados que podem ser bons candidatos para as substituições de diretiva local de cliente SMS e quais faria sentido usar. Uma última observação: é uma boa prática saber no que você está se metendo e, portanto, teste tudo com cuidado em um ambiente de laboratório.

Don Brown é engenheiro-chefe de campo sênior da Microsoft e vem trabalhando e oferecendo suporte ao SMS (quer dizer, SCCM) há muito, muito tempo. Entre em contato com ele pelo email donbrown@microsoft.com.

© 2008 Microsoft Corporation e CMP Media, LLC. Todos os direitos reservados. A reprodução parcial ou completa sem autorização é proibida..