Когда я запускаю этот скрипт, я получаю эту ошибку
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 не может автоматически сделать вывод, что вы хотите, чтобы он был массивом PSObject
s - PowerShell затем пытается использовать тип объекта в правой части «Оператора сложения» (+
), и правильно не работает, потому что PSObject
не поддерживает такую операцию.
Добавьте следующее в начале вашего скрипта:
$array = @()
Чтобы инициализировать пустой массив или указать желаемый тип с явным приведением:
[PSObject[]]$array += $output