Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   ping компьютеров из *.csv (http://forum.oszone.net/showthread.php?t=348488)

JimmLight 07-04-2021 08:22 2955078

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

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 2955099

Цитата:

Цитата DJ Mogarych
Powershell: »

Файл "yyyy-MM-dd-HH-mm-ss.csv" создаётся, но не наполняется. Он пустой.
Цитата:

Цитата DJ Mogarych
Хотя как по мне, так надо не выносить людям мозг по надуманному поводу, а решить задачу - если нужно выключать компьютеры на ночь, выключать их командой удалённо, или настроить GPO, чтобы они засыпали после часа Х. »

Я понимаю, но если руководство решило... :-)

DJ Mogarych 07-04-2021 12:55 2955101

Цитата:

Цитата JimmLight
пустой »

Значит, все компы выключены. Дополнил скрипт выше, чтобы пустого файла не создавалось.
Цитата:

Цитата JimmLight
если руководство решило »

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

JimmLight 07-04-2021 13:01 2955103

Цитата:

Цитата DJ Mogarych
Значит, все компы выключены. Дополнил скрипт выше, чтобы пустого файла не создавалось. »

Файл не создаётся.
Но некоторые компьютеры пингуются (проверено вручную).

DJ Mogarych 07-04-2021 14:17 2955113

Вставьте код в Powershell ISE и проверьте работоспособность.

Путь к User_Comp.csv правильный?

JimmLight 07-04-2021 14:17 2955114

Цитата:

Цитата DJ Mogarych
Вставьте код в Powershell ISE и проверьте работоспособность. »

Так и делаю.

DJ Mogarych 07-04-2021 14:19 2955115

У меня почему-то работает.
Код:

Import-Csv "D:\temp\User_Comp.csv" |? pager
Что-то отображает?

Команда
Код:

Test-Connection [заведомо пингующийся комп] -Count 1 -Quiet
Что выдаёт?

JimmLight 07-04-2021 14:21 2955116

Цитата:

Цитата DJ Mogarych
Что-то отображает? »

Да, содержимое "User_Comp.csv".

Цитата:

Цитата JimmLight
Что выдаёт? »

False

DJ Mogarych 07-04-2021 14:39 2955121

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

JimmLight 07-04-2021 17:23 2955151

Цитата:

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

Да.

Цитата:

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

Любой компьютер: хоть пингуется или не пингуется, всё равно выдаёт False.

DJ Mogarych 07-04-2021 19:53 2955168

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

JimmLight 08-04-2021 06:01 2955185

Цитата:

Цитата 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:48 2955191

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 2955213

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

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

JimmLight 12-04-2021 06:20 2955543

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

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

Цитата:

Цитата 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}


JimmLight 12-04-2021 11:00 2955559

Код:

$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" дату / время создания?

DJ Mogarych 12-04-2021 13:21 2955571

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

Код:

$p=[ordered]@{
"Pager"=$Computer.Pager
"IP"=$IP
"name"=$Computer.Name
"title"=$Computer.Title
"department"=$Computer.Department
"date"=$CurrentDate
}


JimmLight 14-04-2021 12:23 2955700

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

DJ Mogarych 14-04-2021 13:04 2955707

Всё начиналось с простого пинга, а теперь строим ракетный комплекс.

Цитата:

Цитата JimmLight
почему-то не выходит "canonicalName". »

А где вы задали переменную $canonicalname? Она, естественно, пустая.

Полагаю, что если вы пытаетесь решать довольно сложные задачи на Powershell, неплохо бы немножко его изучить, а не просто копипастить код с форума.

JimmLight 14-04-2021 13:13 2955710

Цитата:

А где вы задали переменную $canonicalname? Она, естественно, пустая.
Исправил. Выделил цветом, в коде.
Код:

$CurrentDate = Get-Date
$CurrentDate = $CurrentDate.ToString('dd-MMMM-yyy_HH-mm-ss')
$csv = "C:\Scripts\Ping_Computers\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"=$Computer.CanonicalName
                "date"=$CurrentDate
}
        $Obj=New-Object -Type PsObject -Property $p
        $Results.Add($Obj)
  }
}
$Results | Export-Csv  -Encoding UTF8 -Delimiter ";" -Path $csv

Цитата:

Всё начиналось с простого пинга, а теперь строим ракетный комплекс.
Ну да...
Цитата:

... неплохо бы немножко его изучить, ...
Чем и занимаюсь.

DJ Mogarych 14-04-2021 13:39 2955711

Цитата:

Цитата JimmLight
$Computer.CanonicalName »

$computer - это часть $computers, как можно понять из кода:
Код:

foreach ($computer in $Computers)
А $Computers - это
Код:

Import-Csv "C:\Scripts\Ping_Computers\User_Comp.csv"
У вас в csv есть поле CanonicalName?

JimmLight 14-04-2021 14:09 2955713

Цитата:

Цитата DJ Mogarych
У вас в csv есть поле CanonicalName? »

Да.
С этим я разобрался.
И с тем, чтобы заменить "/" на "";"" (издевательство конечно, но работает).
Теперь необходимо удалить последнее значение, которое содержит ФИО пользователя.

Вот что получилось:
Код:

$CurrentDate = Get-Date
$CurrentDate = $CurrentDate.ToString('dd.MM.yyy HH.mm')
$CurrentDateCsv = Get-Date
$CurrentDateCsv = $CurrentDateCsv.ToString('dd.MM.yyy HH:mm')
$csv = "C:\Scripts\Ping_Computers\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]@{
                "date"=$CurrentDateCsv
                "Pager"=$Computer.Pager
                "IP"=$IP
                "name"=$Computer.Name
                "title"=$Computer.Title
                "department"=$Computer.Department
                "canonicalName"=$Computer.CanonicalName
}
        $Obj=New-Object -Type PsObject -Property $p
        $Results.Add($Obj)
  }
}
$Results | Export-Csv  -Encoding UTF8 -Delimiter ";" -Path $csv
Get-ChildItem $csv | ForEach-Object { (Get-Content -Path $_.FullName) -replace '/', '";"' | Set-Content -Path $_.FullName }



Время: 08:08.

Время: 08:08.
© OSzone.net 2001-