Как узнать аптайм сервера
Аптайм (uptime) — это время непрерывной работы сервера, т.е. время, прошедшее с момента загрузки операционной системы. С помощью аптайма можно оценить, как долго сервер работает без сбоев и перезагрузок. В операционных системах Windows есть много способов посмотреть аптайм, вот некоторые из них.
Самый простой способ — это запустить Task Manager и перейти на вкладку «Performance».
Атайм можно посмотреть и в свойствах сетевого подключения.
Также аптайм можно определить по системным логам. При выключении и перезагрузке сервера происходит остановка и запуск службы Event Log, поэтому мы можем открыть Event Viewer и отфильтровать события с кодом 6006 (остановка) или 6005 (старт службы).
Узнать время последнего старта операционной системы можно из командной строки, введя команду systeminfo и найдя строку System Boot Time.
Можно ввести команду net statistics workstation и посмотреть, с какого момента времени собирается статистика. Как правило, это момент загрузки системы.
Ну и конечно для выяснения аптайма можно воспользоваться WMI и PowerShell. Выяснить время старта ОС можно вот так:
$wmi = Get-WmiObject Win32_OperatingSystem
$wmi.LastBootUpTime
Время выводится в несколько неудобном формате, поэтому сконвертируем его:
$wmi.ConvertToDateTime($wmi.LastBootUpTime)
И выведем время работы с точностью до миллисекунды, вычтя из текущей даты дату последней загрузки:
$wmi.ConvertToDateTime($wmi.LocalDateTime) — $wmi.ConvertToDateTime($wmi.LastBootUpTime)
Статистика длительности работы компьютера может пригодиться для проверки работы серверов или в случае мониторинга пользователей на предмет нарушения техники безопасности (пожарной и информационной) и для многих других случаев. Такую статистику можно увидеть несколькими путями:
- С помощью диспетчера задач (Task Manager).
- С помощью Systeminfo.
- В логах. Например по событию 6005, которое показывает время включения хоста.
- С помощью класса WMI Win32_OperatingSystem, по свойству LastBootUpTime.
Каждый из этих способов по своему удобен, но три из них теряют актуальность, если нужно проверить эти данные на множестве компьютеров. В случае с WMI такие данные можно получить с любого хоста. Я не исключаю, что такие данные можно получить с команд типа Get-NetAdapter или Get-ComputerInfo.
Следующим образом мы получим дату включения хоста используя команду CMD WMIC:
wmic path Win32_OperatingSystem get LastBootUpTime
Аналогичный результат, но используя команду получения WMI в Powershell:
Get-WmiObject Win32_OperatingSystem | Select-Object LastBootUpTime
Мы можем различить дату, но желательно иметь сразу более человеческое представление. Можно преобразовать результат и с WMI, но в случае с CIM он сразу корректный:
Get-CimInstance Win32_OperatingSystem | select LastBootUpTime
В зависимости от региональной версии ОС формат может быть разный:
Наша задача посмотреть сколько времени работает компьютер, а не когда он был запущен. Для этого получим разницу во времени:
$boottime = Get-CimInstance Win32_OperatingSystem | select LastBootUpTime
$datetime = (Get-Date) - $boottime.LastBootUpTime | SELECT Days,Hours,Minutes,Seconds
$datetime
Попробуем выполнить команду на удаленном компьютере с 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
Я выполняю две удаленные команды на одном и том же компьютере, так как он у меня один, но для наглядности продемонстрировано что можно иметь множество хостов. Я так же отсортировал результат с помощью 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
Далее этот файл можно открыть в Excel и просмотреть результат. Я так же убрал сортировку, так как это можно сделать через Excel. Выполнение подобной процедуры будет долгим, если в ActiveDirectory много компьютеров и его можно сузить с помощью ключей Filter и SearchBase в команде Powershell Get-ADUser.
…
Теги:
#powershell
#ad
В этой статье мы покажем, как получить время непрерывной работы компьютера (uptime), которое прошло с момента загрузки Windows.
Самый простой способ получить время последней загрузки Windows – выполнить команду:
systeminfo | FIND "System Boot Time"
System Boot Time: 3/11/2023, 11:58:45 AM
Также время загрузки можно получить так:
net statistics workstation
Чтобы получить не просто дату загрузки, а время непрерывной работы с последней загрузки можно воспользоваться таким скриптом PowerShell:
$WinOS = Get-WmiObject Win32_OperatingSystem
write-host $WinOS.LastBootUpTime
(Get-Date) — $WinOS.ConvertToDateTime($WinOS.LastBootUpTime)
В этом примере компьютер Windows работает без перезагрузок 26 дней.
В этом примере командлет Get-WmiObject используется для обращения к классу Win32_OperatingSystem.
В PowerShell Core вместо командлета Get-WmiObject нужно использовать Get-CimInstance:
Get-CimInstance -ClassName win32_operatingsystem -ComputerName localhost| select csname, lastbootuptime
или
(get-date) - (gcim Win32_OperatingSystem).LastBootUpTime
Также в PowerShell Core 6.x и 7.x доступен новый командлет Get-Uptime, который сразу выводит Uptime (вычисляет TimeSpan между текущим временем и временем последней загрузки Windows):
Get-Uptime
Get-Uptime -Since
Вы можете получить uptime с удаленных компьютеров из командной строки.
Можно подключиться к удаленному компьютере через systeminfo и получить BootTime:
SystemInfo /s msksrv01 | find "Boot Time:"
Или через CIM получить время непрерывной работы удаленного компьютера:
(Get-Date) - (Get-CimInstance Win32_OperatingSystem -ComputerName msksrv01).LastBootupTime
Либо можно проверить время загрузки сразу несколько удаленных хостов Windows с помощью PowerShell (имена серверов указываются через запятую):
Get-CimInstance win32_operatingsystem -computerName server1,server2,server3 | select-object csname,LastBootUpTime
К сожалению для Windows нет стандартного командлета консоли Uptime. Но есть множество способов получить это значение которое, без дополнительной обработки, нельзя назвать удобным для использования. Давайте разберем пример получения этого значения, а вместе с ним и LastLogon, с помощью Powershell
Если вы хотите получить отчет с удаленных компьютеров, в котором будут содержаться время последнего включения ПК, количество дней со включения и время последнего логона юзера, используйте следующий скрипт:
$comps = Get-ADcomputer -f * $result = New-Object 'System.Collections.Generic.List[object]' foreach($comp in $comps.SamAccountName){ if( Test-Connection $comp -Count 1 ){ $LastRebootTime = Get-WmiObject win32_operatingsystem -ComputerName $comp | Select @{Name='Computername';Expression={$comp}}, @{Name='LastBootUpTime';Expression={$_.ConverttoDateTime($_.lastbootuptime)}} $UptimeInDays = ( (Get-Date).Date - $LastRebootTime.LastBootUpTime.Date ).TotalDays $LastUserLogon = ( Get-ADComputer $comp -Properties lastlogontimestamp | Select @{Name="Lastlogon"; Expression={[DateTime]::FromFileTime($_.lastLogonTimestamp)}} ).Lastlogon $result.add( $([pscustomobject]$Lastreboottime | select *, @{Name='LastUserLogon';Expression={$LastUserLogon}},@{Name='UptimeInDays';Expression={$UptimeInDays}}) ) } } $result | Sort -Descending UptimeInDays
В результате мы получим отчет следующего вида:
В Powershell 6 версии появился встроенный командлет Get-Uptime
Записки администратора
How Can We Help?
Created On
bymanager
Command Line
SystemInfo is a built-in Windows command line that displays some basic info about not only about your local computer but any remote computers on the same network as well. Simply use the /s switch in the command followed by the name of the remote computer, like below.
SystemInfo /s Remote_Computer | find “Boot Time:”