Já se perguntou por que você não pode fazer isso:

  Get-ADComputer -Filter * -SearchBase 'OU = Servidores, DC = Manticore, DC = org' |
 Get-CimInstance -ClassName Win32_OperatingSystem

O parâmetro -ComputerName no get-CimInstance aceita a entrada do pipeline, MAS é por nome da propriedade.

  PS> Get-Help Get-CimInstance -Parameter ComputerName

 -ComputerName [<String []>]
 Especifica o computador no qual você deseja executar a operação CIM.  Você pode especificar um nome de domínio totalmente qualificado
 (FQDN), um nome NetBIOS ou um endereço IP.

 Se você não especificar esse parâmetro, o cmdlet executa a operação no computador local usando Componente
 Modelo de objeto (COM).

 Se você especificar esse parâmetro, o cmdlet cria uma sessão temporária para o computador especificado usando o WsMan
 protocolo.

 Se várias operações estão sendo executadas no mesmo computador, usar uma sessão CIM dá melhor desempenho.

 Requeridos?  falso
 Posição?  Nomeado
 Valor padrão nenhum
 Aceitar entrada pipeline?  Verdadeiro (ByPropertyName)
 Aceitar caracteres curinga?  falso

Se você olhar para o resultado do Get-ADComputer, ele possui uma propriedade Name.

  PS> Get-ADComputer -Filter * -SearchBase 'OU = Servidores, DC = Manticore, DC = org'

 DistinguishedName: CN = W16PWA01, OU = Servers, DC = Manticore, DC = org
 DNSHostName: W16PWA01.Manticore.org
 Habilitado: Verdadeiro
 Nome: W16PWA01
 ObjectClass: computador
 ObjectGUID: 8d137004-1ced-4ff1-bcf4-f0671652fc8c
 SamAccountName: W16PWA01 $
 SID: S-1-5-21-759617655-3516038109-1479587680-1322
 UserPrincipalName:

Então, você tem uma incompatibilidade de nome entre a propriedade e o parâmetro.

Há uma série de maneiras de lidar com isso.

Primeiro uso

  Get-ADComputer -Filter * -SearchBase 'OU = Servidores, DC = Manticore, DC = org' |
 para cada {
 Get-CimInstance -ClassName Win32_OperatingSystem -ComputerName $ psitem.Name | 
 Selecione CSName, Legenda
 }

Use $ psitem.Name (ou $ _. Name) como a entrada para -ComputerName. Codificação simples e funciona muito bem.

Se você tiver muitos computadores, você pode querer usar um loop foreach em vez disso

  $ Computers = Get-ADComputer -Filter * -SearchBase 'OU = Servidores, DC = Manticore, DC = org' |  Selecione -ExpandProperty Name
 Foreach ($ computer in $ computers) {
 Get-CimInstance -ClassName Win32_OperatingSystem -ComputerName $ computer |
 Selecione CSName, Legenda
 }

Crie uma série de nomes de computadores e itere através deles.

Segundo uso, selecione

  Get-ADComputer -Filter * -SearchBase 'OU = Servidores, DC = Manticore, DC = org' |
 Selecione @ {N = 'Nome do computador'; E = {$ _. Nome}} |
 Get-CimInstance -ClassName Win32_OperatingSystem |
 Selecione CSName, legenda

Neste caso use select-object para criar uma propriedade com o nome ComputerName (caso não importa) e canalize isso para Get-CimInstance.

Esta opção é um pouco mais avançada, pois você entende como o objeto selecionado funciona e como criar propriedades extras no objeto que você está passando no encanamento. Parece mais legal e você deve obter alguns pontos extras de “ace powerShell coder”.

A terceira opção aproveita o fato de que _Computername aceita uma série de nomes de computadores

  Get-CimInstance -ClassName Win32_OperatingSystem -ComputerName (Get-ADComputer -Filter * -SearchBase 'OU = Servers, DC = Manticore, DC = org' | select -ExpandProperty Name) |
 Selecione CSName, Legenda

Você executa o Get-ADComputer e use selecione -Expand para retornar apenas o VALUE do nome do computador (uma string). Isso lhe dá uma variedade de nomes de computadores. Como está em () é tratado como um objeto de entrada para o parâmetro.

Muito inteligente e obtém o máximo de pontos.

Anúncios