Muitos programadores da suíte MS Office, sequer imaginam poderem explorar as poderosas capacidades de Scripting e WMI (Windows Management Instrumentation - instrumentação de gerenciamento do Windows).
O WMI (instrumentação de gerenciamento do Windows) é a implementação da Microsoft do WBEM, uma iniciativa da indústria que visa estabelecer padrões para acessar e compartilhar informações de gerenciamento por meio de uma rede empresarial. O WMI é compatível com WBEM e fornece suporte integrado ao modelo CIM (modelo de informação comum), o modelo de dados que descreve os objetos existentes em um ambiente de gerenciamento.O WMI inclui um repositório do objeto compatível com o CIM, que é o banco de dados das definições do objeto, e o gerenciador de objetos CIM, que lida com a coleta e a manipulação dos objetos no repositório e reúne as informações dos provedores WMI. Esses provedores agem como intermediários entre o WMI e os componentes do sistema operacional, aplicativos e outros sistemas. Por exemplo, o provedor do Registro extrai as informações do Registro, enquanto o provedor SNMP fornece os dados e eventos dos dispositivos SNMP. Os provedores dão informações sobre seus componentes e podem fornecer métodos para manipular os componentes, as propriedades que podem ser definidas ou os eventos que podem alertá-lo sobre as alterações nos componentes.O WMI pode ser usado pelas ferramentas de gerenciamento do computador, como o Microsoft Systems Management Server, para ajudá-lo a gerenciar seus computadores. Ele também é usado por outras tecnologias e ferramentas da Microsoft, como o Microsoft Health Monitor e o Microsoft Operations Manager, e por outros fornecedores de sistemas de gerenciamento dos computadores. Você pode usar o WMI com sistemas de programação ou de scripts (como o host de scripts do Windows) para recuperar detalhes de configuração da maioria dos aspectos dos sistemas de computador, incluindo aplicativos de servidor, ou para gerar alterações nos sistemas.
De fato, é emocionante descobrir que é fácil convertermos VBScript WMI em código VBA deixando-os tão funcionais quanto os scripts.
Embora haja uma série de funções VBSript alguns não podem ser usados no VBA, mas a maioria dos scripts pode ser facilmente modificado para funcionar a partir do MS Access ou outros aplicativos do Office.
Por que ficar animado?
Com VBA e WMI podemos fazer muitas coisas que não são possíveis usando o Windows API. O WMI é tão poderoso que é preciso ter cuidado para não fazermos alguns estragos sérios nos computadores sob a nossa responsabilidade quer localmente, quer num PC remoto ou mesmo num Servidor Windows!
Por que o WMI é tão poderoso?
"O WMI é a principal tecnologia de gestão de habilitação embutido nos família de sistemas operacionais Windows 2000, Windows XP e Windows Server 2003. Estão baseados em padrões supervisionados pelo Distributed Management Task Force (DMTF), o WMI é a ferramenta e o encanamento através do qual todos, ou quase todos, os recursos do Windows podem ser acessados, configurados, gerenciados e monitorados. "A última frase acima estabelece o tamanho do poder de WMI, o qual você, sim você, tem na ponta dos dedos através do VBA.
Segue uma lista das coisas que podemos fazer localmente ou através de acesso remoto:
Gerenciar usuários e Políticas de Grupo
(Manage Users and Group Policies)Ler e salvar logs de eventos em arquivos(Read and save Event Logs to files)Obter o tamanho de memória livre de um disco rígido
(Get the size of a hard drive's free Memory)
Obter a versão do Microsoft Office(Get the Version of Microsoft Office)Obter os atributos das Impressoras(Get the attributes of Printers)Obter a versão do OSSP(Get the Operating System Service Pack Version (CSDVersion–ServicePackLast))Obter o nome do SO(Get the Operating System Name)Obter a versão do SO(Get the Operating System Version Number)Obter a versão do compilação do SO(Get the Operating System Build Number)Obter o número de série do produto Windows OS(Windows Operating System Product/Serial Number)Ter ciência dos Jobs agendadas(Get Scheduled Jobs)Conte processos em execução(Count Running Processes)Lista dos processos em execução(List Running Processes)Encerrar processos(Terminate Processes)Deletar softwaresInstalar softwaresAtualizar softwareLista de todos os software Windows instalado(List all Windows installed software)Lista todas as IDs dos produtos Microsoft instalados(List Microsoft software Product IDs)Retorna o nome do Usuário RegistadoGet the Registered User
Nem tudo são flores
A maior dificuldade com o uso de WMI é que existem milhares de propriedades e métodos que estão disponíveis para acessarmos. O WMI tem classes, propriedades e métodos e um dialeto próprio de query VBScript chamado WQL.
O WMI usa o Common Information Model (CIM) para acessar informações e executar ações. O CIM nos dá acesso a quase tudo sobre um PC. Podemos aprender mais sobre o CIM aqui.
Finalmente, o código:
Para que você não morra de curiosidade, segue um exemplo de código VBA usando WMI.
Este código obtém os IDs dos Processores de um computador local, o que pode ser muito útil.
Este código pode ser usado como um template de como acessar e usar grande parte da informação que queremos usar com o WMI.
Function ProcessorIDs() As String' Usando late binding para evitar um problema de referência - late binding
Dim strComputer As String
Dim objWMIService As Object
Dim colItems As ObjectDim objItem As ObjectDim strProcessorIDs As StringLet strComputer = "."Set objWMIService = GetObject("winmgmts:" _& "{impersonationLevel=impersonate}!\\" _& strComputer & "\root\cimv2")Set colItems = objWMIService.ExecQuery( _"SELECT * FROM Win32_Processor", , 48)For Each objItem In colItemsLet strProcessorIDs = strProcessorIDs & ";" & Nz(objItem.ProcessorID, "")Next' Remove the leading ; from the stringDo While Left(strProcessorIDs, 1) = ";"Let strProcessorIDs = Right(strProcessorIDs, (Len(strProcessorIDs) - 1))LoopLet ProcessorIDs = strProcessorIDsSet objItem = NothingSet colItems = NothingSet objWMIService = NothingEnd Function
Como funciona o código?
Após declararmos algumas variáveis, criamos uma instância do objeto WMI usando GetObject ("winmgmts:")
Set objWMIService = GetObject("winmgmts:" _& "{impersonationLevel=impersonate}!\\" _& strComputer & "\root\cimv2")
Usamos winmgmts, o CIM Object Manager, para acessar o "root" ("\ root \ cimv2") da biblioteca CIM. Se estiver acessando um computador remoto "{ImpersonationLevel = personificar}! \ \" Concede-nos o acesso se tivermos as credenciais de segurança adequadas.
A variável strComputer passa um valor de "." Quando estamos acessando o computador local. Se quiser acessar um computador remoto, em vez de usar nós, precisamos usar o caminho e o nome do computador remoto ".": GetObject ("winmgmts: \ TargetComputer") ou GetObject ("winmgmts: \ DomainName TargetComputer \").
Em seguida, instanciamos um conjunto de propriedades da classe Win32_Processor WMI.
Nós usamos uma consulta WQL para selecionar todas as propriedades da classe. E podemos aprender mais sobre WQL aqui.
Set colItems = objWMIService.ExecQuery( _"SELECT * FROM Win32_Processor", , 48)
Finalmente temos o número de série de identificação do processador numa string.
For Each objItem In colItemsProcessorID = Nz (objItem.ProcessorID, 0)Next
Termos os ProcessorIDs pode nos ajudar a ter algum nível de segurança, permitindo-nos saber se o banco de dados foi copiado para um computador diferente. Se já salvamos pelo menos um dos ProcessorIDs num banco de dados personalizado, podemos verificar se o valor foi alterado usando o código a seguir, que pode ser chamado por uma Macro AutoExec ou num formulário Splash. Atenção: Faça backup de seus arquivos de banco de dados antes de usar o seguinte código.
Function StartSafe() As BooleanDim strProcessorID As String' Get the stored ProcessorIDs from' the custom Database propertystrProcessorID = GetDBPropValue("dbPrpProcessorID")
If InStr(1, ProcessorIDs, strProcessorID) > 0 Then
StartSafe= TrueElseStartSafe= False' The database has been copied to an unauthorized computer!' Delete the Back End Database to protect your data' Uncomment the next line of code to delete the back end database'Kill (CurrentProject.Path & "\BackEndDB.mdb")' If this is the back end add code to Delete all tables' Add code to Delete all ModulesDoCmd.QuitEnd IfEnd Function
Divirtam-se!
Seguem alguns livros para ampliarmos a visão sobre WMI
Nenhum comentário:
Postar um comentário