Когда сервер проверяет связь, полученный адрес сравнивается с инвентаризацией с целью поддержания инвентаризации в актуальном состоянии.
Я пытаюсь отметить результат как «хороший» или «плохой» в следующей соответствующей ячейке. Это вроде работает, за исключением того, что результат всегда "плохой" с рабочим процессом, который я настроил.
CSV-файл содержит имя сервера и IP-адрес, извлеченные из реестра Excel, и имеет следующий формат:
name,ipaddress
server1,10.1.24.51
server2,10.1.24.52
server3,10.1.24.53
server4,10.1.27.101
server5,10.1.27.102 <--- purposely wrong IP address for testing
Текущий сценарий:
$serverlist = Import-Csv -Path file.csv
ForEach ($server in $serverlist) {
$thisservername = $server.name
$thisserveripaddress = $server.ipaddress
$pingdaddress = (Test-Connection -ComputerName $thisservername -Count 1 -ErrorAction SilentlyContinue -Verbose).IPV4Address.IPAddressToString
if ($pingdaddress -ne $thisserveripaddress) {
#$thisservername + " bad"
$serverlist | Select-Object name,ipaddress, @{Name='connection';Expression={'bad'}} | `
Export-Csv -Path file.csv -NoTypeInformation
} else {
#$thisservername + " good"
$serverlist | Select-Object name,ipaddress, @{Name='connection';Expression={'good'}} | `
Export-Csv -Path file.csv -NoTypeInformation
}
}
Я думаю, ваша ошибка проистекает из $pingdaddress = (Test-Connection -ComputerName $thisservername -Count 1 -ErrorAction SilentlyContinue -Verbose).IPV4Address.IPAddressToString
. Если имя сервера не может быть разрешено, объект подключения (ну, объект Win32_PingStatus), возвращаемый Test-Connection
будет $null
. Затем вы пытаетесь получить доступ к свойству нулевого объекта, что недопустимо.
Я бы разделил «успех» на отдельную колонку. Вы можете сделать это, добавив еще один столбец в свой CSV, например: NameMatch
или IPMatch
, все, что имеет для вас больше смысла. Таким образом, вы можете получить к нему доступ как к свойству в вашем цикле $server.NameMatch
и выполните фильтрацию / сортировку данных позже.
function Test-ServerNameMapping
{
[cmdletBinding()]
param(
[Parameter(Mandatory=$true)]
[ValidateScript({Test-Path $_})]
[String]
$Path
)
$serverList = Import-Csv -Path $Path
foreach ($server in $serverList)
{
Write-Verbose "Testing: $($server.Name), $($server.IPAddress)"
$connectionObject = (Test-Connection -ComputerName $server.Name -Count 1 -ErrorAction SilentlyContinue)
if (-not $connectionObject)
{
Write-Verbose "Failed to resolve $($server.Name) to an IP address."
$server.namematch = $false
}
else
{
$resolvedAddress = $connectionObject.IPV4Address.ToString()
Write-Verbose "Resolved $($server.Name) to $resolvedAddress"
if ($resolvedAddress -eq $server.IPAddress)
{
Write-Verbose "$($server.IPAddress) matches found address of $resolvedAddress"
$server.namematch = $true
}
else
{
Write-Verbose "$($server.IPAddress) does not equal found address of $resolvedAddress"
$server.namematch = $false
}
}
}
$serverList | Export-Csv -Path $Path -NoTypeInformation -Force
}
Затем, если вы захотите подготовить отчет позже, вы можете сделать что-то вроде:
$problemServers = Import-Csv -Path c:\example.csv | ? NameMatch -eq $false
Example.csv:
Name,IPAddress,NameMatch
server1,10.0.0.1,"True"
server2,10.0.0.2,
server3,10.0.0.3,"False"
При первом запуске скрипта столбец NameMatch может быть пустым (как и в случае с server2), и скрипт его заполнит.