Views

Important:

Quaisquer necessidades de soluções e/ou desenvolvimento de aplicações pessoais/profissionais, que não constem neste Blog podem ser tratados como consultoria freelance à parte.

...

24 de setembro de 2013

Access VBA Advanced - Usando o Poder do VBScript e do WMI - Using the Power of VBScripts and WMI in Microsoft Access VBA

Inline image 1

Muitos programadores da suíte MS Office, sequer imaginam que podem explorar as poderosas capacidades de Scripting e WMI (Windows Management Instrumentation - instrumentação de gerenciamento do Windows).

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.

WMI inclui um repositório do objeto compatível com o CIM, que é o banco de dados das definições do objeto, e ogerenciador 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 provedorSNMP 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.

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 daMicrosoft, 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 numServidor 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 2000Windows XP eWindows Server 2003. Estão baseados em padrões supervisionados peloDistributed Management Task Force (DMTF), o WMI é a ferramenta e o encanamento através do qual todos, ou  quase todos, os recursos doWindows 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 softwares

Instalar softwares

Atualizar software

Lista 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 Registado
Get 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 VBScriptchamado WQL.


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 VBAusando 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 Object
    Dim objItem As Object
    Dim strProcessorIDs As String

    Let strComputer = "."

    Set objWMIService = GetObject("winmgmts:" _
        & "{impersonationLevel=impersonate}!\\" _
        & strComputer & "\root\cimv2")

    Set colItems = objWMIService.ExecQuery( _
        "SELECT * FROM Win32_Processor", , 48)
        
    For Each objItem In colItems
        Let strProcessorIDs = strProcessorIDs & ";" & Nz(objItem.ProcessorID, "")
    Next
    
    ' Remove the leading ; from the string  
    Do While Left(strProcessorIDs, 1) = ";"
        Let strProcessorIDs = Right(strProcessorIDs, (Len(strProcessorIDs) - 1))
    Loop
   
    Let ProcessorIDs = strProcessorIDs

    Set objItem = Nothing
    Set colItems = Nothing
    Set objWMIService = Nothing
End Function

Como funciona o código?

Após declararmos algumas variáveis, criamos uma instância do objeto WMIusando 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 classeWin32_Processor WMI.

Set colItems = objWMIService.ExecQuery( _
    "SELECT * FROM Win32_Processor", , 48)

Nós usamos uma consulta WQL para selecionar todas as propriedades da classe. E podemos aprender mais sobre WQL aqui.

Finalmente temos o 
número de série de identificação do processador numastring.

For Each objItem In colItems
    ProcessorID = 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 Boolean
    Dim strProcessorID As String

    ' Get the stored ProcessorIDs from
    ' the custom Database property
    strProcessorID = GetDBPropValue("dbPrpProcessorID")

    If InStr(1, ProcessorIDs, strProcessorID) > 0 Then
        StartSafe= True
    Else
        StartSafe= 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 Modules
        DoCmd.Quit
    End If
End Function

Divirtam-se!


Seguem alguns livros para ampliarmos a visão sobre WMI






Deixe os seus comentários! Envie este artigo, divulgue este link na sua rede social...

Tags
VBA, Access, VBScripts, WMI, Microsoft Access, scripting, advanced, WMI, vbscript, Windows API, WQL, 


Nenhum comentário:

Postar um comentário

eBooks VBA na AMAZOM.com.br

Vitrine