3

When I run this script, I get this error

Get-WmiObject : Invalid class “Msvm_ImageManagementService”

and

Get-WmiObject : Invalid class "MSPower_DeviceEnable"

and

Get-WmiObject : Invalid class "MSPower_DeviceWakeEnable"

The above errors only occur on some computers and not on others.

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

How can I fix the namespace so that I can target all computers?

My error logging isn't working either. What can I do to get the OFFLINE and FAILED and SUCCESS into a CSV file? (I am aware that in my code above, I am only capturing the offline ones but that doesn't work either)

I get the following

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

The code is running on Windows 7

PowerShell Version

Major  Minor  Build  Revision
-----  -----  -----  --------
2      0      -1     -1
2
  • To ask the obvious question, what is the difference between the computers on which the WMI classes can be queried, and the computers on which the WMI classes cannot be queried? – Ryan Ries Aug 4 '14 at 15:19
  • All computers are running Windows 7 Professional, Windows 7 Enterprise or Windows 7 Ultimate. The could be Dell GX790, Dell GX780, Dell GX760, or Lenovo M83. – software is fun Aug 4 '14 at 15:21
3

Get-WmiObject : Invalid class “Msvm_ImageManagementService”

This class is exposed by the Hyper-V WMI provider. If you don't have Hyper-V or Hyper-V Management tools installed on the target machine, this class won't be there

Get-WmiObject : Invalid class "MSPower_*"

The MSPower superclass is not officially supported, and the derivated _Device* classes is not exposed unless an installed network adapter supports Wake-on-LAN

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

is probably caused by the following line:

$array += $output

If $array does not already exist, PowerShell cannot automatically infer that you would like it to be an array of PSObjects - PowerShell then tries to use the type of the object on the right-hand side of the "Addition operator" (+), and correctly fails because PSObject supports no such operation.

Add the following at the start of your script:

$array = @()

To initialize an empty array, or indicate the desired type with an explicit cast:

[PSObject[]]$array += $output

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.