Показать полную графическую версию : [решено] Узнать сумму аптаймов за последнюю неделю
Griboed0ff
28-09-2021, 16:22
Доброго времени суток! Ищу варианты удаленно узнать сумму аптаймов за последнюю неделю. ПК выключается каждый день поэтому просто аптайм не подходит, надо узнать сколько часов отработал удаленный пк за неделю. Отлично было бы сделать это чем-то встроенным типа powershell или легковесной утилитой, мб в реестре где хранится данная инфа. Есть какие-либо идеи? ПК много и поэтому ручные методы не подходят.
Griboed0ff, а Вы никак не узнаете. Включили машину — запись в логе. Выключили машину — запись в логе. Вырубился свет — нет записи в логе :).
А так — да, powershell. Опросить машины на предмет получения из журналов событий записей о старте ОС и завершении работы ОС. Посчитать разницу для каждой пары событий. Просуммировать. Вывести результат.
P.S. Попросите модератора перести тему в скрипты: думаю, там быстрее напишут.
Griboed0ff
28-09-2021, 17:25
А так — да, 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
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
возможно стоит выгрузить из журнала еще какие-то события, которые могли бы указать на использование пк, на случай когда пк аварийно выключился и включился только через несколько дней..
А вот если значений не хватает, например, аварийное выключение пк или вообще не выключают пк на ночь то »
…то самым простым выходом будет тупо добавлять разницу до конца рабочего времени в этот день. Особо тут не придумаешь.
А ещё некоторые не выключают машину месяцами :).
DJ Mogarych
28-09-2021, 21:46
Для таких задач существуют системы мониторинга, например, Zabbix.
Griboed0ff
29-09-2021, 07:30
А ещё некоторые не выключают машину месяцами . »
Есть такие, но задача больше в том, чтобы вычислить наиболее неиспользуемые пк. Для таких задач существуют системы мониторинга, например, Zabbix. » И такой даже есть, но в нем нет готового отчета и как всегда для меня его никто готовить не будет, а мне туда доступ не дадут. Поэтому как всегда решаю задачу на коленке..
Griboed0ff
29-09-2021, 12:12
Возникла идея считать время отсутствия записей в журнале системы, которое больше чем час или два. Но как это реализовать пока даже нет идей.
…вычислить наиболее неиспользуемые пк. »
ГенДира ;)?
DJ Mogarych
29-09-2021, 22:25
никто готовить не будет »
мне туда доступ не дадут »
как всегда решаю задачу на коленке »
Странная у вас организация... ну поднимайте свою систему мониторинга, как вы уже делали базу данных.
Griboed0ff
30-09-2021, 17:52
поднимайте свою систему мониторинга »
Данные нужно получить за прошлый период, в котором я еще не придумал мониторинг.
DJ Mogarych
30-09-2021, 21:32
Это нереально, даже если через какой-то страшный геморрой заниматься анализом логов со всех машин. Нормальных, сколько-нибудь достоверных данных получить не удастся.
Griboed0ff
01-10-2021, 19:56
Это нереально, даже если через какой-то страшный геморрой заниматься анализом логов со всех машин. Нормальных, сколько-нибудь достоверных данных получить не удастся. »
У нас либо машины не выключают совсем, а значит используют, чтобы это не значило, либо выключают на ночь, а значит время отсутствия записей в журнале "система" будет значительным, либо включают раз в ~месяц и по журналу это видно. Учитывая это я составил скрипт, который высчитывает время значительного отсутствия записей в журнале и на основе это высчитан ~аптайм. Так как мне нужно вычислить наименее используемые машины, то точность данного результата меня устраивает. геморрой » это даже прикольно иногда..
За индуский код соррян :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';UserNa me='00000';})
$add2 = @([pscustomobject]@{Index='00000';EntryType='00000';InstanceId='00000';Message='00000';Category='00000';CategoryNumber ='00000';ReplacementStrings='00000';Source='00000';TimeGenerated=$adddate2;TimeWritten='00000';UserN ame='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
Сама сумма результатов уже стала не так важна, так как если получится доставить данные в таблицу в нужном виде, то сумму будет скорее всего можно будет найти.
ГенДира ? »
кстати у таких должностей аптаймы очень даже большие, но юмор понятен :D
Griboed0ff, то, что пытаетесь — уже плюс. Пусть даже и не получится. Попутные знания, полученные в процессе, не будут лишними.
кстати у таких должностей аптаймы очень даже большие, но юмор понятен :D »
Ну, там надо список процессов, какие окна были на переднем плане, Click-per-second от мышки и клавиатуры и т.п. Ну, Вы поняли ;).
Griboed0ff
01-10-2021, 23:28
Пусть даже и не получится. »
Уже почти получилось! Результат уже есть, а его форматирование - мелочи.
там надо список процессов, какие окна были на переднем плане »
Цель не пк управляющих должностей, а этих должностей очень много.. Есть много пк на торговых точках, которые просто пылятся на рабочем месте, а могут выполнять рабочую функцию. Где-то этих пк не хватает, а они имеют свойство быстро терять удовлетворение требованиям ПО со временем. А сотрудники при опросе всегда вам скажут, что им не хватает пк , так как пк всегда чем-то заняты. И вообще пришлите нам больше пк и сделайте больше рабочих мест, но при простой проверке оказывается, что из 5-6 пк используются всего 1, 2 или 3, и эта ситуация повсеместна. Поэтому странные запросы неотвратимы и хотелось бы автоматизировать многие процессы, каким геморроем бы это не казалось. Другой вопрос почему админская часть не решит эту задачу каким-нибудь мониторингом типа заббикса, но у них там видите ли другие задачи, поэтому вы видите странные темы на форуме созданные мною, но большая часть решилась и я немного развиваюсь!
Мне нужно записывать результат в таблицу: каждая дата имя столбца и соответственно результат аптайм. Так как период дат может быть разный, пока не сообразил как составить таблицу. » Если у кого есть идеи, подскажите, буду рад!
DJ Mogarych
02-10-2021, 21:44
каждая дата имя столбца и соответственно результат аптайм »
Я вот тут реализовал подобное: http://forum.oszone.net/post-2967307.html#post2967307
Griboed0ff
07-10-2021, 16:43
Я вот тут реализовал подобное »
Несколько раз смотрел код и не понял ничего, но спасибо!
За то пришла идея своего решения: я просто каждый цикл добавляю значения в хеш таблицу, далее в 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';UserNa me='00000';})
$add2 = @([pscustomobject]@{Index='00000';EntryType='00000';InstanceId='00000';Message='00000';Category='00000';CategoryNumber ='00000';ReplacementStrings='00000';Source='00000';TimeGenerated=$adddate2;TimeWritten='00000';UserN ame='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 не нужные данные, которые так же появились именно при запросе из сессии?!
МБ вообще есть еще решения, которые будут полезны?!
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.