Gerenciamento

Inventários avançados de cliente com o SMS

Wes Dobry

 

Visão geral:

  • Usando o agente de inventário de hardware do SMS 2003
  • Ampliando o inventário com arquivos MIF
  • Arquivos MOF dinâmicos vs. estáticos

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

Sempre há um momento na vida do administrador quando o chefe pede uma informação que não pode ser obtida sem muito trabalho árduo. Agora imagine um administrador proativo

que já tenha obtido esses dados. Você pode fornecer as informações para o seu chefe instantaneamente, evitando assim perda de tempo desnecessária, horas extras e possivelmente até mesmo ajudando a economizar o dinheiro da empresa. Você poderia ser um herói.

O Microsoft® Systems Management Server (SMS) 2003 coleta prontamente várias informações. Mas ele não coleta tudo. Por exemplo, o SMS 2003 não se reporta por padrão a grupos locais e seus membros ou usuários locais e seus atributos. Não ter essa informação pode ser um problema se, digamos, um técnico estiver inserido Usuários de domínio, ou ainda pior, Todos no grupo de administradores locais em cada sistema que trabalham. Ou, digamos que uma empresa não tenha como saber quais listas de exclusão de pasta e arquivo local estão na sua solução de antivírus/anti-spyware corporativa. Isso pode não ser visto como um problema importante – até que alguém em TI perceba que os usuários estão inserindo c:\*.* na lista de exclusão.

Com a combinação apropriada de script, Instrumentação de Gerenciamento do Windows® (WMI, Windows Management Instrumentation) e conhecimento de SMS, você pode expandir inventários para conter praticamente qualquer parte da informação. Isso é possível através do uso dos arquivos MIF (Management Information Format, formato de informação de gerenciamento) e MOF (Management Object Format, formato de objeto de gerenciamento).

Usando o inventário

Com o SMS, as empresas podem executar implantações personalizadas, monitorar os alvos e manter os sistemas implantados. Ao ampliar os inventários de SMS, você pode criar e gerenciar um destino muito mais personalizado. Por exemplo, você pode reforçar as políticas de segurança corporativa local ao implantar as suas diretivas de segurança em sistemas que já tenham tido as diretivas modificadas por um usuário. Você também pode desabilitar as contas de usuários locais não aprovadas e remover administradores locais irrelevantes.

É claro que as empresas também dependem do SMS para obter informações oportunas e detalhadas sobre sistemas cliente. A ampliação de inventários permite que você crie relatórios que contêm informações totalmente personalizadas, as quais não estão disponíveis ao depender exclusivamente dos inventários padrão. Além disso, as informações podem ser muito granulares. Por exemplo, você pode querer criar um relatório que contenha a contagem dos sistemas que tenham uma chave de Registro específico, a qual aponte para um determinado farm de servidor. Isso permitiria que os administradores avaliassem aproximadamente quantos clientes são apontados para cada farm em determinado momento. Da mesma forma, a equipe de segurança pode verificar para ver quais sistemas na rede estão executando um processo específico conhecido como spyware.

O valor dos arquivos MIF e MOF está relacionado à capacidade de inserir informações de praticamente qualquer origem com um pouco de conversão. Desde que a informação seja baseada em texto, ela pode ser manipulada e inserida na WMI com um arquivo MOF, ou coletada na forma de um arquivo MIF e enviada no próximo ciclo de inventário de hardware. A implementação de uma expansão de inventário requer conhecimento de VBScript ou JScript®, bem como conhecimento sobre o que será coletado. Considerando que praticamente qualquer informação pode ser coletada, esse conhecimento necessário pode variar de WMI para conhecimento avançado em SQL. É claro que o conhecimento de SQL é fundamental, não importando que tipo de informação você esteja obtendo, pois você precisará desse conhecimento para relatar os dados coletados.

Como funcionam os inventários

