Подтвердить что ты не робот

Get-WmiObject: сервер RPC недоступен. (Исключение из HRESULT: 0x800706BA)

Когда я запустил

Get-WmiObject win32_SystemEnclosure -Computer hostname | select serialnumber

он работает как для локальных, так и для удаленных хостов.

Когда я делаю это для списка хостов, использующих

ForEach ($_ in gc u:\pub\list.txt) {
    Get-WmiObject win32_SystemEnclosure -Computer $_ | select serialnumber | format-table -auto @{Label="Hostname"; Expression={$_}}, @{Label="Service Tag"; Expression={$_.serialnumber}}
}

он возвращает

Get-WmiObject: сервер RPC недоступен. (Исключение из HRESULT: 0x800706BA)

4b9b3361

Ответ 1

Убедитесь, что в брандмауэре для каждого удаленного компьютера включено правило "Инструментарий управления Windows (WMI-In)".

Или в командной строке Administrative Command/Powershell:

netsh advfirewall firewall set rule group="Windows Management Instrumentation (WMI)" new enable=yes

Ответ 2

Возможно, это связано с различными проблемами. Я не могу сказать, какой из них есть в вашем случае.

Ниже приведены причины:

  • DCOM не включен на ПК или на целевом ПК или на обоих.
  • Ваш брандмауэр или даже ваш антивирус препятствуют доступу.
  • Любая служба, связанная с WMI, отключена.

Некоторые службы, связанные с WMI, приведены ниже:

  • Диспетчер автоматического подключения к удаленному доступу
  • Диспетчер подключений удаленного доступа
  • Удаленный вызов процедур (RPC)
  • Локатор удаленных процедур (RPC)
  • Удаленный реестр

Для настройки DCOM обратитесь:

  • Ключ: HKLM\Software\Microsoft\OLE, Значение: EnableDCOM

Значение должно быть установлено на "Y".

Ответ 3

Возможно, ваш код не использует правильное имя машины, вы должны дважды проверить это.

Ваша ошибка:

Get-WmiObject: сервер RPC недоступен. (Исключение из HRESULT: 0x800706BA)

Это результат, который вы получаете, когда машина недоступна. Поэтому предложения брандмауэра разумны, но в этом случае, вероятно, не правильно, потому что вы говорите, что это работает:

Get-WmiObject win32_SystemEnclosure -Computer hostname

Итак, в вашем случае кажется, что эта строка выполняется:

Get-WmiObject win32_SystemEnclosure -Computer $_

$_ не содержит правильного имени компьютера. Вы можете проверить тип и содержимое $_. Вероятно, есть проблема с содержимым файла. Если файл выглядит правильно, возможно, строки не будут правильно завершены. Возможно, поближе посмотрите, используя Write-Host:

ForEach ($_ in gc u:\pub\list.txt) {
    Write-Host "Get-WmiObject win32_SystemEnclosure -Computer '$_'"
    Get-WmiObject win32_SystemEnclosure -Computer $_ | select serialnumber | format-table -auto @{Label="Hostname"; Expression={$_}}, @{Label="Service Tag"; Expression={$_.serialnumber}}
}

Ответ 5

Если вы пробовали некоторые из предложений в других ответах, наиболее заметно:

  • Ответ Дэвида Брабанта: подтверждение включения правила входящего брандмауэра Windows Management Instrumentation (WMI)
  • Ответ Abhi_Mishra: подтверждение DCOM включено в реестре

Затем рассмотрим другие распространенные причины для получения этой ошибки:

  • Удаленный компьютер выключен
  • Вы указали недопустимое имя компьютера
  • Существуют проблемы с подключением к сети между вами и целевым компьютером.

Ответ 6

У меня была такая же проблема с использованием foreach. Я сохранил список в $server и использовал это:

ForEach ($_ in $Servers) { Write-Host "Host $($_)" | Get-WmiObject win32_SystemEnclosure -Computer $_ | format-table -auto @{Label="Service Tag"; Expression={$_.serialnumber}}
}

Ответ 7

У меня была такая же проблема, но только с несколькими машинами. Я обнаружил, что использование Invoke-Command для запуска той же команды на удаленном сервере сработало.

