Показать полную графическую версию : ping компьютеров из *.csv
JimmLight
07-04-2021, 08:22
Привет всем.
Стоит следующая задача: Необходимо отследить компьютеры, которые не выключаются на ночь.
Есть User_Comp.csv следующего содержания:
#TYPE Selected.Microsoft.ActiveDirectory.Management.ADUser
"pager","name","title","department"
"IVANOV_PC","Иванов Иван Иванович","Заместитель начальник","Отдел начальников"
"PC_BARANOV","Баранов Михаил Петрович","Главный надзиратель","Отдел надзирателей"
,"Горьков Михаил Денисович","Советник слесаря","Отдел слесарей"
"PETROV","Петров Максим Альбертович","Слесарь","Отдел слесарей"
В поле "pager" содержится имя компьютера (но не всегда. Если нет, то пропускать), которое и необходимо пинговать. Если пингуется, то записывать в новый *.csv-файл:
#TYPE Selected.Microsoft.ActiveDirectory.Management.ADUser
"pager","IP","name","title","department"
"PC_BARANOV","IP","Баранов Михаил Петрович","Главный надзиратель","Отдел надзирателей"
"PETROV","IP","Петров Максим Альбертович","Слесарь","Отдел слесарей"
Если не пигуется, то ничего не записывать в новый *.csv-файл (имя **csv-файла должно быть: дата_время.csv).
Ранее пользовался скриптом, который пингует все компьютеры (которые лежат в определенной OU) в домене:
# Enter CSV file location
$CurrentDate = Get-Date
$CurrentDate = $CurrentDate.ToString('MM-dd-yyyy_hh-mm-ss')
$csv = "C:\Temp\Ping_$CurrentDate.csv"
# Add the target OU in the SearchBase parameter
$Computers = Get-ADComputer -Filter * -SearchBase "OU=SuperComputers,DC=domain,DC=ru" | Select Name | Sort-Object Name
$Computers = $Computers.Name
$Headers = "ComputerName,IP Address"
$Headers | Out-File -FilePath $csv -Encoding UTF8 -Delimiter ";"
foreach ($computer in $Computers)
{
Write-host "Pinging $Computer"
$Test = Test-Connection -ComputerName $computer -Count 1 -ErrorAction SilentlyContinue -ErrorVariable Err
if ($test -ne $null)
{
$IP = $Test.IPV4Address.IPAddressToString
$Output = "$Computer,$IP"
$Output | Out-File -FilePath $csv -Encoding UTF8 -Append
}
Else
{
$Output = "$Computer,$Err"
$output | Out-File -FilePath $csv -Encoding UTF8 -Append
}
cls
}
Но теперь чуть другая задача.
Подсобите, plz, скриптом.
DJ Mogarych
07-04-2021, 11:08
Powershell:
$t = get-date
$report = @()
Import-Csv "D:\temp\User_Comp.csv" |? pager |% {
if (Test-Connection $_.pager -Count 1 -Quiet) {
$report += $_
}
if ($report) {
$report |Export-Csv "D:\temp\$($t.ToString("yyyy-MM-dd-HH-mm-ss")).csv" -Delimiter ';' -NoTypeInformation -Encoding utf8
}
}
Хотя как по мне, так надо не выносить людям мозг по надуманному поводу, а решить задачу - если нужно выключать компьютеры на ночь, выключать их командой удалённо, или настроить GPO, чтобы они засыпали после часа Х.
JimmLight
07-04-2021, 12:44
Powershell: »
Файл "yyyy-MM-dd-HH-mm-ss.csv" создаётся, но не наполняется. Он пустой.
Хотя как по мне, так надо не выносить людям мозг по надуманному поводу, а решить задачу - если нужно выключать компьютеры на ночь, выключать их командой удалённо, или настроить GPO, чтобы они засыпали после часа Х. »
Я понимаю, но если руководство решило... :-)
DJ Mogarych
07-04-2021, 12:55
пустой »
Значит, все компы выключены. Дополнил скрипт выше, чтобы пустого файла не создавалось.
если руководство решило »
С руководством надо разговаривать, потому что оно часто не знает, что есть другие пути решения проблемы, и действует как в докомпьютерную эру.
JimmLight
07-04-2021, 13:01
Значит, все компы выключены. Дополнил скрипт выше, чтобы пустого файла не создавалось. »
Файл не создаётся.
Но некоторые компьютеры пингуются (проверено вручную).
DJ Mogarych
07-04-2021, 14:17
Вставьте код в Powershell ISE и проверьте работоспособность.
Путь к User_Comp.csv правильный?
JimmLight
07-04-2021, 14:17
Вставьте код в Powershell ISE и проверьте работоспособность. »
Так и делаю.
DJ Mogarych
07-04-2021, 14:19
У меня почему-то работает.
Import-Csv "D:\temp\User_Comp.csv" |? pager
Что-то отображает?
Команда
Test-Connection [заведомо пингующийся комп] -Count 1 -Quiet
Что выдаёт?
JimmLight
07-04-2021, 14:21
Что-то отображает? »
Да, содержимое "User_Comp.csv".
Что выдаёт? »
False
DJ Mogarych
07-04-2021, 14:39
Интересно. Пингуется, но test-connection выдаёт false?
JimmLight
07-04-2021, 17:23
Интересно. Пингуется, но test-connection выдаёт false? »
Да.
Интересно. Пингуется, но test-connection выдаёт false? »
Любой компьютер: хоть пингуется или не пингуется, всё равно выдаёт False.
DJ Mogarych
07-04-2021, 19:53
test-connection это и есть по сути пинг.
А что он выдаёт без ключа -quiet?
JimmLight
08-04-2021, 06:01
Интересно. Пингуется, но test-connection выдаёт false? »
Именно.
А что он выдаёт без ключа -quiet? »
Пингуется.
S C:\1.System> Test-Connection "test_pc" -Count 1
Source Destination IPV4Address IPV6Address Bytes Time(ms)
------ ----------- ----------- ----------- ----- --------
my_pc test_pc 192.168.18.56 32 0
PS C:\1.System> Test-Connection "test_pc" -Count 1 -Quiet
False
JimmLight
08-04-2021, 06:48
cmd:
C:\>ping test_pc
Обмен пакетами с test_pc.domain.ru [192.168.18.56] с 32 байтами данных:
Ответ от 192.168.18.56: число байт=32 время<1мс TTL=127
Ответ от 192.168.18.56: число байт=32 время<1мс TTL=127
Ответ от 192.168.18.56: число байт=32 время<1мс TTL=127
Ответ от 192.168.18.56: число байт=32 время<1мс TTL=127
Статистика Ping для 192.168.18.56:
Пакетов: отправлено = 4, получено = 4, потеряно = 0
(0% потерь)
Приблизительное время приема-передачи в мс:
Минимальное = 0мсек, Максимальное = 0 мсек, Среднее = 0 мсек
PowerShell:
PS C:\1.System> Test-Connection test_pc -Count 1 -Quiet
False
PowerShell:
PS C:\1.System> Test-Connection test_pc
Source Destination IPV4Address IPV6Address Bytes Time(ms)
------ ----------- ----------- ----------- ----- --------
my_pc test_pc 192.168.18.56 32 0
my_pc test_pc 192.168.18.56 32 0
my_pc test_pc 192.168.18.56 32 0
my_pc test_pc 192.168.18.56 32 0
DJ Mogarych
08-04-2021, 11:00
У вас почему-то неправильно работает эта команда, вот описание той же проблемы, но без решения: https://stackoverflow.com/questions/27227594/test-connection-mystery
Попробуйте на другом компе.
JimmLight
12-04-2021, 06:20
Вот отличный скрипт, который делает, что нужно.
$CurrentDate = Get-Date
$CurrentDate = $CurrentDate.ToString('MM-dd-yyyy_hh-mm-ss')
$csv = "C:\Ping_$CurrentDate.csv"
$Results=New-Object System.Collections.Generic.List[PSObject]
$Computers=Import-Csv -Path "C:\User_Comp.csv"
$Computers = $Computers| where-object {$_.pager -ne ""}
foreach ($computer in $Computers)
{
Write-host "Pinging $($Computer.pager)"
$Test = Test-Connection -ComputerName $($Computer.pager) -Count 1 -ErrorAction SilentlyContinue -ErrorVariable Err
if ($test -ne $null)
{
$IP = $Test.IPV4Address.IPAddressToString
$p=[ordered]@{
"Pager"=$Computer.Pager
"IP"=$IP
"name"=$Computer.Name
"title"=$Computer.Title
"department"=$Computer.Department
}
$Obj=New-Object -Type PsObject -Property $p
$Results.Add($Obj)
}
}
$Results | Export-Csv -Encoding UTF8 -Delimiter ";" -Path $csv
1. Можно ли добавить в начало файла "C:\Ping_$CurrentDate.csv" дату / время создания?
2. Каким образом, можно реализовать список исключений? Т.е. есть список исключений - C:\Temp\exceptions_ping.csv, следующего формата:
“pager”,“IP”,“name”,“title”,“department”
который не должен попадать, в C:\Temp\Ping_$CurrentDate.csv.
DJ Mogarych
12-04-2021, 09:38
отличный скрипт, который делает, что нужно »
Он по сути ничем не отличается от моего, только более многословен.
И удивительно, что Test-Connection почему-то заработал правильно (хотя тут применён обходной вариант).
Если кто-нибудь сможет мне объяснить, почему он не работал в моём варианте, буду благодарен.
можно реализовать список исключений? »
$ex = (import-csv "C:\Temp\exceptions_ping.csv").pager
$Computers = Import-Csv "C:\User_Comp.csv" |? {$_.pager -and $_.pager -notin $ex}
JimmLight
12-04-2021, 11:00
$ex = (import-csv "C:\Temp\exceptions_ping.csv").pager
$Computers = Import-Csv "C:\User_Comp.csv" |? {$_.pager -and $_.pager -notin $ex}
DJ Mogarych, работает. Спасибо.
Если кто-нибудь сможет мне объяснить, почему он не работал в моём варианте, буду благодарен. »
Подозреваю, что не работает лишь на моей "машине". Тестировал на других - работает. Спасибо.
Можно ли добавить в начало / конец самого файла "C:\Ping_$CurrentDate.csv" дату / время создания?
DJ Mogarych
12-04-2021, 13:21
Нежелательно, т. к. нарушается структура файла. Проще всего так:
$p=[ordered]@{
"Pager"=$Computer.Pager
"IP"=$IP
"name"=$Computer.Name
"title"=$Computer.Title
"department"=$Computer.Department
"date"=$CurrentDate
}
JimmLight
14-04-2021, 12:23
Добавил в *.csv-файл "canonicalName", но в:
$csv = "C:\Pings\Ping_$CurrentDate.csv"
почему-то не выходит "canonicalName".
$CurrentDate = Get-Date
$CurrentDate = $CurrentDate.ToString('dd-MMMM-yyy_HH-mm-ss')
$csv = "C:\Pings\Ping_$CurrentDate.csv"
$Results=New-Object System.Collections.Generic.List[PSObject]
$ex = (import-csv "C:\Scripts\Ping_Computers\exceptions_ping.csv").pager
$Computers = Import-Csv "C:\Scripts\Ping_Computers\User_Comp.csv" |? {$_.pager -and $_.pager -notin $ex}
$Computers = $Computers| where-object {$_.pager -ne ""}
foreach ($computer in $Computers)
{
Write-host "Pinging $($Computer.pager)"
$Test = Test-Connection -ComputerName $($Computer.pager) -Count 1 -ErrorAction SilentlyContinue -ErrorVariable Err
if ($test -ne $null)
{
$IP = $Test.IPV4Address.IPAddressToString
$p=[ordered]@{
"Pager"=$Computer.Pager
"IP"=$IP
"name"=$Computer.Name
"title"=$Computer.Title
"department"=$Computer.Department
"canonicalName"=$canonicalName.canonicalName
"date"=$CurrentDate
}
$Obj=New-Object -Type PsObject -Property $p
$Results.Add($Obj)
}
}
$Results | Export-Csv -Encoding UTF8 -Delimiter ";" -Path $csv
И еще один момент, как правило, "canonicalName" указывается в следующем формате:
domain.ru/OrganizationUnit_1/OrganizationUnit_2/OrganizationUnit_3/OrganizationUnit_4/OrganizationUnit_5/OrganizationUnit_6/OrganizationUnit_7/User
Необходимо, чтобы исходный файл:
$csv = "C:\Pings\Ping_$CurrentDate.csv"
был следующим:
"Pager";"IP";"name";"title";"department";"OrganizationUnit_1";"OrganizationUnit_2";"OrganizationUnit_3";"OrganizationUnit_4";"OrganizationUnit_5";"OrganizationUnit_6";"OrganizationUnit_7";"date"
В конце недели, необходимо объединить все файлы (за неделю):
$csv = "C:\Pings\Ping_$CurrentDate.csv"
в один файл:
$csv = "C:\Pings\By_week\Ping_$CurrentDate.csv"
После этого удалить файлы (оставить только недельный).
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.