PowerShell: аудит использования USB-модемов

Доброго времени суток.

Как всегда, внезапно, возникла задача — необходимо контролировать использование USB-модемов: кто, когда подключался/отключался. Естественно, события нужно читать из системного журнала рабочей станции, но пользоваться стандартным «Просмотром событий» в сети, где несколько сот компьютеров, довольно проблематично. Выбор средства для автоматизации данной трудоемкой задачи пал на PowerShell.

Необходимо:
1. Осуществлять проверку списка рабочих станций
2. Перед проверкой осуществлять контроль: включена ли рабочая станция или нет
3. Считывать события связанные с удаленными соединениями
4. Получать: имя рабочей станции, дату и время события, текст события
5. Если события отсутствуют или рабочая станция не доступна — делать соответствующую отметку
6. Результат отправлять по электронной почте.

Приступим:

Вводим параметр для загрузки файла, содержащего список исследуемых компьютеров (каждый компьютер на отдельной строке)

Param(
[string[]]$computer = (Get-Content -path c:\Scripts\comp.txt))


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

$usr = "domen\user"
$PWD = read-host "Введите пароль для $usr " -assecurestring
$cred = new-object system.management.automation.pscredential($usr,$pwd)


Удаляем лог-файл, полученный ранее (если он есть)
$File = "C:\Scripts\Log.txt"
if ($File -ne "0")
{
Remove-Item $File
}


Создаем новый лог-файл
New-Item -ItemType file -Path C:\Scripts -Name Log.txt

Получаем текущую дату
$Date = (get-date).ToString('yyyy/MM/dd')

Вводим функцию преобразования даты и времени
function WMIDateStringToDate($TG)
{
[System.Management.ManagementDateTimeconverter]::ToDateTime($TG)
}


Вводим функцию отправки по e-mail
Function sendEmail
{ param($from,$to,$subject,$smtphost,$File)
$body = "В приложенном файле находится отчет об использовании модемов" #Get-Content $File
$smtp= New-Object System.Net.Mail.SmtpClient($smtphost, 25)
$msg = New-Object System.Net.Mail.MailMessage $from, $to, $subject, $body
if ($File -ne "0")
{
$att = new-object Net.Mail.Attachment($File)
$msg.Attachments.Add($att)
}

$smtp.Credentials = New-Object System.Net.NetworkCredential($from, "pass")
$smtp.send($msg)
}


Основная функция
Function Get-EventsByWmi($hostname)
{
$ping = Get-WmiObject Win32_PingStatus -filter "Address='$hostname'" # Проверим жив ли комп ping
if ($ping.StatusCode -eq 0) #Если жив
{
$events = gwmi Win32_NTLogEvent -Filter "LogFile='System'" -ComputerName $hostname -Credential $cred | Where-Object {$_.SourceName -eq "RemoteAccess" -or $_.SourceName -eq "RasMan"} # смотрим журнал System, фильтруем источники события - именно они обозначают установление соединений с использованием USB-модемов
if ($events) # перебираем события
{
foreach ($event in $events)
{
$TG = $event.TimeGenerated
$Time = WMIDateStringToDate($TG)
$message = $event.ComputerName + " " + $Time + " "+$event.Message
$logformail = Add-Content -Value "$message `n" -Path C:\Scripts\Log.txt # Пишем результат в файл
}
}
else
{
$logformail = Add-Content "$hostname - подключений модемов не обнаружено" -Path C:\Scripts\Log.txt #если соединений не было, то же это учтем
}
}
else
{
$logformail = Add-Content "$hostname - НЕДОСТУПЕН" -Path C:\Scripts\Log.txt # Также учтем компьютеры, которые недоступны на момент проверки
}
}


Проверим, чтобы файл с наименованиями компьютеров не был пустым
if(-not($computer)) {"Необходимо внести названия комьюптеров в файл comp.txt"; exit}

Вызов основной функции
ForEach ($hostname in $computer){ Get-EventsByWmi -Hostname $hostname } # Пробегаемся по списку компьютеров и для каждого вызываем основную функцию

А теперь результат отправим на почту ответственному лицу
sendEmail alert@domen.ru admin@domen.ru "Использование модемов - $Date" mail.domen.ru $File

Вот собственно и все.
Ответственный получает сообщение с вложенным файлом, в котором на каждой строке указаны требуемые данные.

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

You can't comment this post because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author's username will be hidden by an alias.