PowerShell Test-Connection: Современный тест “Ping”

Сегодняшняя командлета дня – это PowerShell Test-Connection. Test-Connection – это командлет, который, неудивительно, тестирует ваше сетевое соединение. Подумайте о Test-Connection как о реализации PowerShell популярной утилиты ping. Несмотря на то, что у них обоих есть общий ICMP, вы увидите, что эти два метода немного отличаются под капотом.

Использовать эту командлету просто. В ее самой базовой форме просто укажите параметр ComputerName, и она отправит четыре запроса ICMP на целевой хост.

PS> Test-Connection -ComputerName google.com
Source        Destination     IPV4Address      IPV6Address                              Bytes    Time(ms)
------        -----------     -----------      -----------                              -----    --------
MACWINVM      google.com      172.217.0.14     2607:f8b0:4009:80c::200e                 32       47
MACWINVM      google.com      172.217.0.14     2607:f8b0:4009:80c::200e                 32       90
MACWINVM      google.com      172.217.0.14     2607:f8b0:4009:80c::200e                 32       88
MACWINVM      google.com      172.217.0.14     2607:f8b0:4009:80c::200e                 32       205

Этот вывод выглядит похожим на ping.exe, и, на первый взгляд, это так, но Powershell test-connection отправляет запрос ICMP немного иначе. В отличие от ping.exe, Test-Connection использует локальный класс WMI вашего компьютера Win32_PingStatus для отправки запроса ICMP. Использование локального хранилища WMI означает, что вам лучше быть уверенным в том, что ваше локальное хранилище WMI работает исправно, иначе Test-Connection не будет работать.

Объектный вывод PowerShell Test-Connection

Также, как и с преимуществом PowerShell, эта командлета не просто возвращает то, что сразу же появляется в консоли. Мы видим богатые объекты, из которых мы можем получить больше информации.

Если я присвою вывод переменной, а затем проверю свойства, вы увидите, что я собрал гораздо больше полезной информации.

PS> $pingResults | Get-Member
TypeName: System.Management.ManagementObject#root\cimv2\Win32_PingStatus
Name                           MemberType     Definition
----                           ----------     ----------
PSComputerName                 AliasProperty  PSComputerName = __SERVER
Address                        Property       string Address {get;set;}
BufferSize                     Property       uint32 BufferSize {get;set;}
NoFragmentation                Property       bool NoFragmentation {get;set;}
PrimaryAddressResolutionStatus Property       uint32
PrimaryAddressResolutionStatus {get;set;}
ProtocolAddress                Property       string ProtocolAddress {get;set;}
ProtocolAddressResolved        Property       string
ProtocolAddressResolved {get;set;}
RecordRoute                    Property       uint32 RecordRoute {get;set;}
ReplyInconsistency             Property       bool ReplyInconsistency {get;set;}
ReplySize                      Property       uint32 ReplySize {get;set;}
ResolveAddressNames            Property       bool ResolveAddressNames {get;set;}
ResponseTime                   Property       uint32 ResponseTime {get;set;}
ResponseTimeToLive             Property       uint32 ResponseTimeToLive {get;set;}
RouteRecord                    Property       string[] RouteRecord {get;set;}
RouteRecordResolved            Property       string[] RouteRecordResolved {get;set;}
SourceRoute                    Property       string SourceRoute {get;set;}
SourceRouteType                Property       uint32 SourceRouteType {get;set;}
StatusCode                     Property       uint32 StatusCode {get;set;}
Timeout                        Property       uint32 Timeout {get;set;}
TimeStampRecord                Property       uint32[] TimeStampRecord {get;set;}
TimeStampRecordAddress         Property       string[] TimeStampRecordAddress {get;set;} TimeStampRecordAddressResolved Property       string[]
TimeStampRecordAddressResolved {get;set;}
TimestampRoute                 Property       uint32 TimestampRoute {get;set;}
<SNIP>

Если вы тестируете внутренние узлы, Test-Connection будет использовать DCOM для аутентификации на удаленных узлах. По умолчанию он будет использовать аутентификацию DCOM на уровне пакета, но тип аутентификации всегда можно изменить с помощью параметра DcomAuthentication.

Использование фоновых заданий

Этот cmdlet также может выполняться как фоновая задача. Фоновые задания пригодятся, если у вас много удаленных компьютеров для проверки, и вместо бесконечного ожидания тех, которые в конечном итоге завершатся по тайм-ауту, просто отправьте их в фоновую задачу.

Согласно справке PowerShell для Powershell test-connections, там говорится, что необходимо включить удаленное выполнение PowerShell как на локальном, так и на удаленном компьютере, но это не так. Как видите ниже, я тестирую google.com, и команда все равно отлично работает.

Test-Connection -AsJob -ComputerName google.com
Get-Job | Receive-Job

Простота во всем

Наконец, если вам просто нужен бинарный ответ “да” или “нет” на вопрос о том, отвечает ли компьютер или нет, вы всегда можете использовать параметр Quiet. Общая строка, которую я всегда использую, чтобы быстро узнать, включен ли сервер или нет, – использовать Quiet и Count равный 1, чтобы заставить Test-Connection отправить один запрос ICMP.

PS> Test-Connection -ComputerName google.com -Quiet -Count 1
True

Вот и всё на сегодняшний день по нашему cmdlet! Мы рассмотрели большинство возможностей командлета Powershell test-connection, но, как всегда, обратитесь к справочным материалам PowerShell или загляните в документацию Microsoft для полного ознакомления.

Source:
https://adamtheautomator.com/powershell-test-connection/