O SMS contém dois tipos de processos de inventário: hardware e software. Os inventários de software possuem somente informações sobre arquivos, como onde eles estão localizados, quais versões eles possuem, o tamanho e outros atributos do arquivo. No entanto, o processo de inventário do software também permite que você colete arquivos e os armazene no servidor de site.

A expansão do inventário de hardware é facilmente concluída, pois os inventários de hardware contêm a maior matriz de informações sobre um sistema. As informações nos inventários de hardware são derivadas predominantemente da WMI, do Registro e do BIOS do sistema.

Os inventários de hardware são coletados em um cronograma, o qual é definido nas configurações do site do Hardware Inventory Agent no SMS 2003. As coleções podem ser definidas para que ocorram, com freqüência, a cada minuto e, sem tanta freqüência, como em intervalos de vários meses. Geralmente, você deseja ter um equilíbrio ao coletar as informações na taxa mais rápida necessária pelo gerenciamento, mas sem carregar a rede, os servidores de site, os pontos de gerenciamento ou clientes.

Quando o Hardware Inventory Agent for instalado pela primeira vez, ele compilará o arquivo sms_def.mof. Esse arquivo contém todas as informações que o SMS coleta inicialmente. Quando esse arquivo for compilado, todos os espaços para nome do SMS e classes associadas necessários para o Hardware Inventory Agent serão criados na WMI. A maioria está localizada no espaço para nome \\.\root\CIMv2\SMS. Depois da instalação, o Hardware Inventory Agent verifica a maioria dessas classes para criar as informações que são então enviadas ao ponto de gerenciamento e, eventualmente, ao banco de dados do site.

Arquivos MIF

Além de receber informações dessas classes de WMI, o Hardware Inventory Agent procura por arquivos MIF nas pastas de coleção NOIDMIF e IDMIF. Qualquer arquivo MIF que o agente detectar nesses locais será processado no inventário de hardware seguinte.

Os arquivos MIF proporcionam a forma mais fácil de ampliar o Inventário de Hardware do SMS. Há dois tipos de arquivos MIF – NOIDMIF e IDMIF. Esses arquivos são XML estáticos que podem conter praticamente qualquer informação que um usuário quiser inserir no banco de dados do SMS. Eles podem ser criados por qualquer meio utilizado para criar arquivos de texto comuns. Portanto, esses arquivos podem ser criados pela maioria dos idiomas de script ou manualmente.

Geralmente, os arquivos MIF são utilizados em situações em que a informação não está contida no Registro ou na WMI, ou quando a informação precisa ser inserida manualmente. Esses arquivos podem ser criados, por exemplo, quando a sua equipe de implantação de hardware fornecer um novo sistema. O técnico de implantação pode navegar em um aplicativo HTML no sistema e inserir todas as informações de ativos a serem utilizadas para atualizar um banco de dados de gerenciamento de ativos. Esse aplicativo cria dinamicamente um arquivo NOIDMIF e permite que o técnico baixe o arquivo para a pasta de coleção de arquivos NOIDMIF. Esse arquivo NOIDMIF pode conter todas as informações inseridas pelo técnico e ser incorporado no banco de dados do SMS.

Os arquivos NOIDMIF e IDMIF têm apenas algumas diferenças. Um arquivo IDMIF contém um cabeçalho exclusivo que fornece as informações de arquitetura e uma identificação exclusiva. Os arquivos IDMIF podem ser utilizados para incorporar dispositivos que não sejam do sistema no SMS como suas próprias entidades. Por exemplo, um script pode ser usado para criar sistemas no SMS que sejam na verdade impressoras e gravar informações sobre elas no banco de dados do SMS.

Os arquivos NOIDMIF e IDMIF são armazenados em locais padrão, os quais são escolhidos pelas chaves do Registro. Na maior parte do tempo, ele são %SYSTEMROOT%\system32\ccm\Inventory\NOIDMIF e ...\IDMIF, supondo-se que o agente SMS estava instalado no local padrão. Se o agente estiver instalado em um local personalizado, os diretórios MIF devem estar em %CCMAGENTINSTALLDIR%\Inventory\NOIDMIF e ...\IDMIF. Mas se houver dúvida quanto aos locais desses diretórios, você pode encontrar os locais relacionados nas seguintes chaves do Registro:

