Estou recebendo erros de classe inválidos para meu script do PowerShell

3

Quando executo esse script, recebo esse erro

Get-WmiObject: Classe inválida "Msvm_ImageManagementService"

e

Get-WmiObject: Classe inválida "MSPower_DeviceEnable"

e

Get-WmiObject: Classe inválida "MSPower_DeviceWakeEnable"

Os erros acima só ocorrem em alguns computadores e não em outros.

$computerlist = Get-Content F:\Code\powershell\network_shutdown\computer-list.csv

foreach ($computer in $computerlist) 
{
    # Main Processing Section
    # Write-Host $computer
    if((Test-Connection -Cn $computer -BufferSize 16 -Count 1 -ea 0 -quiet))
    {
        Write-Host $computer
        Write-Host "Disable '"Allow the computer to turn off this device to save power'""
        Get-WmiObject -computername $computer Win32_NetworkAdapter -filter "AdapterTypeId=0" | % {
            $strNetworkAdapterID=$_.PNPDeviceID.ToUpper()
            Get-WmiObject -class MSPower_DeviceEnable -computername $computer -Namespace $namespace | % {
                if($_.InstanceName.ToUpper().startsWith($strNetworkAdapterID))
                {
                    $_.Enable = $false
                    $_.Put() | Out-Null
                }
            }
        }

        Write-Host "Disable '"Allow this device to wake the computer'""
        Get-WmiObject -computername $computer Win32_NetworkAdapter -filter "AdapterTypeId=0" | % {
            $strNetworkAdapterID=$_.PNPDeviceID.ToUpper()
            Get-WmiObject -class MSPower_DeviceWakeEnable -computername $computer -Namespace $namespace | % {
                if($_.InstanceName.ToUpper().startsWith($strNetworkAdapterID)){
                    $_.Enable = $false
                    $_.Put() | Out-Null
                }
            }
        }

        Write-Host "Disable '"Only allow a magic packet to wake the computer'""
        Get-WmiObject -computername $computer Win32_NetworkAdapter -filter "AdapterTypeId=0" | % {
            $strNetworkAdapterID=$_.PNPDeviceID.ToUpper()
            Get-WmiObject -class MSNdis_DeviceWakeOnMagicPacketOnly -computername $computer -Namespace $namespace | % {
                if($_.InstanceName.ToUpper().startsWith($strNetworkAdapterID)){
                    $_.EnableWakeOnMagicPacketOnly = $false
                    $_.Put() | Out-Null
                }
            }
        }
    } else {
        Write-Host $computer + " OFFLINE"
        $output = new-object psobject
        $output | Add-Member noteproperty ComputerName $computer

        $array += $output
    }

    $array | Export-Csv -Path F:\Code\powershell\network_shutdown\Results.csv
}

Como posso corrigir o espaço de nomes para que eu possa segmentar todos os computadores?

Meu registro de erros também não está funcionando. O que posso fazer para colocar o OFFLINE, o FAILED e o SUCCESS em um arquivo CSV? (Estou ciente de que no meu código acima, estou capturando apenas os off-line, mas isso também não funciona)

Eu obtenho o seguinte

A invocação do método falhou porque [System.Management.Automation.PSObject] não contém um método chamado 'op_Addition'.

O código está sendo executado no Windows 7

Versão do PowerShell

Major  Minor  Build  Revision
-----  -----  -----  --------
2      0      -1     -1
    
por software is fun 04.08.2014 / 16:34

1 resposta

3

Get-WmiObject : Invalid class “Msvm_ImageManagementService”

Esta classe é exposta pelo provedor WMI do Hyper-V . Se você não tiver as ferramentas de gerenciamento do Hyper-V ou do Hyper-V instaladas na máquina de destino, essa classe não estará disponível

Get-WmiObject : Invalid class "MSPower_*"

A superclasse MSPower não é oficialmente suportada, e as classes _Device * derivadas não são expostas, a menos que um adaptador de rede instalado suporte Wake-on-LAN

Method invocation failed because [System.Management.Automation.PSObject] doesn't contain a method named 'op_Addition'.

é provavelmente causado pela seguinte linha:

$array += $output

Se $array ainda não existir, o PowerShell não poderá inferir automaticamente que você gostaria que fosse uma matriz de PSObject s - o PowerShell tentará usar o tipo do objeto no lado direito da " Operador de adição "( + ) e falha corretamente porque PSObject não suporta tal operação.

Adicione o seguinte no início do seu script:

$array = @()

Para inicializar uma matriz vazia ou indicar o tipo desejado com uma conversão explícita:

[PSObject[]]$array += $output
    
por 04.08.2014 / 17:31