Назад | Перейти на главную страницу

Я получаю ошибки недопустимого класса для моего сценария PowerShell

Когда я запускаю этот скрипт, я получаю эту ошибку

Get-WmiObject: недопустимый класс «Msvm_ImageManagementService»

и

Get-WmiObject: недопустимый класс "MSPower_DeviceEnable"

и

Get-WmiObject: недопустимый класс "MSPower_DeviceWakeEnable"

Вышеупомянутые ошибки возникают только на некоторых компьютерах, но не на других.

$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
}

Как я могу исправить пространство имен, чтобы настроить таргетинг на все компьютеры?

Мой журнал ошибок тоже не работает. Что я могу сделать, чтобы получить ОФФЛАЙН, ОТКАЗ и УСПЕХ в файл CSV? (Я знаю, что в моем приведенном выше коде я захватываю только автономные, но это тоже не работает)

Я получаю следующее

Вызов метода завершился неудачно, потому что [System.Management.Automation.PSObject] не содержит метода с именем op_Addition.

Код работает в Windows 7

Версия PowerShell

Major  Minor  Build  Revision
-----  -----  -----  --------
2      0      -1     -1

Get-WmiObject: недопустимый класс «Msvm_ImageManagementService»

Этот класс предоставляется Поставщик WMI Hyper-V. Если на целевой машине не установлены инструменты управления Hyper-V или Hyper-V, этого класса там не будет.

Get-WmiObject: недопустимый класс "MSPower_ *"

В MSPower суперкласс официально не поддерживается, и производный _Устройство * классы не отображаются, если установленный сетевой адаптер не поддерживает Wake-on-LAN

Вызов метода завершился неудачно, потому что [System.Management.Automation.PSObject] не содержит метода с именем op_Addition.

вероятно вызвано следующей строкой:

$array += $output

Если $array еще не существует, PowerShell не может автоматически сделать вывод, что вы хотите, чтобы он был массивом PSObjects - PowerShell затем пытается использовать тип объекта в правой части «Оператора сложения» (+), и правильно не работает, потому что PSObject не поддерживает такую ​​операцию.

Добавьте следующее в начале вашего скрипта:

$array = @()

Чтобы инициализировать пустой массив или указать желаемый тип с явным приведением:

[PSObject[]]$array += $output