Проверьте ввод IP-адреса и затем экспортируйте в Out-GridView

#powershell

#powershell

Вопрос:

Как я могу объединить этот код для проверки IP-адреса и вывести результат в Gridview?

 function Test-IP
{
   param
   (
      [Parameter(Mandatory = $true)]
      [ValidateScript({ $_ -match [IPAddress]$_ })]
      [String]$ip
      
   )
   
   $ip
   Write-Host "$($ip) is resolved to $([System.Net.Dns]::GetHostbyAddress($($IP)))"
}

while (!Test-IP -ip "$($Input)")
{
   $input = Read-Host -Prompt 'Input your IP address'
}

$zones = Get-DnsServerZone - Server PRDDNS05-VM | Where-Object { !$_.IsReverseLookupZone -and $_.ZoneType -eq 'Primary' }
$output = foreach ($zone in $zones)
{
   Get-DnsServerResourceRecord -ZoneName $zone.ZoneName |
   Where { $_.RecordData.Ipv4Address.IPAddressToString -contains $Input } |
   Select IPV4Address, HostName, RecordType, Type, RecordData, Timestamp, TimeToLive, @{ n = 'Zone'; e = { $zone.ZoneName } }
}
$output | Out-GridView
  

Приведенный выше скрипт используется для сброса всех записей DNS, которые содержат определенный IP-адрес, введенный пользователем.

Комментарии:

1. $input является автоматической переменной в Powershell. Вам не следует переопределять его как вводимую вами переменную. Переименование даст лучшие результаты.

2. Да, ты прав, чувак 🙂 спасибо за предложение.

Ответ №1:

Это своего рода странная конструкция, поскольку я не уверен, почему вы используете эту функцию таким образом, какой вы есть. Это означает, что выполняется функция с требуемым обязательным параметром, а затем проверка, следует ли определить, был ли он введен, и, если нет, отправить узел чтения, пока пользователь этого не сделает. Обязательный означает, обязательный. Не продолжайте, пока что-то не введено.

Если вы проверяете, просто чтобы убедиться, что пользователь вводит правильный IPA, затем проверьте это в параметре validate. Имеется в виду разрешить только формат IPA.

Кроме того, это…

 Get-DnsServerZone - Server PRDDNS05-VM 
  

… недопустимый синтаксис. Для этого командлета нет параметра с именем -Server. Существует только …

 # Get specifics for a module, cmdlet, or function
(Get-Command -Name Get-DnsServerZone).Parameters
(Get-Command -Name Get-DnsServerZone).Parameters.Keys
# Results
<#
Name
ComputerName
VirtualizationInstance
CimSession
ThrottleLimit
AsJob
Verbose
Debug
ErrorAction
WarningAction
InformationAction
ErrorVariable
WarningVariable
InformationVariable
OutVariable
OutBuffer
PipelineVariable
#>
Get-help -Name Get-DnsServerZone -Examples
Get-help -Name Get-DnsServerZone -Full
Get-help -Name Get-DnsServerZone -Online
  

…и между тире и Имя_парамЕтра никогда не бывает пробелов. Я предполагаю, что это была просто опечатка в сообщении, но просто скажите «in».

Выполняя это шаг за шагом, просто спросите основы.

 function Test-IPaddress
{
    [CmdletBinding(SupportsShouldProcess)]
    Param
    (
        [Parameter(Mandatory = $true,
                  ValueFromPipelineByPropertyName = $true,Position = 0)]
                  [ValidateScript({$_ -match [IPAddress]$_ })]
                  [string]$IPAddress
    )

    Process{[ipaddress]$IPAddress}
}

