Проверить подключение winrm в списке систем с использованием powershell

Я хочу проверить, работает ли winrm в списке серверов.

winrm id -r: имя_сервера работает для отдельных систем, но я хочу рекурсивно проверить список из csv или текстового файла.

С выводом в файл с надписью "работает" или "не работает" для каждого.

Как мне это сделать?

Спасибо всем.

Редактировать:
Дошло до того, что я передаю список виртуальных машин и конвейеров, пока не получу вывод успешных соединений winrm в файл и сбои, показанные в консоли.

get-vm | where {$.powerstate-like "PoweredOn"} | get-vmguest | where {$.guestfamily-like "windowsGuest"} | foreach {winrm id -r: $ _. hostname} | Out-File c: \ Scripts\winrmtest.txt

В моем внешнем файле я получаю вывод, такой как IdentifyResponse ProtocolVersion = http://schemas.dmtf.org/wbem/wsman/1/wsman.xsd ProductVendor = Microsoft Corporation ProductVersion = ОС: 6.1.7601 SP: 1.0 Стек: 2.0

для успешных подключений и на консоли я получаю следующее для сбоев:

Номер ошибки: -2144108526 0x80338012 Клиент не может подключиться к месту назначения, указанному в запросе. Убедитесь, что служба в месте назначения работает и принимает запросы. Обратитесь к журналам и документации для службы WS-Management, работающей на месте назначения, чаще всего IIS или WinRM. Если местом назначения является служба WinRM, выполните следующую команду в месте назначения, чтобы проанализировать и настроить службу WinRM: "winrm quickconfig". WSManFault Message = Клиент не может подключиться к месту назначения, указанному в запросе. Убедитесь, что служба в пункте назначения работает и принимает запросы. Обратитесь к журналам и документации для службы WS-Management, работающей в месте назначения, чаще всего IIS или WinRM. Если местом назначения является служба WinRM, выполните следующую команду в месте назначения для анализа и настройки службы WinRM: "winrm quickconfig".

Необходимо получить весь вывод в файл вместе с именем гостя vm, для которого предназначен ответ.

1 ответ

Решение

Помните, что я не использовал командлеты VM, однако ниже приведен код, который, как мне кажется, должен вам помочь. Я добавил wmi для проверки службы winrm на каждой машине. Если служба не запущена, посмотрите на startservice() метод для win32_service, если это вам незнакомо, труба | gm чтобы увидеть доступные свойства и методы.

Однако вот несколько рекомендаций:

  • Объекты PowerShell

Экспорт и управление данными просты и понятны.

  • "-Filter" против "Где {}"

    Посмотрите на командлеты VM и посмотрите, поддерживают ли они -filter {property -operator "*filterby*"} ваш код будет работать намного быстрее

$All_VMS_Status = @()

get-vm | where {$.powerstate -like "PoweredOn"} | get-vmguest | where {$.guestfamily -like "windowsGuest"} | foreach {

<# Create PowerShell Object with Hostname #>
$psobject = New-Object -TypeName psobject
$psobject | Add-Member -MemberType NoteProperty -Name "VM-HostName" -Value $($_.HostName)

<# Determin if WINRM is working #>
if(winrm id -r:$_.hostname) {
    $Connection_Status = "Success"
} Else {
    $Connection_Status = "Failed"
}

<# Check winrm service on remorte PC #> 
$remote_winrm_Service = Get-WmiObject win32_service -ComputerName $($_.hostname) | Where{ $_.Name -eq "winrm"}

<# Add all information to PS object for exporting #>    
$psobject | Add-Member -MemberType NoteProperty -Name "Winrm-Connection" -Value $Connection_Status
$psobject | Add-Member -MemberType NoteProperty -Name "winrm-state" -Value $($remote_winrm_Service.State)
$psobject | Add-Member -MemberType NoteProperty -Name "winrm-startmode" -Value $($remote_winrm_Service.StartMode)
$psobject | Add-Member -MemberType NoteProperty -Name "winrm-ExitCode" -Value $($remote_winrm_Service.ExitCode)
$psobject | Add-Member -MemberType NoteProperty -Name "winrm-Status" -Value $($remote_winrm_Service.Status)

$All_VMS_Status += $psobject

}

<# Export to csv #>
$All_VMS_Status | Export-Csv -Path "c:\scripts\winrmtest.csv" -NoTypeInformation`
Другие вопросы по тегам