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