Автор Тема: Скрипт для проверки в какое время стартует комп.  (Прочитано 191 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн 2site

  • Постоялец
  • ***
  • Сообщений: 170
  • Рейтинг: 0
  • Пол: Мужской
    • Просмотр профиля
  • Откуда: Москва
Приветствую всех. Мне нужен отчет о времени запуска системы компьютеров в компании, то есть кто в какой время запустился. Пока в голову приходит скрипт при автозапуске, который будет доставать данные из eventloog 6005 и ложить их куда-то в шару в txt. У кого-то есть лучше предложения или как сделать проще?

Онлайн Retif

  • Администраторы
  • Олдфаг
  • *****
  • Сообщений: 7971
  • Рейтинг: 81
  • Пол: Мужской
  • Афтар
    • Просмотр профиля
    • Мой блог
  • Откуда: Орёл-Москва
Пока в голову приходит скрипт при автозапуске, который будет доставать данные из eventloog 6005 и ложить их куда-то в шару в txt.
:mrgreen:
А если скрипт запускается при запуске компьютера, зачем ему в eventlog лезть, почему нельзя сразу в шару писать время? ))
Или тогда уже, не ждать запска, а просто обходить скриптом компы периодисеки, находить в логах событие 6005 и писать себе куда-то :)

Оффлайн sirarthur

  • Постоялец
  • ***
  • Сообщений: 440
  • Рейтинг: 4
  • Пол: Мужской
    • Просмотр профиля
  • Откуда: sub-MSK
а если комп не будут выключать?  :pardon:

Оффлайн 2site

  • Постоялец
  • ***
  • Сообщений: 170
  • Рейтинг: 0
  • Пол: Мужской
    • Просмотр профиля
  • Откуда: Москва
Или тогда уже, не ждать запска, а просто обходить скриптом компы периодисеки, находить в логах событие 6005 и писать себе куда-то
Мне больше подходит вариант с запуском скрипта который достает инфу из лога 6005 и кладет ее в шару. Сейчас буду искать в интрнете чет подобное, если у кого-то есть линки на похожий скрипт, буду благодарен.

Оффлайн 2site

  • Постоялец
  • ***
  • Сообщений: 170
  • Рейтинг: 0
  • Пол: Мужской
    • Просмотр профиля
  • Откуда: Москва
Вот получилось у меня как-то так:
Get-EventLog -LogName System | where {$_.eventID -eq 6005} | ?{$_.timegenerated -gt [datetime]::Today} | fl *timegenerated*
но я не могу докумекать как сделать, чтобы теперь параметр out-file ложил его в определенный csv, где будет в одну колонку записывать %computername%, а во вторую колонку результат выполнения вышеуказанной команды. Кто-то подскажет? Да и как-то можно решить с одновременной записью множества юзеров в 1 файл csv?

Онлайн Retif

  • Администраторы
  • Олдфаг
  • *****
  • Сообщений: 7971
  • Рейтинг: 81
  • Пол: Мужской
  • Афтар
    • Просмотр профиля
    • Мой блог
  • Откуда: Орёл-Москва
но я не могу докумекать как сделать, чтобы теперь параметр out-file ложил его в определенный csv, где будет в одну колонку записывать %computername%, а во вторую колонку результат выполнения вышеуказанной команды. Кто-то подскажет? Да и как-то можно решить с одновременной записью множества юзеров в 1 файл csv?

Зачем одновременная запись, если ты обходишь компы? У тебя должен быть список компов, ты его откуда-то берешь. Либо из AD, либо из своего списка.
Потом циклом этот список перебираешь, выполняешь на компе из списка свою команду и результат кладешь в файл.

Как-то так, не проверял:
$computers = @'
comp01
comp02
comp03
'@ -split "`r`n"

$comps = @( $computers | Foreach-Object { return Get-ADComputer $_ } )

ForEach ($c in $comps) {
    $text = Get-EventLog -ComputerName $c -LogName System | where {$_.eventID -eq 6005} | ?{$_.timegenerated -gt [datetime]::Today} | fl *timegenerated*

    $line = "$($c)`t$($text)"

    Out-File -Append -FilePath 'С:\ListCompiters.csv' -Encoding UTF32  -InputObject $line
}



Updated: 15 November 2017, 13:27:45

UTF32 для того, чтобы CSV можно было открыть сразу в Excel.
« Последнее редактирование: 15 Ноября 2017, 13:54:24 от Retif »

Оффлайн 2site

  • Постоялец
  • ***
  • Сообщений: 170
  • Рейтинг: 0
  • Пол: Мужской
    • Просмотр профиля
  • Откуда: Москва
