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

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

Griboed0ff 28-09-2021 16:22 2967717

Узнать сумму аптаймов за последнюю неделю
 
Доброго времени суток! Ищу варианты удаленно узнать сумму аптаймов за последнюю неделю. ПК выключается каждый день поэтому просто аптайм не подходит, надо узнать сколько часов отработал удаленный пк за неделю. Отлично было бы сделать это чем-то встроенным типа powershell или легковесной утилитой, мб в реестре где хранится данная инфа. Есть какие-либо идеи? ПК много и поэтому ручные методы не подходят.

Iska 28-09-2021 17:17 2967724

Griboed0ff, а Вы никак не узнаете. Включили машину — запись в логе. Выключили машину — запись в логе. Вырубился свет — нет записи в логе :).

А так — да, powershell. Опросить машины на предмет получения из журналов событий записей о старте ОС и завершении работы ОС. Посчитать разницу для каждой пары событий. Просуммировать. Вывести результат.

P.S. Попросите модератора перести тему в скрипты: думаю, там быстрее напишут.

Griboed0ff 28-09-2021 17:25 2967726

Цитата:

Цитата Iska
А так — да, powershell. »

Да уже накидал команду для пошика:
Код:

Get-WinEvent -ProviderName eventlog | Where-Object {$_.Id -eq 6005 -and $_.TimeCreated -gt (Get-Date).AddDays(-7) -or $_.Id -eq 6006 -and $_.TimeCreated -gt (Get-Date).AddDays(-7)}
осталось как-то суммировать это.

Griboed0ff 28-09-2021 18:31 2967731

ответ команды
Код:

ProviderName: EventLog

TimeCreated                    Id LevelDisplayName Message                                                                                                                         
-----------                    -- ---------------- -------                                                                                                                         
28.09.2021 8:16:45            6005 Сведения        Запущена служба журнала событий.                                                                                               
27.09.2021 21:08:39          6006 Сведения        Служба журнала событий остановлена.                                                                                             
27.09.2021 8:08:03            6005 Сведения        Запущена служба журнала событий.                                                                                               
26.09.2021 20:28:19          6006 Сведения        Служба журнала событий остановлена.                                                                                             
26.09.2021 9:29:42            6005 Сведения        Запущена служба журнала событий.                                                                                               
25.09.2021 21:18:05          6006 Сведения        Служба журнала событий остановлена.                                                                                             
25.09.2021 7:49:16            6005 Сведения        Запущена служба журнала событий.                                                                                               
24.09.2021 21:07:55          6006 Сведения        Служба журнала событий остановлена.                                                                                             
24.09.2021 6:59:31            6005 Сведения        Запущена служба журнала событий.                                                                                               
23.09.2021 21:06:12          6006 Сведения        Служба журнала событий остановлена.                                                                                             
23.09.2021 8:22:31            6005 Сведения        Запущена служба журнала событий.                                                                                               
23.09.2021 8:15:28            6005 Сведения        Запущена служба журнала событий.                                                                                               
22.09.2021 21:15:39          6006 Сведения        Служба журнала событий остановлена.                                                                                             
22.09.2021 8:19:39            6005 Сведения        Запущена служба журнала событий.                                                                                               
21.09.2021 21:19:00          6006 Сведения        Служба журнала событий остановлена.                                                                                             
21.09.2021 8:33:47            6005 Сведения        Запущена служба журнала событий.



Осталось взять значения одной даты, из 6006 вычесть 6005.
Если значений 3, то из дублирующихся значений выбрать: если это 6005 значение, то более ранее, если 6006 то более позднее.
А вот если значений не хватает, например, аварийное выключение пк или вообще не выключают пк на ночь то будет большой аптайм, тогда мои наброски не работают. Пока не знаю как логически это организовать..

Griboed0ff 28-09-2021 19:03 2967735

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

Iska 28-09-2021 20:42 2967741

Цитата:

Цитата Griboed0ff
А вот если значений не хватает, например, аварийное выключение пк или вообще не выключают пк на ночь то »

