Статистика использования фермы RDS серверов

Опубликовано: 10.12.2020
Автор: Виталий Бочкарев
Поддержать автора статьи по этой ссылке

В качестве продолжения темы об удаленных рабочих столах, затронутой в серии статей "Служба удаленных рабочих столов" я решил опубликовать скрипт, который покажет, как часто пользователи подключаются к терминальным серверам, собранным в ферму.

Скрипт основан принципе, что все терминальные серверы объединены в единую ферму серверов, а ссылки на них опубликованы в кем-портале службы (подробнее об этом написано тут). Сценарий 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 сервера.

RDS farm usage statistics - 01

 

Результат работы скрипта удобно анализировать в Excel, используя файл с пользователями из статьи Выгрузка пользователей Active Directory в файл.

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

RDS farm usage statistics - 02

 

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