Скрипт для мониторинга включения/выключения компьютеров

По мотивам темы на форуме. Скриптик для мониторинга когда какой комп включился, когда выключился, и записи в лог. На основе пингов.

Для использования надо подправить параметры под себя (список компьютеров, файлы логов и состояния), и запихать в планировщик, для запуска с интервалом например в 10 минут. При старте скрипт будет проверять наличие файла состояния, и если он существует — подгружать, и писать в логфайл все изменения состояния.

# Функция для проверки доступности хоста. В данном случае используется ping.exe
# Как вариант можно взять версию на .Net у меня из блога:
# https://xaegr.wordpress.com/2008/09/16/test-host_where-online/
Function Test-Host ($HostName)
{
    [bool]((ping.exe $HostName -n 1) -match "получено = 1")
}

# Файл в котором будем сохранять состояние компьютеров между запусками скрипта
$StateFile = "c:\temp\pinger.xml"

# Файл в который будут писаться изменения состояния компьютеров
$LogFile = "c:\temp\pinger.log"

# Если файл сохраненного состояния уже существует...
If ( Test-Path $StateFile )
{
    # Загружаем таблицу состояния компов из файла
    $Table = Import-Clixml $StateFile
}
else # Иначе - создаем новую.
{
    Write-Warning "Выполняется инициализация таблицы состояний"
    $Computers = Get-Content c:\computers.txt
    # $Computers = Get-QADComputer | foreach {$_.DnsName}
    
    #Создаем пустую хэш-таблицу. Ключем будут имена компьютеров, значением - состояние.
    $Table = @{}
    #Заполняем её именами компьютеров, и состоянием $False.
    $Computers | Foreach {$Table[$_] = $False}
}

#Проверяем состояние каждого хоста...
Foreach ($Key in @($Table.Keys))
{
    # Получаем состояние хоста в переменную $State
    $State = Test-Host $Key
    
    #Если состояние не равно предыдущему состоянию...
    if ($State -ne $Table[$Key])
    {
        #Обновляем состояние
        $Table[$Key] = $State
        #Записываем в лог
        if ($State) {$Message = "$(Get-Date) Компьютер $Key был включен."}
        else {$Message = "$(Get-Date) Компьютер $Key был выключен."}
        Add-Content -Path $LogFile -Value $Message
        Write-Host $Message
    }
}

# Записываем состояние хостов в файл
$Table | Export-Clixml $StateFile

В планировщике выполнять например следующую команду:

powershell -noprofile -command c:\scripts\MonitorHost.ps1

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