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

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

Ответить
Настройки темы
PowerShell - [решено] Узнать сумму аптаймов за последнюю неделю

Старожил


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

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


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

Отправлено: 16:22, 28-09-2021

 

Ветеран


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

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


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

Отправлено: 20:40, 29-09-2021 | #11



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

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


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

fascinating rhythm


Moderator


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

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


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

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


Отправлено: 22:25, 29-09-2021 | #12


Старожил


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

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


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

Отправлено: 17:52, 30-09-2021 | #13


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

fascinating rhythm


Moderator


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

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


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

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


Отправлено: 21:32, 30-09-2021 | #14


Старожил


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

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


Цитата 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 в 23:41.

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

Отправлено: 19:56, 01-10-2021 | #15


Старожил


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

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


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

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

Отправлено: 20:38, 01-10-2021 | #16


Ветеран


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

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


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

Цитата Griboed0ff:
кстати у таких должностей аптаймы очень даже большие, но юмор понятен :D »
Ну, там надо список процессов, какие окна были на переднем плане, Click-per-second от мышки и клавиатуры и т.п. Ну, Вы поняли .

Отправлено: 20:42, 01-10-2021 | #17


Старожил


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

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


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


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

Последний раз редактировалось Griboed0ff, 01-10-2021 в 23:39.


Отправлено: 23:28, 01-10-2021 | #18


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

fascinating rhythm


Moderator


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

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


Цитата Griboed0ff:
каждая дата имя столбца и соответственно результат аптайм »
Я вот тут реализовал подобное: http://forum.oszone.net/post-2967307.html#post2967307

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


Последний раз редактировалось DJ Mogarych, 02-10-2021 в 21:50.

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

Отправлено: 21:44, 02-10-2021 | #19


Старожил


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

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


Цитата 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 не нужные данные, которые так же появились именно при запросе из сессии?!
МБ вообще есть еще решения, которые будут полезны?!

Последний раз редактировалось Griboed0ff, 07-10-2021 в 21:13.


Отправлено: 16:43, 07-10-2021 | #20



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

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

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
HDD - [решено] Умирает 2-ой диск за неделю walcot Накопители (SSD, HDD, USB Flash) 7 16-03-2021 09:47
HDD - За одну неделю два диска в RAW surgutfred Накопители (SSD, HDD, USB Flash) 2 17-12-2018 10:51
Разное - [решено] Как узнать последнюю версию видеодрайвера? Алекс-01 Microsoft Windows 10 2 27-06-2018 18:03
Решение контрольных работ за определенную сумму? VbInt Флейм 2 21-01-2011 00:16
Конфигурация за неуказанную сумму для неизвестного применения kuson Выбор отдельных компонентов компьютера и конфигурации в целом 61 22-06-2009 00:41




 
Переход