Итак, вместо:

Get-WmiObject win32_SystemEnclosure -ComputerName $hostname -Authentication Negotiate

Используйте это:

Invoke-Command -ComputerName $hostname -Authentication Negotiate -ScriptBlock {Get-WmiObject win32_SystemEnclosure}

Ответ 8

Отключение брандмауэра разрешило это для меня.

Ответ 9

Думаю, я бы добавил, что мы также столкнулись с этой проблемой с несколькими машинами в нашем домене. Я создал список оскорбительных машин и добавил их все в текстовый файл, из которого можно запустить script. Я запускал это из приглашения CMD с использованием повышенных привилегий.

 psexec @firewallFix.txt -d netsh advfirewall firewall 
        set rule name="Windows Management Instrumentation (WMI-In)" 
        profile=domain new enable=yes profile=domain

Ответ 10

решаемая.

Я столкнулся с тем же сообщением об ошибке при попытке выполнить следующую script (частичную) работу с удаленной виртуальной машиной, настроенной для работы в WORKGROUP.

Restart-Computer -ComputerName MyComputer -Authentication Default -Credential $cred -force

Я заметил, что могу запустить script из другой виртуальной машины в том же WORKGROUP, когда я отключил брандмауэр, но все равно не мог сделать это с машины в домене. Эти две вещи вместе с предложениями Stackflow привели меня к следующему решению:

Примечание. Измените эти параметры на свой страх и риск. Вы должны понимать последствия этих изменений безопасности перед их применением.

На удаленном компьютере:

  • Убедитесь, что вы снова включили свой брандмауэр, если вы отключили его во время тестирования.
  • Запуск Enable-PSRemoting из PowerShell с успехом
  • Перейдите в wf.msc(брандмауэр Windows с повышенной безопасностью)
  • Подтвердить правило приватного/открытого входящего ' управления Windows (DCOM-In)' включено И, чтобы свойство "Удаленный адрес" было "Любое" или что-то более безопасное.
  • Подтвердить правило приватного/открытого входящего подключения Управление инструментами управления Windows (WMI-In) ' И убедитесь, что для свойства "Удаленный адрес" указано "Любой" или что-то более безопасное.

Необязательно. Вам также может потребоваться выполнить следующие действия, если вы хотите запускать команды типа Enter-PSSession.

  • Подтвердить приватное/общедоступное входящее ' Управление Windows Правило "Инструментарий (ASync-In)" включено И, убедитесь, что Свойство "Удаленный адрес" - "Любой" или что-то более безопасное.
  • Откройте входящий TCP-порт до 5985

ВАЖНО!. Он берет мою удаленную виртуальную машину примерно через 2 минуты после ее перезагрузки, чтобы ответить на команду "Enter-PSSession", даже если другие сетевые службы запускаются без проблем. Дайте ему пару минут, а затем попробуйте.

Боковое примечание: Прежде чем изменить свойство "Удаленный адрес" на "Любой" , оба правила были установлены в "Локальная подсеть".

Ответ 11

Включение следующих правил FW в целевой системе разрешило проблему на Win2k16:

  • Инструментарий управления Windows (WMI-In)
  • Координатор распределенных транзакций (RPC)
  • Координатор распределенных транзакций (RPC-EPMAP)

Ответ 12

Я только что пришел к той же самой проблеме и нашел ответ здесь: http://powershellcommunity.org/Forums/tabid/54/aft/7537/Default.aspx

У меня были пробельные символы в конце каждой строки входного файла. Если ваш файл тоже работает, просто удалите их, и ваш script должен работать.

Ответ 13

Я делал эту ошибку

ForEach ($server in $servers) {
$OS = Get-WmiObject win32_operatingsystem -ComputerName $server
}

Что, конечно, не может быть передано, поскольку вывод сервера в файл csv был @{Name = hv1g.contoso.com}

Мне пришлось вызвать свойство из файла csv, как этот $server.Name

ForEach ($server in $servers) {
$OS = Get-WmiObject win32_operatingsystem -ComputerName $server.Name
}

Он исправил мою проблему.