…то самым простым выходом будет тупо добавлять разницу до конца рабочего времени в этот день. Особо тут не придумаешь.

А ещё некоторые не выключают машину месяцами :).

DJ Mogarych 28-09-2021 21:46 2967745

Для таких задач существуют системы мониторинга, например, Zabbix.

Griboed0ff 29-09-2021 07:30 2967760

Цитата:

Цитата Iska
А ещё некоторые не выключают машину месяцами . »

Есть такие, но задача больше в том, чтобы вычислить наиболее неиспользуемые пк.
Цитата:

Цитата DJ Mogarych
Для таких задач существуют системы мониторинга, например, Zabbix. »

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

Griboed0ff 29-09-2021 12:12 2967776

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

alpap 29-09-2021 17:29 2967794

всегда нужен азимут

Iska 29-09-2021 20:40 2967805

Цитата:

Цитата Griboed0ff
…вычислить наиболее неиспользуемые пк. »

ГенДира ;)?

DJ Mogarych 29-09-2021 22:25 2967813

Цитата:

Цитата Griboed0ff
никто готовить не будет »

Цитата:

Цитата Griboed0ff
мне туда доступ не дадут »

Цитата:

Цитата Griboed0ff
как всегда решаю задачу на коленке »

Странная у вас организация... ну поднимайте свою систему мониторинга, как вы уже делали базу данных.

Griboed0ff 30-09-2021 17:52 2967845

Цитата:

Цитата DJ Mogarych
поднимайте свою систему мониторинга »

Данные нужно получить за прошлый период, в котором я еще не придумал мониторинг.

DJ Mogarych 30-09-2021 21:32 2967853

Это нереально, даже если через какой-то страшный геморрой заниматься анализом логов со всех машин. Нормальных, сколько-нибудь достоверных данных получить не удастся.

Griboed0ff 01-10-2021 19:56 2967884

Цитата:

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

У нас либо машины не выключают совсем, а значит используют, чтобы это не значило, либо выключают на ночь, а значит время отсутствия записей в журнале "система" будет значительным, либо включают раз в ~месяц и по журналу это видно. Учитывая это я составил скрипт, который высчитывает время значительного отсутствия записей в журнале и на основе это высчитан ~аптайм. Так как мне нужно вычислить наименее используемые машины, то точность данного результата меня устраивает.
Цитата:

Цитата DJ Mogarych
геморрой »

это даже прикольно иногда..

За индуский код соррян :D
сам скрипт:
Код:

$dates = @(0..90)
foreach ($date in $dates){
$0 = (Get-Date).AddDays(-$date).ToShortDateString()
$CurrentTime = [System.DateTime]::Parse(((Get-Date).AddDays(-$date)).ToString("yyyy.MM.dd"))
$Time = [System.Timespan]::Parse("00:00:01")
$adddate = $CurrentTime.Add($Time)
$CurrentTime2 = [System.DateTime]::Parse(((Get-Date).AddDays(-$date)).ToString("yyyy.MM.dd"))
$Time2 = [System.Timespan]::Parse("23:59:59")
$adddate2 = $CurrentTime2.Add($Time2)
$add = Get-Eventlog -logname System | Where-Object {$_.TimeGenerated.ToShortDateString() -eq $0}
$add1 = @([pscustomobject]@{Index='00000';EntryType='00000';InstanceId='00000';Message='00000';Category='00000';CategoryNumber='00000';ReplacementStrings='00000';Source='00000';TimeGenerated=$adddate;TimeWritten='00000';UserName='00000';})
$add2 = @([pscustomobject]@{Index='00000';EntryType='00000';InstanceId='00000';Message='00000';Category='00000';CategoryNumber='00000';ReplacementStrings='00000';Source='00000';TimeGenerated=$adddate2;TimeWritten='00000';UserName='00000';})
$1 = $add + $add1 + $add2 | Sort-Object {Get-Date $_.TimeGenerated} -Descending
Clear-Variable -Name allsec, summ -Force -ErrorAction SilentlyContinue
$allsec = @(for ($index = 0; $index -lt $1.Count; $index++)
{if ($1.TimeGenerated[$index + 1] -ne $null -and $1.TimeGenerated[$index] -ne $1.TimeGenerated[$index + 1] ){
$2 = $1.TimeGenerated[$index] - $1.TimeGenerated[$index + 1]
if ($2.TotalSeconds -gt 5400){$2.TotalSeconds}}})
$allsec| foreach {$summ += $_}
$3 = ((86400 - $summ) - 2)
$ts =  [timespan]::fromseconds($3)
$4 = "{0:HH:mm:ss}" -f ([datetime]$ts.Ticks)
Write-Host $0 uptime $4}

