Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
WMI e CIM
O Windows PowerShell é fornecido por padrão com cmdlets para trabalhar com outras tecnologias, como a Instrumentação de Gerenciamento do Windows (WMI). Os cmdlets WMI são preteridos e não estão disponíveis no PowerShell 6+, mas são abordados aqui, pois você pode encontrá-los em scripts mais antigos em execução no Windows PowerShell. Para novos desenvolvimentos, use os cmdlets CIM.
Existem vários cmdlets WMI nativos no PowerShell sem que você precise instalar nenhum outro software ou módulo.
Get-Command
pode ser usado para determinar quais cmdlets WMI existem no Windows PowerShell. Os resultados a seguir são de um sistema windows 11 que executa o PowerShell versão 5.1. Seus resultados podem ser diferentes dependendo da versão do PowerShell em execução.
Get-Command -Noun WMI*
CommandType Name Version
----------- ---- -------
Cmdlet Get-WmiObject 3.1.0.0
Cmdlet Invoke-WmiMethod 3.1.0.0
Cmdlet Register-WmiEvent 3.1.0.0
Cmdlet Remove-WmiObject 3.1.0.0
Cmdlet Set-WmiInstance 3.1.0.0
Os cmdlets do CIM (Common Information Model) foram introduzidos no PowerShell 3.0 e são agrupados em um módulo dedicado. Para listar todos os cmdlets CIM disponíveis, use o Get-Command
cmdlet com o parâmetro Module , conforme mostrado no exemplo a seguir.
Get-Command -Module CimCmdlets
CommandType Name Version
----------- ---- -------
Cmdlet Export-BinaryMiLog 1.0.0.0
Cmdlet Get-CimAssociatedInstance 1.0.0.0
Cmdlet Get-CimClass 1.0.0.0
Cmdlet Get-CimInstance 1.0.0.0
Cmdlet Get-CimSession 1.0.0.0
Cmdlet Import-BinaryMiLog 1.0.0.0
Cmdlet Invoke-CimMethod 1.0.0.0
Cmdlet New-CimInstance 1.0.0.0
Cmdlet New-CimSession 1.0.0.0
Cmdlet New-CimSessionOption 1.0.0.0
Cmdlet Register-CimIndicationEvent 1.0.0.0
Cmdlet Remove-CimInstance 1.0.0.0
Cmdlet Remove-CimSession 1.0.0.0
Cmdlet Set-CimInstance 1.0.0.0
Os cmdlets CIM ainda permitem que você trabalhe com WMI, então não fique confuso quando alguém disser: "Quando eu consultar o WMI com os cmdlets CIM do PowerShell".
Como mencionado anteriormente, o WMI é uma tecnologia separada do PowerShell e você está apenas usando os cmdlets CIM para acessar o WMI. Você pode encontrar um VBScript antigo que usa WQL (Linguagem de Consulta WMI) para consultar o WMI, como no exemplo a seguir.
strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!\\" & strComputer & "\root\CIMV2")
Set colBIOS = objWMIService.ExecQuery _
("Select * from Win32_BIOS")
For each objBIOS in colBIOS
Wscript.Echo "Manufacturer: " & objBIOS.Manufacturer
Wscript.Echo "Name: " & objBIOS.Name
Wscript.Echo "Serial Number: " & objBIOS.SerialNumber
Wscript.Echo "SMBIOS Version: " & objBIOS.SMBIOSBIOSVersion
Wscript.Echo "Version: " & objBIOS.Version
Next
Você pode pegar a consulta WQL do VBScript e usá-la com o Get-CimInstance
cmdlet sem nenhuma modificação.
Get-CimInstance -Query 'Select * from Win32_BIOS'
SMBIOSBIOSVersion : 090006
Manufacturer : American Megatrends Inc.
Name : Intel(R) Xeon(R) CPU E3-1505M v5 @ 2.80GHz
SerialNumber : 3810-1995-1654-4615-2295-2755-89
Version : VRTUAL - 4001628
O exemplo anterior não é como eu normalmente consulto o WMI com o PowerShell. Mas ele funciona e permite migrar facilmente scripts existentes do Visual Basic para o PowerShell. Ao escrever um one-liner para consultar o WMI, uso a sintaxe a seguir.
Get-CimInstance -ClassName Win32_BIOS
SMBIOSBIOSVersion : 090006
Manufacturer : American Megatrends Inc.
Name : Intel(R) Xeon(R) CPU E3-1505M v5 @ 2.80GHz
SerialNumber : 3810-1995-1654-4615-2295-2755-89
Version : VRTUAL - 4001628
Se você quiser apenas o número de série, redirecione a saída para Select-Object
e especifique apenas a propriedade SerialNumber .
Get-CimInstance -ClassName Win32_BIOS |
Select-Object -Property SerialNumber
SerialNumber
------------
3810-1995-1654-4615-2295-2755-89
Por padrão, ao consultar o WMI, várias propriedades que nunca são usadas são recuperadas nos bastidores. Não importa muito ao consultar o WMI no computador local. Mas, depois de começar a consultar computadores remotos, não é apenas tempo extra de processamento para retornar essas informações, mas também mais informações desnecessárias para enviar pela rede.
Get-CimInstance
tem um parâmetro Property que limita as informações recuperadas, tornando a consulta WMI mais eficiente.
Get-CimInstance -ClassName Win32_BIOS -Property SerialNumber |
Select-Object -Property SerialNumber
SerialNumber
------------
3810-1995-1654-4615-2295-2755-89
Os resultados anteriores retornaram um objeto. Para retornar uma cadeia de caracteres, use o parâmetro ExpandProperty .
Get-CimInstance -ClassName Win32_BIOS -Property SerialNumber |
Select-Object -ExpandProperty SerialNumber
3810-1995-1654-4615-2295-2755-89
Você também pode usar o estilo de sintaxe pontilhada para retornar uma string, eliminando a necessidade de direcionar para Select-Object
.
(Get-CimInstance -ClassName Win32_BIOS -Property SerialNumber).SerialNumber
3810-1995-1654-4615-2295-2755-89
Consultar computadores remotos com os cmdlets do CIM
Você ainda deve estar executando o PowerShell como um administrador local e um usuário de domínio. Ao tentar consultar informações de um computador remoto usando o Get-CimInstance
cmdlet, você recebe uma mensagem de erro de acesso negado.
Get-CimInstance -ComputerName dc01 -ClassName Win32_BIOS
Get-CimInstance : Access is denied.
At line:1 char:1
+ Get-CimInstance -ComputerName dc01 -ClassName Win32_BIOS
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : PermissionDenied: (root\cimv2:Win32_BIOS:Stri
ng) [Get-CimInstance], CimException
+ FullyQualifiedErrorId : HRESULT 0x80070005,Microsoft.Management.Infra
structure.CimCmdlets.GetCimInstanceCommand
+ PSComputerName : dc01
Muitas pessoas têm preocupações de segurança com relação ao PowerShell, mas você tem as mesmas permissões no PowerShell que na GUI. Nem mais, nem menos. O problema no exemplo anterior é que o usuário que executa o PowerShell não tem direitos para consultar informações do WMI do servidor DC01. Você pode reiniciar o PowerShell como administrador de domínio, já que o Get-CimInstance
não possui um parâmetro de Credencial. Mas isso não é uma boa ideia porque qualquer coisa executada no PowerShell seria executada como administrador de domínio. Dependendo da situação, esse cenário pode ser perigoso do ponto de vista da segurança.
Usando o princípio de privilégios mínimos, eleve sua conta do administrador de domínio por comando usando o parâmetro Credential, se um comando tiver um.
Get-CimInstance
não tem um parâmetro credential , portanto, a solução neste cenário é criar uma CimSession primeiro.
Em seguida, use o CimSession em vez de um nome de computador para consultar o WMI no computador remoto.
$CimSession = New-CimSession -ComputerName dc01 -Credential (Get-Credential)
cmdlet Get-Credential at command pipeline position 1
Supply values for the following parameters:
Credential
A sessão CIM foi armazenada em uma variável chamada $CimSession
. Observe que você também especifica o Get-Credential
cmdlet entre parênteses para que ele seja executado primeiro, solicitando credenciais alternativas antes de criar a nova sessão. Mostro outra maneira mais eficiente de especificar credenciais alternativas mais adiante neste capítulo, mas é importante entender esse conceito básico antes de torná-lo mais complicado.
Agora você pode usar a sessão CIM criada no exemplo anterior com o Get-CimInstance
cmdlet para consultar as informações do BIOS do WMI no computador remoto.
Get-CimInstance -CimSession $CimSession -ClassName Win32_BIOS
SMBIOSBIOSVersion : 090006
Manufacturer : American Megatrends Inc.
Name : Intel(R) Xeon(R) CPU E3-1505M v5 @ 2.80GHz
SerialNumber : 0986-6980-3916-0512-6608-8243-13
Version : VRTUAL - 4001628
PSComputerName : dc01
Há vários outros benefícios em usar sessões CIM em vez de apenas especificar um nome de computador. Quando você executa várias consultas no mesmo computador, usar uma sessão CIM é mais eficiente do que usar o nome do computador para cada consulta. A criação de uma sessão CIM só configura a conexão uma vez. Em seguida, várias consultas usam a mesma sessão para recuperar informações. Usar o nome do computador requer que os cmdlets configurem e derrubem a conexão com cada consulta.
O Get-CimInstance
cmdlet usa o protocolo WSMan por padrão, o que significa que o computador remoto precisa do PowerShell versão 3.0 ou superior para se conectar. Na verdade, não é a versão do PowerShell que importa, é a versão da pilha. A versão da pilha pode ser determinada usando o cmdlet Test-WSMan
.
Ele precisa ser a versão 3.0, que você encontra com o PowerShell versão 3.0 e superior.
Test-WSMan -ComputerName dc01
wsmid : http://schemas.dmtf.org/wbem/wsman/identity/1/wsmanidentit
y.xsd
ProtocolVersion : http://schemas.dmtf.org/wbem/wsman/1/wsman.xsd
ProductVendor : Microsoft Corporation
ProductVersion : OS: 0.0.0 SP: 0.0 Stack: 3.0
Os cmdlets WMI mais antigos usam o protocolo DCOM, que é compatível com versões mais antigas do Windows.
No entanto, o firewall normalmente bloqueia o DCOM em versões mais recentes do Windows. O New-CimSessionOption
cmdlet permite que você crie uma conexão de protocolo DCOM para uso com New-CimSession
. Essa opção permite que o Get-CimInstance
cmdlet se comunique com versões do Windows tão antigas quanto o Windows Server 2000. Essa capacidade também significa que o PowerShell não é necessário no computador remoto ao usar o Get-CimInstance
cmdlet com um CimSession configurado para usar o protocolo DCOM.
Crie a opção de protocolo DCOM usando o cmdlet e armazene-o New-CimSessionOption
em uma variável.
$DCOM = New-CimSessionOption -Protocol Dcom
Para obter eficiência, você pode armazenar seu administrador de domínio ou credenciais elevadas em uma variável para não precisar inseri-las constantemente para cada comando.
$Cred = Get-Credential
cmdlet Get-Credential at command pipeline position 1
Supply values for the following parameters:
Credential
Tenho um servidor chamado SQL03 que executa o Windows Server 2008 (não R2). É o sistema operacional Windows Server mais recente que não tem o PowerShell instalado por padrão.
Crie um CimSession para SQL03 usando o protocolo DCOM.
$CimSession = New-CimSession -ComputerName sql03 -SessionOption $DCOM -Credential $Cred
Observe no comando anterior que você especifica a variável nomeada $Cred
como o valor do parâmetro Credential em vez de inserir manualmente suas credenciais novamente.
A saída da consulta é a mesma, independentemente do protocolo subjacente.
Get-CimInstance -CimSession $CimSession -ClassName Win32_BIOS
SMBIOSBIOSVersion : 090006
Manufacturer : American Megatrends Inc.
Name : Intel(R) Xeon(R) CPU E3-1505M v5 @ 2.80GHz
SerialNumber : 7237-7483-8873-8926-7271-5004-86
Version : VRTUAL - 4001628
PSComputerName : sql03
O Get-CimSession
cmdlet é usado para ver quais CimSessions estão conectados no momento e quais protocolos eles usam.
Get-CimSession
Id : 1
Name : CimSession1
InstanceId : 80742787-e38e-41b1-a7d7-fa1369cf1402
ComputerName : dc01
Protocol : WSMAN
Id : 2
Name : CimSession2
InstanceId : 8fcabd81-43cf-4682-bd53-ccce1e24aecb
ComputerName : sql03
Protocol : DCOM
Recupere e armazene as CimSessions criadas anteriormente em uma variável chamada $CimSession
.
$CimSession = Get-CimSession
Consulte ambos os computadores com um comando, um usando o protocolo WSMan e o outro com DCOM.
Get-CimInstance -CimSession $CimSession -ClassName Win32_BIOS
SMBIOSBIOSVersion : 090006
Manufacturer : American Megatrends Inc.
Name : Intel(R) Xeon(R) CPU E3-1505M v5 @ 2.80GHz
SerialNumber : 0986-6980-3916-0512-6608-8243-13
Version : VRTUAL - 4001628
PSComputerName : dc01
SMBIOSBIOSVersion : 090006
Manufacturer : American Megatrends Inc.
Name : Intel(R) Xeon(R) CPU E3-1505M v5 @ 2.80GHz
SerialNumber : 7237-7483-8873-8926-7271-5004-86
Version : VRTUAL - 4001628
PSComputerName : sql03
Um dos meus artigos de blog sobre cmdlets WMI e CIM apresenta uma função do PowerShell que detecta automaticamente se deseja usar o WSMan ou o DCOM e, em seguida, configura a sessão CIM apropriada para você. Para obter mais informações, consulte Função do PowerShell para criar CimSessions em computadores remotos com Fallback para Dcom.
Quando terminar com as sessões CIM, remova-as com o Remove-CimSession
cmdlet. Para remover todas as sessões CIM, canalize Get-CimSession
para Remove-CimSession
.
Get-CimSession | Remove-CimSession
Resumo
Neste capítulo, você aprendeu a usar o PowerShell para trabalhar com o WMI em computadores locais e remotos. Você também aprendeu a usar os cmdlets CIM para trabalhar com computadores remotos usando os protocolos WSMan e DCOM.
Revisão
- Qual é a diferença entre os cmdlets do WMI e do CIM?
- Por padrão, qual protocolo o
Get-CimInstance
cmdlet usa? - Quais são alguns benefícios de usar uma sessão CIM em vez de especificar um nome de computador com
Get-CimInstance
? - Como você especifica um protocolo alternativo diferente do padrão para uso com
Get-CimInstance
? - Como fechar ou remover sessões CIM?