HKEY_LOCAL_MACHINE\Software\Microsoft\SMS\
Client\Configuration\Client Properties\NOIDMIF Directory

HKEY_LOCAL_MACHINE\Software\Microsoft\SMS\
Client\Configuration\Client Properties\IDMIF Directory

Os arquivos MIF sempre têm o mesmo formato, independentemente das informações coletadas. Observando o arquivo MIF mostrado na Figura 1, você verá que o arquivo consiste em um único componente que contém vários grupos e um único atributo em cada grupo. Todas as seções são necessárias, embora você não precise ter mais de um grupo ou entrada de atributo. Você pode analisar isso como se cada grupo no arquivo MIF fosse uma linha de dados da seção nomeada no inventário de hardware e cada atributo no grupo fosse uma coluna dessa linha.

Figure 1 LocalAdmins.mif

Start Component
  Name = “WORKSTATION”
    Start Group
        Name = “Local Admins”
        ID = 1
        Class = “Microsoft|LocalAdminsMIF|1.0”
        Start Attribute
            Name = “Account”
            ID = 1
            ACCESS = READ-ONLY
            Storage = Specific
            Type = String(100)
            Value = “Win32_UserAccount.Domain=’Contoso’,Name=’Domain Admins’”
        End Attribute
    End Group
    Start Group
        Name = “Local Admins”
        ID = 2
        Class = “Microsoft|LocalAdminsMIF”
        Start Attribute
            Name = “Account”
            ID = 1
            ACCESS = READ-ONLY
            Storage = Specific
            Type = String(100)
            Value = “Win32_UserAccount.Domain=’Contoso’,Name=’Technicians’”
        End Attribute
    End Group
    Start Group
        Name = “Local Admins”
        ID = 3
        Class = “Microsoft|LocalAdminsMIF”
        Start Attribute
            Name = “Account”
            ID = 1
            ACCESS = READ-ONLY
            Storage = Specific
            Type = String(100)
            Value = “Win32_UserAccount.Domain=’Example-PC’,Name=’Administrator’”
        End Attribute
    End Group
    Start Group
        Name = “Local Admins”
        ID = 4
        Class = “Microsoft|LocalAdminsMIF”
        Start Attribute
            Name = “Account”
            ID = 1
            ACCESS = READ-ONLY
            Storage = Specific
            Type = String(100)
            Value = “Win32_UserAccount.Domain=’Example-PC’,Name=’RandomUser’”
        End Attribute
    End Group
End Component

O LocalAdmin.vbs de exemplo, que é mostrado na Figura 2, é um VBScript bem simples. Ele verifica o diretório NOIDMIF, exclui o arquivo MIF temporário, se houver, cria o arquivo MIF temporário, grava as informações coletadas por meio de uma simples consulta WMI recursivamente no arquivo, exclui o arquivo MIF que existe na pasta de coleção NOIDMIF e, em seguida, finalmente move o NOIDMIF temporário para a pasta de coleção NOIDMIF.

Figure 2 LocalAdmin.vbs

On Error Resume Next

Const ForAppending = 8

Set objWshShell = CreateObject(“WScript.Shell”)
Set objFSO = CreateObject(“Scripting.FileSystemObject”)

strTempDir = objWshShell.ExpandEnvironmentStrings(“%TEMP%”)
strWinDir = objWshShell.ExpandEnvironmentStrings(“%WINDIR%”)
strComputerName = objWshShell.ExpandEnvironmentStrings(“%COMPUTERNAME%”)
strNoIDMifRegLocation = “HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\SMS\Client\Configuration\Client “ _
   & “Properties\NOIDMIF Directory”