В этом примере я смотрел данные за три квартала. Время значительного отсутствия записей в данном случае 1.5 часа (можно и поиграться). Кусок результата:
Код:

01.10.2021 uptime 09:09:13
30.09.2021 uptime 11:01:59
29.09.2021 uptime 00:00:00
28.09.2021 uptime 09:25:00
27.09.2021 uptime 09:45:47
26.09.2021 uptime 03:16:45
25.09.2021 uptime 05:43:20
24.09.2021 uptime 11:09:27
23.09.2021 uptime 10:45:19
22.09.2021 uptime 06:37:43
21.09.2021 uptime 06:42:10
20.09.2021 uptime 07:13:36
19.09.2021 uptime 06:30:18
18.09.2021 uptime 04:13:50
17.09.2021 uptime 09:14:27
16.09.2021 uptime 10:30:12
15.09.2021 uptime 14:10:59
14.09.2021 uptime 07:49:47
13.09.2021 uptime 08:16:49
12.09.2021 uptime 00:00:00
11.09.2021 uptime 00:00:00
10.09.2021 uptime 00:00:00

В данном случае показан результат на каждую из дат.
На данном этапе немного завис.. Мне нужно записывать результат в таблицу: каждая дата имя столбца и соответственно результат аптайм. Так как период дат может быть разный, пока не сообразил как составить таблицу.
На счет удаленных машин, планирую этот кусок кода выполнять через invoke-comand, а забирать только результат в виде переменной, которая таблица, которую я еще не придумал как сделать. Плюс использовать workflow для параллельных процессов.

Griboed0ff 01-10-2021 20:38 2967890

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

Цитата:

Цитата Iska
ГенДира ? »

кстати у таких должностей аптаймы очень даже большие, но юмор понятен :D

Iska 01-10-2021 20:42 2967893

Griboed0ff, то, что пытаетесь — уже плюс. Пусть даже и не получится. Попутные знания, полученные в процессе, не будут лишними.

Цитата:

Цитата Griboed0ff
кстати у таких должностей аптаймы очень даже большие, но юмор понятен :D »

Ну, там надо список процессов, какие окна были на переднем плане, Click-per-second от мышки и клавиатуры и т.п. Ну, Вы поняли ;).

Griboed0ff 01-10-2021 23:28 2967907

Цитата:

Цитата Iska
Пусть даже и не получится. »

Уже почти получилось! Результат уже есть, а его форматирование - мелочи.
Цитата:

Цитата Iska
там надо список процессов, какие окна были на переднем плане »

Цель не пк управляющих должностей, а этих должностей очень много.. Есть много пк на торговых точках, которые просто пылятся на рабочем месте, а могут выполнять рабочую функцию. Где-то этих пк не хватает, а они имеют свойство быстро терять удовлетворение требованиям ПО со временем. А сотрудники при опросе всегда вам скажут, что им не хватает пк , так как пк всегда чем-то заняты. И вообще пришлите нам больше пк и сделайте больше рабочих мест, но при простой проверке оказывается, что из 5-6 пк используются всего 1, 2 или 3, и эта ситуация повсеместна. Поэтому странные запросы неотвратимы и хотелось бы автоматизировать многие процессы, каким геморроем бы это не казалось. Другой вопрос почему админская часть не решит эту задачу каким-нибудь мониторингом типа заббикса, но у них там видите ли другие задачи, поэтому вы видите странные темы на форуме созданные мною, но большая часть решилась и я немного развиваюсь!


