Проверка времени работы компьютера с помощью Powershell


23 сентября 2019


Проверка времени работы компьютера с помощью Powershell

Статистика длительности работы компьютера может пригодиться для проверки работы серверов или в случае мониторинга пользователей на предмет нарушения техники безопасности (пожарной и информационной) и для многих других случаев. Такую статистику можно увидеть несколькими путями:

  1. С помощью диспетчера задач (Task Manager).
  2. С помощью Systeminfo.
  3. В логах. Например по событию 6005, которое показывает время включения хоста.
  4. С помощью класса WMI Win32_OperatingSystem, по свойству LastBootUpTime.

Lastboottime windows

Каждый из этих способов по своему удобен, но три из них теряют актуальность, если нужно проверить эти данные на множестве компьютеров. В случае с WMI такие данные можно получить с любого хоста. Я не исключаю, что такие данные можно получить с команд типа Get-NetAdapter или Get-ComputerInfo.

Следующим образом мы получим дату включения хоста используя команду CMD WMIC:

wmic path Win32_OperatingSystem get LastBootUpTime

Аналогичный результат, но используя команду получения WMI в Powershell:

Get-WmiObject Win32_OperatingSystem | Select-Object LastBootUpTime

Get-WMIObject Powershell

Мы можем различить дату, но желательно иметь сразу более человеческое представление. Можно преобразовать результат и с WMI, но в случае с CIM он сразу корректный:

Get-CimInstance Win32_OperatingSystem | select LastBootUpTime

В зависимости от региональной версии ОС формат может быть разный:

Powershell LastBootTime

Наша задача посмотреть сколько времени работает компьютер, а не когда он был запущен. Для этого получим разницу во времени:

$boottime = Get-CimInstance Win32_OperatingSystem | select LastBootUpTime
$datetime = (Get-Date) - $boottime.LastBootUpTime | SELECT Days,Hours,Minutes,Seconds
$datetime

Powershell Get-DAte lastboottimeПопробуем выполнить команду на удаленном компьютере с Powershell, такой способ требует дополнительной настройки. Я обернул наш скрипт в функцию Get-UpTime, что бы было удобнее ее вызывать:

# Функция получения времени работы
function Get-UpTime {
$boottime = Get-CimInstance Win32_OperatingSystem | Select-Object LastBootUpTime
$datetime = (Get-Date) - $boottime.LastBootUpTime | Select-Object Days,Hours,Minutes,Seconds
return $datetime
}
# Список хостов
$computers = 'AD1','localhost'
# Выполнение команды на удаленном хосте
$result = Invoke-Command -ComputerName $computers -ErrorAction SilentlyContinue -ScriptBlock ${function:Get-UpTime}
# Форматирование результатов и сортировка
$result | select PSComputerName,Days,Hours,Minutes,Seconds | Sort-Object Days,Hours | ft

Powershell удаленная функция

Я выполняю две удаленные команды на одном и том же компьютере, так как он у меня один, но для наглядности продемонстрировано что можно иметь множество хостов. Я так же отсортировал результат с помощью Sort-Object сначала по дням, затем по часам. Нам не обязательно использовать метод Invoke-Command, так как сам командлет CIM имеет такую возможность, но первый способ мне нравится больше:

function Get-CimUpTime ($computer) {
$boottime = Get-CimInstance -ComputerName $computer Win32_OperatingSystem -ErrorAction SilentlyContinue | select LastBootUpTime
$datetime = (Get-Date) - $boottime.LastBootUpTime
$data = $datetime | Select-Object @{Label='Computer'; Expression={$computer}}, * | ft
return $data
}
Get-CimUpTime 'AD1'

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

Теперь попробуем использовать нашу функцию Get-Uptime для получения данных со всех компьютеров в ActiveDirectory и экспортируем результат в CSV:

# Получение списка хостов из AD
$host= Get-ADComputer -Filter * | Select-Object Name
# Выполнение удаленной команды
$work_time = Invoke-Command $host.Name -ErrorAction SilentlyContinue -ScriptBlock ${function:Get-UpTime}
# Форматирование результата
$complete_data = $work_time | select PSComputerName,Days,Hours,Minutes,Seconds
# Экспорт в CSV
$complete_data | Export-Csv -Path 'C:\bootuptime.csv' -NoTypeInformation

Powershell время работы компьютера Далее этот файл можно открыть в Excel и просмотреть результат. Я так же убрал сортировку, так как это можно сделать через Excel. Выполнение подобной процедуры будет долгим, если в ActiveDirectory много компьютеров и его можно сузить с помощью ключей Filter и SearchBase в команде Powershell Get-ADUser.

...

Теги: #powershell #ad


Популярные тэги
О блоге
Этот блог представляет собой конспекты выученного материала, преобретенного опыта и лучшие практики в системном администрировании и программировании.