strNoIDMifDirectory = objWshShell.RegRead(strNoIDMifRegLocation)
strMifFileName = “\LocalAdmins.mif”
strClassID = “Microsoft|LocalAdminsMIF|1.0”

If objFSO.FileExists(strTempDir & strMifFile) Then
   objFSO.DeleteFile(strTempDir & strMifFile)
End If

Set objMifFile = objFSO.OpenTextFile(strTempDir & strMifFileName, ForAppending, True)

objMifFile.Writeline “Start Component”
objMifFile.Writeline “ Name = “ & Chr(34) & “WORKSTATION” & Chr(34)

strWBEMQuery = “SELECT partcomponent FROM win32_groupuser WHERE groupcomponent = “ & Chr(34) _
   & “\\\\” & strComputerName & “\\root\\cimv2:Win32_Group.Domain=\” & Chr(34) & strComputerName _
   & “\” & Chr(34) & “,Name=\” & Chr(34) & “Administrators\” & Chr(34) & Chr(34)

Set objWBEM = CreateObject(“WbemScripting.SWbemLocator”)
Set objWBEMServer = objWBEM.ConnectServer(, “root\cimv2”)
Set colResults = objWBEMServer.ExecQuery(strWBEMQuery)

i = 1
For Each objItem in colResults
         objMifFile.Writeline “ Start Group”
         objMifFile.Writeline “ Name = “ & Chr(34) & “Local Admins” & Chr(34)
         objMifFile.Writeline “ ID = “ & i
         objMifFile.Writeline “ Class = “ & Chr(34) & strClassID & Chr(34)
         objMifFile.Writeline “ Start Attribute”
         objMifFile.Writeline “ Name = “ & Chr(34) & “Account” & Chr(34)
         objMifFile.Writeline “ ID = 1”
         objMifFile.Writeline “ ACCESS = READ-ONLY”
         objMifFile.Writeline “ Storage = Specific”
         objMifFile.Writeline “ Type = String(100)”
         strUserName = objItem.PartComponent
         strUserName = mid(strUserName, instr(1, strUserName, chr(58)) + 1)
         If Instr(1, strUserName, Chr(92), 1) > 0 Then 
                  strUserName = Replace(strUserName, Chr(92), Chr(92) & Chr(92), 1, -1, 1)
         End If
         If Instr(1, strUserName, Chr(34), 1) > 0 Then
                  strUserName = Replace(strUserName, Chr(34), Chr(39), 1, -1, 1)
         End If

         objMifFile.Writeline “ Value = “ & Chr(34) & strUserName & Chr(34)
         objMifFile.Writeline “ End Attribute”
         objMifFile.Writeline “ End Group”
         i = i + 1
Next

objMifFile.Writeline “End Component”
objMifFile.Close

If objFSO.FileExists(strNoIDMifDir & strMifFileName) Then
   objFSO.DeleteFile(strNoIDMifDir & strMifFileName)
End If

objFSO.MoveFile strTempDir & strMifFileName, strNoIDMifDir & strMifFileName

Enquanto os arquivos MIF proporcionam uma forma fácil de ampliar o Inventário de Hardware do SMS, há algumas questões a serem consideradas ao usá-los. Os MIFs são processados em cada ciclo de inventário de hardware. Mas como esses arquivos são criados, coletados, analisados e finalmente colocados no inventário, a exibição das informações contidas em um MIF pode ser adiada no inventário em até um ciclo de inventário de hardware. Isso significa que se uma empresa tiver ciclos de inventário de hardware de um dia, os dados no banco de dados do site podem estar com dois dias de atraso. Portanto, você deve considerar com atenção quando os programas que criam arquivos MIF são publicados e quando o ciclo de inventário de hardware é executado.

