Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » PowerShell - ping компьютеров из *.csv

Ответить
Настройки темы
PowerShell - ping компьютеров из *.csv

Новый участник


Сообщения: 47
Благодарности: 0

Профиль | Отправить PM | Цитировать


Привет всем.
Стоит следующая задача: Необходимо отследить компьютеры, которые не выключаются на ночь.
Есть 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, скриптом.

Отправлено: 08:22, 07-04-2021

 

Новый участник


Сообщения: 47
Благодарности: 0

Профиль | Отправить PM | Цитировать


Цитата DJ Mogarych:
Интересно. Пингуется, но test-connection выдаёт false? »
Да.

Цитата DJ Mogarych:
Интересно. Пингуется, но test-connection выдаёт false? »
Любой компьютер: хоть пингуется или не пингуется, всё равно выдаёт False.

Отправлено: 17:23, 07-04-2021 | #11



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

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


Аватара для DJ Mogarych

fascinating rhythm


Moderator


Сообщения: 6491
Благодарности: 1465

Профиль | Отправить PM | Цитировать


test-connection это и есть по сути пинг.
А что он выдаёт без ключа -quiet?

-------
Powershell 7.x | Powershell 5.1 | ffmpeg (docs)


Отправлено: 19:53, 07-04-2021 | #12


Новый участник


Сообщения: 47
Благодарности: 0

Профиль | Отправить PM | Цитировать


Цитата DJ Mogarych:
Интересно. Пингуется, но test-connection выдаёт false? »
Именно.

Цитата DJ Mogarych:
А что он выдаёт без ключа -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:09.


Отправлено: 06:01, 08-04-2021 | #13


Новый участник


Сообщения: 47
Благодарности: 0

Профиль | Отправить PM | Цитировать


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

Отправлено: 06:48, 08-04-2021 | #14


Аватара для DJ Mogarych

fascinating rhythm


Moderator


Сообщения: 6491
Благодарности: 1465

Профиль | Отправить PM | Цитировать


У вас почему-то неправильно работает эта команда, вот описание той же проблемы, но без решения: https://stackoverflow.com/questions/...ection-mystery

Попробуйте на другом компе.

-------
Powershell 7.x | Powershell 5.1 | ffmpeg (docs)


Отправлено: 11:00, 08-04-2021 | #15


Новый участник


Сообщения: 47
Благодарности: 0

Профиль | Отправить PM | Цитировать


Вот отличный скрипт, который делает, что нужно.
Скрытый текст

$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.

Отправлено: 06:20, 12-04-2021 | #16


Аватара для DJ Mogarych

fascinating rhythm


Moderator


Сообщения: 6491
Благодарности: 1465

Профиль | Отправить PM | Цитировать


Цитата JimmLight:
отличный скрипт, который делает, что нужно »
Он по сути ничем не отличается от моего, только более многословен.
И удивительно, что Test-Connection почему-то заработал правильно (хотя тут применён обходной вариант).
Если кто-нибудь сможет мне объяснить, почему он не работал в моём варианте, буду благодарен.

Цитата JimmLight:
можно реализовать список исключений? »
Код: Выделить весь код
$ex = (import-csv "C:\Temp\exceptions_ping.csv").pager
$Computers = Import-Csv "C:\User_Comp.csv" |? {$_.pager -and $_.pager -notin $ex}

-------
Powershell 7.x | Powershell 5.1 | ffmpeg (docs)


Последний раз редактировалось DJ Mogarych, 12-04-2021 в 09:58.

Это сообщение посчитали полезным следующие участники:

Отправлено: 09:38, 12-04-2021 | #17


Новый участник


Сообщения: 47
Благодарности: 0

Профиль | Отправить PM | Цитировать


Код: Выделить весь код
$ex = (import-csv "C:\Temp\exceptions_ping.csv").pager
$Computers = Import-Csv "C:\User_Comp.csv" |? {$_.pager -and $_.pager -notin $ex}
DJ Mogarych, работает. Спасибо.
Цитата DJ Mogarych:
Если кто-нибудь сможет мне объяснить, почему он не работал в моём варианте, буду благодарен. »
Подозреваю, что не работает лишь на моей "машине". Тестировал на других - работает. Спасибо.

Можно ли добавить в начало / конец самого файла "C:\Ping_$CurrentDate.csv" дату / время создания?

Отправлено: 11:00, 12-04-2021 | #18


Аватара для DJ Mogarych

fascinating rhythm


Moderator


Сообщения: 6491
Благодарности: 1465

Профиль | Отправить PM | Цитировать


Нежелательно, т. к. нарушается структура файла. Проще всего так:

Код: Выделить весь код
$p=[ordered]@{
"Pager"=$Computer.Pager
"IP"=$IP
"name"=$Computer.Name
"title"=$Computer.Title
"department"=$Computer.Department
"date"=$CurrentDate
}

-------
Powershell 7.x | Powershell 5.1 | ffmpeg (docs)

Это сообщение посчитали полезным следующие участники:

Отправлено: 13:21, 12-04-2021 | #19


Новый участник


Сообщения: 47
Благодарности: 0

Профиль | Отправить PM | Цитировать


Добавил в *.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"
После этого удалить файлы (оставить только недельный).

Отправлено: 12:23, 14-04-2021 | #20



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » PowerShell - ping компьютеров из *.csv

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
PowerShell - Экспорт данных из CSV в CFG Lezenford Скриптовые языки администрирования Windows 11 12-10-2016 15:17
PowerShell - [решено] Переименование компьютеров домена netdom+csv nokogerra Скриптовые языки администрирования Windows 5 07-11-2014 10:14
CMD/BAT - [решено] Периеминование файла doc.csv в Документ_дата_время.csv kagorec Скриптовые языки администрирования Windows 2 29-03-2014 18:40
Любой язык - Перенести данные из csv в html OverSense Скриптовые языки администрирования Windows 2 14-02-2014 22:11
CMD/BAT - Из csv в xls с помощью батника OverSense Скриптовые языки администрирования Windows 1 13-02-2014 18:38




 
Переход