Доброго времени суток.
Как всегда, внезапно, возникла задача — необходимо контролировать использование USB-модемов: кто, когда подключался/отключался. Естественно, события нужно читать из системного журнала рабочей станции, но пользоваться стандартным «Просмотром событий» в сети, где несколько сот компьютеров, довольно проблематично. Выбор средства для автоматизации данной трудоемкой задачи пал на PowerShell.
Необходимо:
1. Осуществлять проверку списка рабочих станций
2. Перед проверкой осуществлять контроль: включена ли рабочая станция или нет
3. Считывать события связанные с удаленными соединениями
4. Получать: имя рабочей станции, дату и время события, текст события
5. Если события отсутствуют или рабочая станция не доступна — делать соответствующую отметку
6. Результат отправлять по электронной почте.
Приступим:
Вводим параметр для загрузки файла, содержащего список исследуемых компьютеров (каждый компьютер на отдельной строке)
Определяем переменные, в которых будут содержаться данные учетной записи для подключения к рабочим станциям
Удаляем лог-файл, полученный ранее (если он есть)
Создаем новый лог-файл
Получаем текущую дату
Вводим функцию преобразования даты и времени
Вводим функцию отправки по e-mail
Основная функция
Проверим, чтобы файл с наименованиями компьютеров не был пустым
Вызов основной функции
А теперь результат отправим на почту ответственному лицу
Вот собственно и все.
Ответственный получает сообщение с вложенным файлом, в котором на каждой строке указаны требуемые данные.
Данный скрипт после незначительного тюнинга можно применить к любому журналу и получать требуемые данные в нужное время. Для полной автоматизации вставляем скрипт в планировщик.
Как всегда, внезапно, возникла задача — необходимо контролировать использование 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
Вот собственно и все.
Ответственный получает сообщение с вложенным файлом, в котором на каждой строке указаны требуемые данные.
Данный скрипт после незначительного тюнинга можно применить к любому журналу и получать требуемые данные в нужное время. Для полной автоматизации вставляем скрипт в планировщик.