Digamos que uma empresa chamada Contoso tenha ciclos de inventário de um dia, os quais são executados à meia-noite. À 1h de segunda-feira, o VBScript será executado, criando um arquivo NOIDMIF que contém a saída de uma verificação do rootkit. Essa saída é coletada à meia-noite e relatada ao ponto de gerenciamento. O administrador do SMS da Contoso verificará a informação no noite da quarta-feira, em torno de 22h e detectará que a informação está com 45 horas de atraso. Isso ocorre devido ao fato de o administrador do SMS não refletiu bastante sobre as alternativas na publicação do programa utilizado para criar o arquivo NOIDMIF.

Arquivos MOF

simplesmente são mais complicados do que os MIF. Além disso, têm vantagem sobre os MIFs devido ao fato de inserirem suas informações diretamente na WMI e se tornarem parte do processo de coleta de dados padrão do agente de inventário de hardware. Dessa forma, você não precisa publicar um VBscript várias vezes para obter informações, poupando o seu tempo e incomodação. Em vez disso, você pode publicar o MOF uma vez por computador e estará compilado.

Os arquivos MOF também têm a vantagem de as informações serem as mais atuais em relação ao restante das informações no inventário de hardware. Sempre que o Hardware Inventory Agent passar pelo ciclo, as classes e provedores detalhados no arquivo MOF são consultados e as informações retornadas rapidamente. Quando você precisar de informações rapidamente, você pode executar um pacote que contenha o seu arquivo MOF e VBScript, começando um inventário de hardware. As informações necessárias serão então obtidas em um ciclo de diretiva do programa publicado.

Há três classificações de arquivos MOF: os arquivos MOF de um espaço para nome e classe WMI existente, arquivos MOF para uma classe adicional com um provedor WMI existente e arquivos MOF para uma classe adicional que não tem um provedor WMI.

Os arquivos MOF contêm duas partes. A primeira parte é a seção de definição do espaço para nome. É aí que as informações do provedor WMI são identificadas. A segunda seção contém os atributos de relatório do SMS. Essa seção informa o Hardware Inventory Agent onde procurar e processar as informações contidas nas classes WMI mencionadas. Como os arquivos MOF lidam diretamente com WMI, recomendo que você reserve um tempo e verifique o Microsoft WMI Software Development Kit (SDK) se pretende trabalhar com esses arquivos (consulte go.microsoft.com/fwlink/?LinkID=83121 para obter mais informações).

Cada uma das classificações mencionadas anteriormente dos arquivos MOF pode ser estática ou dinâmica. Por exemplo, você teria um arquivo MOF estático se o procedimento de criação da empresa tiver compilado um arquivo MOF que contenha informações relativas a quem criou o sistema, que tipo de servidores foram usados, quais as versões iniciais, a data em que a máquina foi desenvolvida e assim por diante. As informações nunca precisam ser atualizadas e, portanto, elas podem ser inseridas diretamente no arquivo MOF e compiladas na WMI usando o mofcomp.exe. Depois que isso ocorrer, a área na qual o Hardware Inventory Agent está verificando precisará ser ampliada adicionando as informações de grupo e classe ao arquivo sms_def.mof no servidor de site.

Um arquivo MOF dinâmico é semelhante ao arquivo MOF estático, exceto que em vez de gravar informações coletadas diretamente na WMI, os dados são coletados por meio de um provedor de WMI. Um provedor de WMI é um plug-in que permite que um aplicativo ou serviço insira informações diretamente na WMI. Esse provedor permite acesso dinâmico a outras áreas da WMI e do sistema, como o Registro, locais de arquivo e informações do Windows Installer.

Em termos de trabalho com arquivos MOF, a forma mais fácil de aprimorar o inventário de hardware é ter mais informações no catálogo de inventário que já existem na WMI. Isso pode ser feito ampliando o sms_def.mof ou ativando classes de relatório adicionais que atualmente estão desabilitadas. O arquivo sms_def.mof está localizado na pasta \\siteserver\SMS_<sitecode>\inboxes\clifiles.src\hinv. Todos os dispositivos na empresa utilizarão o novo sms_def.mof no seu próximo ciclo de diretiva da máquina e começaram coletando e relatando as informações.

