Проверить подключение 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`