Try
{
    $IPAddress = $((Test-IPaddress -IPAddress (Read-Host -Prompt 'Input a valid IP address')).IPAddressToString)
    Out-GridView -InputObject $IPAddress -Title "IPAddress details for $IPAddress"
}
Catch 
{
    Add-Type -AssemblyName  System.Drawing,
                            PresentationCore,
                            PresentationFramework,
                            System.Windows.Forms,
                            microsoft.VisualBasic
    [System.Windows.Forms.Application]::EnableVisualStyles()

    [System.Windows.Forms.MessageBox]::Show("Warning message for $IPAddress`n 
    $($PSItem.Exception.Message)" , 'Error', 'OK', 'Error')
}
  

Как только мы узнаем, что самый простой вызов работает и выводится в OGV должным образом, вы можете добавить свой другой код в блок try и отформатировать его так, чтобы он также соответствовал OGV.

Обновление в соответствии с моим комментарием

 db-ip.com/all/113.67.32 

Test-Connection -ComputerName db-ip.com | Format-Table -AutoSize

# Results
<#
Source Destination IPV4Address IPV6Address Bytes Time(ms)
------ ----------- ----------- ----------- ----- --------
L...   db-ip.com   104.26.5.15             32    15      
L...   db-ip.com   104.26.5.15             32    12      
L...   db-ip.com   104.26.5.15             32    12      
L...   db-ip.com   104.26.5.15             32    11 
#>


Test-Connection -ComputerName 104.26.5.15 | Format-Table -AutoSize
# Results
<#
Source Destination IPV4Address IPV6Address Bytes Time(ms)
------ ----------- ----------- ----------- ----- --------
L...   104.26.5.15                         32    15      
L...   104.26.5.15                         32    14      
L...   104.26.5.15                         32    15      
L...   104.26.5.15                         32    13
#>

Test-Connection -ComputerName 113.67.32.221 | Format-Table -AutoSize
$Error[0] | Format-List -Force
# Results
<#
writeErrorStream      : True
Exception             : System.Net.NetworkInformation.PingException: Testing connection to computer '113.67.32.221' failed: Error due to lack of 
                        resources ---> System.ComponentModel.Win32Exception: Error due to lack of resources
                           --- End of inner exception stack trace ---
TargetObject          : 113.67.32.221
CategoryInfo          : ResourceUnavailable: (113.67.32.221:String) [Test-Connection], PingException
FullyQualifiedErrorId : TestConnectionException,Microsoft.PowerShell.Commands.TestConnectionCommand
ErrorDetails          : 
InvocationInfo        : System.Management.Automation.InvocationInfo
ScriptStackTrace      : at <ScriptBlock>, <No file>: line 1
PipelineIterationInfo : {0, 1, 0}
PSMessageDetails      : 
#>

Test-NetConnection -ComputerName 113.67.32.221 -TraceRoute
# Results
<#
WARNING: Ping to 113.67.32.221 failed with status: TimedOut
WARNING: Trace route to destination 113.67.32.221 did not complete. Trace terminated :: 0.0.0.0


ComputerName           : 113.67.32.221
RemoteAddress          : 113.67.32.221
...
PingSucceeded          : False
PingReplyDetails (RTT) : 0 ms
...
#>



Ping 113.67.32.221
# Results
<#
Pinging 113.67.32.221 with 32 bytes of data:
Request timed out.
...

Ping statistics for 113.67.32.221:
    Packets: Sent = 4, Received = 0, Lost = 4 (100% loss),
#>

tracert 113.67.32.221
# Results
<#
Tracing route to 113.67.32.221 over a maximum of 30 hops

  1     1 ms     1 ms     2 ms  ...
  2    24 ms    22 ms   122 ms  ... 
  3    14 ms    41 ms    19 ms  ...
...
 12     *        *        *     Request timed out.
 13     *        *        *     Request timed out.
#>


telnet 113.67.32.221
# Results
<#
Connecting To 113.67.32.221...Could not open connection to the host, on port 23: 
Connect failed
#>

telnet 113.67.32.221 80
# Results
<#
Connecting To 113.67.32.221...Could not open connection to the host, on port 80: 
Connect failed
#>
  

Комментарии:

1. спасибо за ответ. Однако, когда я ввожу общедоступный IP-адрес, я получаю эту ошибку: ————————— Ошибка ————————— Предупреждающее сообщение для исключения 113.67.32.221, вызывающего «GetHostByAddress» с аргументами «1»: «Запрошенное имя допустимо, но данные запрошенного типа не найдены» ————————— ХОРОШО —————————

2. это действительный общедоступный IP-адрес: db-ip.com/all/113.67.32

3. Это может быть законная строка IPA, но этот IPA не разрешается с помощью базовых командлетов PowerShell (или даже старых добрых DOS-файлов), поэтому он не будет разрешен никакими другими кодовыми методами. Смотрите мое обновление для проверки. Поскольку это допустимый IPA, появится OGV. Если вы добавили другой код, это приведет к сбою, как указано в обновлении.

4. Это здорово. Большое спасибо, чувак, за обновление и объяснение. Это отлично работает.

5. Не беспокойтесь. Рад, что у вас все получилось. Мой подход к разработке по умолчанию всегда заключается в выполнении абсолютного минимума кода (начиная только с использования командлетов / exe-файлов и т.д., Без навороченных / творческих штучек (имеется в виду извлечение необработанных данных) и тестировании, чтобы убедиться, что вы можете получить то, что хотите, прежде чем двигаться дальше. Как только я проверю каждый фрагмент / сегмент / блок, я объединяю их в скрипт, модули и т.д. Это просто уменьшает головные боли и ненужное дергание за волосы (которых у меня больше нет;-})