Цитата:

Цитата Griboed0ff
Мне нужно записывать результат в таблицу: каждая дата имя столбца и соответственно результат аптайм. Так как период дат может быть разный, пока не сообразил как составить таблицу. »

Если у кого есть идеи, подскажите, буду рад!

DJ Mogarych 02-10-2021 21:44 2967958

Цитата:

Цитата Griboed0ff
каждая дата имя столбца и соответственно результат аптайм »

Я вот тут реализовал подобное: http://forum.oszone.net/post-2967307.html#post2967307

Griboed0ff 07-10-2021 16:43 2968255

Цитата:

Цитата DJ Mogarych
Я вот тут реализовал подобное »

Несколько раз смотрел код и не понял ничего, но спасибо!
За то пришла идея своего решения: я просто каждый цикл добавляю значения в хеш таблицу, далее в pscustomobject, экспорт в таблицу. Получается нужный результат, на локальном ПК, но мне нужно делать эти вычисления на удаленных машинах, а получать только результат.
Далее я завернул это в invoke сессию и хотел получать от сессии только хеш таблицу и даже получил, но с одним минусом. Минус в том, что порядок столбцов поменялся, хотя я указывал [ordered] и это работало для локального использования, но когда получаю таблицу из сессии то порядок меняется, как будь-то свойство [ordered] теряет силу.
Позже подумал, да и ладно, могу же получить сразу pscustomobject и сделал это, но и тут косяк, но совсем небольшой. В таблицу добавляются данные, которые мне не нужны, три столбца в конце.
То есть у меня всегда какие-то проблемы с получением данных из invoke сессии в нужном виде. Меня уже устраивает результат, но я и в будущем в других задачах хочу получать данные из сессий, поэтому надо бы разобраться.
скрипт
Код:

$outfile = "D:\PowerShell\uptime\test.csv"
$comp = "r48-ser"
$s = New-PSSession $comp
Invoke-Command -Session $s {
$dates = @(0..7)
$hashtable = [ordered]@{computername = $env:COMPUTERNAME}
foreach ($date in $dates){
$0 = (Get-Date).AddDays(-$date).ToShortDateString()
$CurrentTime = [System.DateTime]::Parse(((Get-Date).AddDays(-$date)).ToString("yyyy.MM.dd"))
$Time = [System.Timespan]::Parse("00:00:01")
$adddate = $CurrentTime.Add($Time)
$CurrentTime2 = [System.DateTime]::Parse(((Get-Date).AddDays(-$date)).ToString("yyyy.MM.dd"))
$Time2 = [System.Timespan]::Parse("23:59:59")
$adddate2 = $CurrentTime2.Add($Time2)
$add = Get-Eventlog -logname System | Where-Object {$_.TimeGenerated.ToShortDateString() -eq $0}
$add1 = @([pscustomobject]@{Index='00000';EntryType='00000';InstanceId='00000';Message='00000';Category='00000';CategoryNumber='00000';ReplacementStrings='00000';Source='00000';TimeGenerated=$adddate;TimeWritten='00000';UserName='00000';})
$add2 = @([pscustomobject]@{Index='00000';EntryType='00000';InstanceId='00000';Message='00000';Category='00000';CategoryNumber='00000';ReplacementStrings='00000';Source='00000';TimeGenerated=$adddate2;TimeWritten='00000';UserName='00000';})
$1 = $add + $add1 + $add2 | Sort-Object {Get-Date $_.TimeGenerated} -Descending
Clear-Variable -Name allsec, summ -Force -ErrorAction SilentlyContinue
$allsec = @(for ($index = 0; $index -lt $1.Count; $index++)
{if ($1.TimeGenerated[$index + 1] -ne $null -and $1.TimeGenerated[$index] -ne $1.TimeGenerated[$index + 1] ){
$2 = $1.TimeGenerated[$index] - $1.TimeGenerated[$index + 1]
if ($2.TotalSeconds -gt 5400){$2.TotalSeconds}}})
$allsec| foreach {$summ += $_}
$3 = ((86400 - $summ) - 2)
$ts =  [timespan]::fromseconds($3)
$4 = "{0:HH:mm:ss}" -f ([datetime]$ts.Ticks)
Write-Host $0 uptime $4
$hashtable.Add($0,$4)
$ps_object = [pscustomobject]$hashtable
}}
$table = Invoke-Command -Session $s {$ps_object}
$table |export-csv $outfile -notype -enc utf8 -d ';' -append