O próximo na linha, em termos de dificuldade, está usando um provedor de WMI existente, mas criando uma nova classe. Um exemplo dessa abordagem é mostrado na Figura 3. Nesse exemplo, ao usar o provedor do Registro interno, a classe CU_Desktop é criada com uma propriedade dinâmica consultando HKEY_CURRENT_USER\Control Panel\Desktop\Wallpaper no dispositivo local. Depois que o arquivo MOF for compilado no cliente, as informações contidas no SMS_Def_Extension.mof (consulte a Figura 4) precisarão ser acrescentadas ao sms_def.mof. O arquivo contém informações independentemente de o SMS efetuar relatórios sobre elas, nome do grupo, ID de classe, que classe o Hardware Inventory Agent deve verificar na WMI para obter as informações a serem relatadas e, finalmente, os valores reais.

Figure 4 SMS_Def_Extentions.mof

#pragma namespace ("\\\\.\\root\\CIMv2\\sms")
 [ SMS_Report    (TRUE),
  SMS_Group_Name ("Current User Desktop"),
  SMS_Class_ID   ("MICROSOFT|CU_Desktop|1.0") ]
class Power_Mgmt : SMS_Class_Template
{
    [SMS_Report(TRUE),key]
        string  index;
    [SMS_Report(TRUE)]
    sint32   CurrentUserDesktop;
};

Figure 3 CurrentUserDesktop.mof

#pragma namespace(“\\\\.\\root\\CIMv2”)
// Registry property provider
instance of __Win32Provider as $PropProv
{
    Name    =”RegPropProv” ;
    ClsID   = “{72967901-68EC-11d0-B729-00AA0062CBB7}”;
    ImpersonationLevel = 1;
    PerUserInitialization = “FALSE”;
};
instance of __PropertyProviderRegistration
{
    Provider       =$PropProv;
    SupportsPut    =TRUE;
    SupportsGet    =TRUE;
};
[DYNPROPS]
class CU_Desktop
{
    [key]
    string  index = “current”;
    sint32 CurrentUserDesktop;
};
[DYNPROPS]
instance of CU_Desktop
{
     [PropertyContext(“local|HKEY_CURRENT_USER\\Control Panel\\Desktop|Wallpaper”),
        Dynamic, Provider(“RegPropProv”)]
        CurrentUserDesktop;
};

Os arquivos MOF também têm a capacidade de acessar informações oferecidas pelos provedores de WMI que não estão incluídas nos sistemas por padrão. Para usar esses provedores, o provedor de WMI deve primeiro ser distribuído e instalado antes de o arquivo MOF ser compilado no cliente e o sms_def.mof.

Resumindo

Os arquivos MIF e MOF files são potentes ferramentas para coleta de informações rápidas e substanciais. Esses formatos de arquivo fornecem a estrutura para introduzir facilmente as informações no banco de dados do SMS sem modificar diretamente as tabelas. Com imaginação suficiente, praticamente tudo pode passar por inventário e relatório. Ainda melhor, as situações problemáticas podem ser evitadas à medida que os administradores agirem proativamente para obter informações vitais.

Compreenda que os arquivos MIF e MOF exigem certo tempo. No entanto, eles são recursos úteis disponíveis, os quais podem ajudá-lo a aprender como usar esses arquivos. Para os iniciantes, verifique Documentação e SDK da WMI, bem como o Guia de operações do Systems Management Server 2003. Se você se esforçar para compreender esses conceitos, o que você obtiver do inventário SMS ampliado ultrapassará em muito o que você inserir nele.

Wes Dobry está localizado em Orlando, Flórida, onde trabalha como consultor e Administrador de rede para uma empresa de grande porte na área de saúde. Você pode contatá-lo pelo email wesdobry@wesdobry.com.

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