У тебя должен быть список компов, ты его откуда-то берешь
Я использую одну систему под названием Lansweeper, она мне генерирует список нужных компов и она запускает этот скрипт на каждом компе из списка. По этому мне не нужно в скрипте указывать список или откуда-то ссылаться на него, а нужно чтобы скрипт просто генерировал выполнение указанной команды и результат ложил в шару учитывая что скрипт будет запускаться на каждом компе отдельно. Ссылаясь на это немного подправил скрипт, получилось так:
ForEach ($c in $env:computername) {
    $text = Get-EventLog -LogName System | where {$_.eventID -eq 6005} | ?{$_.timegenerated -gt [datetime]::Today} | fl *timegenerated*

    $line = "$($c)`t$($text)"

    Out-File -Append -FilePath '\\telerate\TEMP\akuc\ListCompiters.csv' -Encoding UTF32  -InputObject $line
}

Получилось так что в сгенерированном csv первое поле правильно указывает название компа, а второе поле выдает я так понимаю ошибку формата powershel: "Microsoft.PowerShell.Commands.Internal.Format.FormatStartData"

Пока пытаюсь понять что не так было указано.


Updated: 15 November 2017, 16:45:32

"Microsoft.PowerShell.Commands.Internal.Format.FormatStartData"
Это решил ключем Out-String, но теперь у меня результат в разных строках :)
« Последнее редактирование: 15 Ноября 2017, 16:46:07 от 2site »

Онлайн Retif

  • Администраторы
  • Олдфаг
  • *****
  • Сообщений: 7971
  • Рейтинг: 81
  • Пол: Мужской
  • Афтар
    • Просмотр профиля
    • Мой блог
  • Откуда: Орёл-Москва
Ссылаясь на это немного подправил скрипт, получилось так:
Цикл-то зачем тогда, в этом случае?

Просто так:

$text = Get-EventLog -LogName System | where {$_.eventID -eq 6005} | ?{$_.timegenerated -gt [datetime]::Today} | fl *timegenerated*

$line = "$($env:computername)`t$($text)"

Out-File -Append -FilePath '\\telerate\TEMP\akuc\ListCompiters.csv' -Encoding UTF32  -InputObject $line



Updated: 15 November 2017, 17:48:06

Это решил ключем Out-String, но теперь у меня результат в разных строках
Не, это не так надо.




Updated: 15 November 2017, 17:51:03

Вот так:
$text = @(Get-EventLog -LogName System -Source EventLog -EntryType Information | where {$_.eventID -eq 6005} | ?{$_.timegenerated -gt [datetime]::Today} | Foreach-Object {return $_.TimeGenerated} )

$line = "$($env:computername)`t$($text)"

Out-File -Append -FilePath 'D:\ListComputers.csv' -Encoding UTF32  -InputObject $line

И фильтр лучше добавить в get-eventlog -Source и что там еще возможно, а то медленно работает, весь System лопатит.
« Последнее редактирование: 16 Ноября 2017, 15:20:57 от Retif »

Оффлайн 2site

  • Постоялец
  • ***
  • Сообщений: 170
  • Рейтинг: 0
  • Пол: Мужской
    • Просмотр профиля
  • Откуда: Москва
Вот так:
Код: [Выделить]
$text = @(Get-EventLog -LogName System | where {$_.eventID -eq 6005} | ?{$_.timegenerated -gt [datetime]::Today} | % {return $_.TimeGenerated} )

$line = "$($env:computername)`t$($text)"

Out-File -Append -FilePath 'D:\ListComputers.csv' -Encoding UTF32  -InputObject $line

Вообще отлично, как надо прям. Спасибо.

Онлайн Retif

  • Администраторы
  • Олдфаг
  • *****
  • Сообщений: 7971
  • Рейтинг: 81
  • Пол: Мужской
  • Афтар
    • Просмотр профиля
    • Мой блог
  • Откуда: Орёл-Москва
Вот так как-то совсем быстро получается:
Get-EventLog -LogName System -Source EventLog -EntryType Information -Newest 10 | Where-Object {$_.eventID -eq 6005} | ?{$_.timegenerated -gt [datetime]::Today}


Updated: 16 November 2017, 14:50:28

А-а, нет. Это он просто 10 последних логов берет в принципе, а не тех, которые нам нужны. Только просто -Source EventLog -EntryType Information добавить, хотя бы, всё меньше искать.
« Последнее редактирование: 16 Ноября 2017, 15:16:26 от Retif »