пример результата
Код:

computername        07.10.2021        06.10.2021        05.10.2021        PSComputerName        RunspaceId        PSShowComputerName       
r48-ser        18:30:06        23:59:58        23:59:58        r48-ser        7bde3992-2ff9-4499-a9e2-60b244e9c6b7        True


Как получать данные из сесии в хеш таблицах, но чтобы порядок столбцов не сбивался?!
Или как не получать в pscustomobject не нужные данные, которые так же появились именно при запросе из сессии?!
МБ вообще есть еще решения, которые будут полезны?!

alpap 07-10-2021 21:58 2968282

ничего нигде сбиваться не должно
Код:

$hashtable        = [Ordered]@{}
$Name            = 'C'
$Value            = 'B'
$hashtable[$Name] = $Value
$Name            = 'D'
$Value            = 'A'
$hashtable[$Name] = $Value
$hashtable|fl

$ohash = [PSCustomObject]$hashtable
$ohash|fl


Griboed0ff 08-10-2021 18:27 2968317

Цитата:

Цитата alpap
ничего нигде сбиваться не должно »

Либо я не понял вас, либо вы не вникли.
привожу пример:
Код:

$dates = @(0..7) # диапозон дат, тут могу вставить любое количество дат
$hashtable = [ordered]@{computername = $env:COMPUTERNAME}
foreach ($date in $dates){
$0 # имя столбца, в каждой итерации разное, то есть их может быть от 1 до бесконечности
$4 # значение столбца $0 в этой итерации
$hashtable.Add($0,$4) # добавляю в таблицу столбец со значением
}
$hashtable # получаю правильную таблицу, с нужным порядком

Правильная таблица - одна строка, начинается с имени пк, далее множество столбцов с датами в именах столбцов и значениями в строке, расположенных по порядку добавления в таблицу.
Но когда я выполняю код на удаленном пк через invoke и получаю таблицу, то порядок столбцов меняется на такой как будь-то я не проставил ordered перед созданием таблицы, пример:
Код:

$s = New-PSSession $comp # создаю сессию, в которой буду выполнять код
Invoke-Command -Session $s { # далее сам выполняемый код
$dates = @(0..7) # диапозон дат, тут могу вставить любое количество дат
$hashtable = [ordered]@{computername = $env:COMPUTERNAME}
foreach ($date in $dates){
$0 # имя столбца, в каждой итерации разное, то есть их может быть и от 1 до бесконечности
$4 # значение столбца $0 в этой итерации
$hashtable.Add($0,$4) # добавляю в таблицу столбец со значением
}}
$table = Invoke-Command -Session $s {$hashtable} # запрашиваю таблицу из сессии от удаленного пк
$table # таблица с неправильным порядком столбцов.

Причем, если отобразить финальную таблицу еще в сессии на удаленном пк, то она правильная. Но после того как я ее полую на свой пк, то приходит уже поломанная.
То есть таблица ломается именно тут:
Код:

$table = Invoke-Command -Session $s {$hashtable}

alpap 08-10-2021 23:44 2968340

ну тогда просто отсортируйте как вам надо:
Код:

$hashTable = @{
 Name1 = 'ValueA'
 Name2 = 'ValueB'
 Name3 = 'ValueC'
}
$hashTable
'---'
$hashTable.GetEnumerator()|% {'{0} {1}' -f $_.Key, $_.Value}|sort
'---'
$m1 = $hashTable.Keys|foreach {$_}|sort
$m2 = $hashTable.Values|foreach {$_}|sort -desc

for ($i=0; $i -lt $m1.count; $i++) {
  $m1[$i]+' = '+$m2[$i]
}


Griboed0ff 17-11-2021 08:58 2972216

Остановился на своем варианте: передавать через invoke сессию не хеш таблицу, а pscustomobject, не сбивается сортировка.
Итоговый скрипт
Код:

$outfile = "D:\PowerShell\uptime\test.csv"
$comp = "r48-ser"
$s = New-PSSession $comp
Invoke-Command -Session $s {
$dates = @(0..7)
$hashtable = [ordered]@{computername = $env:COMPUTERNAME}
foreach ($date in $dates){
$0 = (Get-Date).AddDays(-$date).ToShortDateString()
$CurrentTime = [System.DateTime]::Parse(((Get-Date).AddDays(-$date)).ToString("yyyy.MM.dd"))
$Time = [System.Timespan]::Parse("00:00:01")
$adddate = $CurrentTime.Add($Time)
$CurrentTime2 = [System.DateTime]::Parse(((Get-Date).AddDays(-$date)).ToString("yyyy.MM.dd"))
$Time2 = [System.Timespan]::Parse("23:59:59")
$adddate2 = $CurrentTime2.Add($Time2)
$add = Get-Eventlog -logname System | Where-Object {$_.TimeGenerated.ToShortDateString() -eq $0}
$add1 = @([pscustomobject]@{Index='00000';EntryType='00000';InstanceId='00000';Message='00000';Category='00000';CategoryNumber='00000';ReplacementStrings='00000';Source='00000';TimeGenerated=$adddate;TimeWritten='00000';UserName='00000';})
$add2 = @([pscustomobject]@{Index='00000';EntryType='00000';InstanceId='00000';Message='00000';Category='00000';CategoryNumber='00000';ReplacementStrings='00000';Source='00000';TimeGenerated=$adddate2;TimeWritten='00000';UserName='00000';})
$1 = $add + $add1 + $add2 | Sort-Object {Get-Date $_.TimeGenerated} -Descending
Clear-Variable -Name allsec, summ -Force -ErrorAction SilentlyContinue
$allsec = @(for ($index = 0; $index -lt $1.Count; $index++)
{if ($1.TimeGenerated[$index + 1] -ne $null -and $1.TimeGenerated[$index] -ne $1.TimeGenerated[$index + 1] ){
$2 = $1.TimeGenerated[$index] - $1.TimeGenerated[$index + 1]
if ($2.TotalSeconds -gt 5400){$2.TotalSeconds}}})
$allsec| foreach {$summ += $_}
$3 = ((86400 - $summ) - 2)
$ts =  [timespan]::fromseconds($3)
$4 = "{0:HH:mm:ss}" -f ([datetime]$ts.Ticks)
Write-Host $0 uptime $4
$hashtable.Add($0,$4)
$ps_object = [pscustomobject]$hashtable
}}
$table = Invoke-Command -Session $s {$ps_object}
$table |export-csv $outfile -notype -enc utf8 -d ';' -append


Iska 17-11-2021 17:41 2972275

Griboed0ff, коллега, фолдинг — не наш метод?

Griboed0ff 23-11-2021 19:55 2972965

Iska, не пользовался никогда. Как видите увлекаюсь индусским легаси кодом :D, но думаю это вылечится при постижении python и json!

YuS_2 24-11-2021 09:38 2973035

Цитата:

Цитата Griboed0ff
не пользовался никогда »

очень зря, причем в любом коде... фолдинг... кроме того, форматирование, тоже облегчает восприятие кода.


Время: 07:33.

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