В качестве продолжения темы об удаленных рабочих столах, затронутой в серии статей "Служба удаленных рабочих столов" я решил опубликовать скрипт, который покажет, как часто пользователи подключаются к терминальным серверам, собранным в ферму.
Скрипт основан принципе, что все терминальные серверы объединены в единую ферму серверов, а ссылки на них опубликованы в кем-портале службы (подробнее об этом написано тут). Сценарий PowerShell пробегает по логам сервера IIS и ищет все записи, в которых пользователям возвращаются RDS-файлы, то есть выдается ссылка на подключение к конкретному терминальному серверу. Сценарий формирует новый отчет о таких запросах с сохраняет его в виде CSV-файла, который удобно анализировать с помощью Excel.
Недостатком данного метода является возможность пользователей сохранить RDP-файл, скачанный с портала фермы, и использовать его для соединения с терминальным сервером, минуя его запрос с веб-портала, то есть не попадая в логи IIS сервера.
Листинг скрипта PowerShell.
# --- Variables ---
# Путь к логам IIS
$Path = "c:\inetpub\logs\LogFiles\W3SVC1"
# Рекомендуется скопировать логи сервера к себе на компьютер в папку Temp и запускать обработку на своей машине
$Path = "C:\temp\W3SVC1"
# --- Start ---
# Создание нового объекта таблицы отчета
$report =New-Object System.Data.DataTable "Report"
# Установка флага первого файла
$bFirstFile = $True;
# Обработка каждого файла в папке логов
ForEach ($File in Get-ChildItem $Path) {
Write-Host ($File.Name + " is being processed")
# Получение всех строк файла лога начинающихся с цифр или букв #F
$FileContent = Get-Content $File.FullName | Where-Object {$_ -notLike "#[A-E,G-Z]*" }
# Если это первый файл, то считать заголовок таблицы и сформировать колонки
If ($bFirstFile) {
# Заменить в заголовке некоторые символы и разбить по колонкам
$columns = ($FileContent[0].TrimEnd()).Replace("#Fields: ", "").Replace("-","").Replace("(","").Replace(")","").Split(" ")
$colCount = $columns.Length
# Создать колонки в таблице отчета
ForEach ($Column in $Columns) {
$colNew = New-Object System.Data.DataColumn $column, ([string])
$report.Columns.Add( $colNew )
}
# Пометить флаг первого файла как выполненный
$bFirstFile = $False;
}
# Считать все строки, где упоминается расширение .rdp
$Rows = $FileContent | Where-Object {$_ -like "*.rdp*"}
# Обработать каждую найденную строку
ForEach ($row in $rows) {
# Если строка пуста, то переходить к следующей строке
If (!$row) {
Continue
}
# Разбить строку на колонки, заменив некоторые знаки
$rowContent = $row.Replace(";","_").Split(" ")
# Создать новый объект строки
$NewRow = $report.NewRow()
# Заполнить объект строки значениями
For ($i=0; $i -lt $colCount; $i++) {
$columnName = $columns[$i]
$NewRow.$ColumnName = $rowContent[$i]
}
# Добавить строку в таблицу отчета
$report.Rows.Add($NewRow)
}
}
# Текущая дата
$TodayDate = Get-Date -Format "yyyy-MM-dd"
# Путь к файлу с отчетом
$OutFile = (Get-Childitem env:USERPROFILE).Value + "\Desktop\" + $TodayDate + "_RDS_farm_usage.csv"
If (Test-Path $OutFile) { Remove-Item -Path $OutFile }
# Экспорт отчета в файл
$report | Export-Csv $OutFile -Delimiter "`t" -Encoding UTF8 -NoClobber -NoTypeInformation
Write-Host
Write-Host "The result is in $OutFile file."
Write-Host
Пример отчета, собранного скриптом из логов IIS сервера.

Результат работы скрипта удобно анализировать в Excel, используя файл с пользователями из статьи Выгрузка пользователей Active Directory в файл.
Пример диаграмм, построенных по отчетам:
- Статистика использования систем по месяцам,
- Распределение подключений к системам по времени суток.

Все заметки о службе терминалов в моем блоге можно найти по тегу RDS.
