Получение данных из API Kaseya VSA с помощью Powershell и выгрузка их в Excel

Получение данных из API Kaseya VSA с помощью Powershell и выгрузка их в Excel

Постановка задачи

В информационных системах нам доступно большое количество инструментов для анализа собираемых системами данных. Инструмент API позволяет обрабатывать собранные данные в привычных инструментах, например таких, как Microsoft Excel. В данной статье разберем получение данных из Kaseya VSA и выгрузку их в виде таблицы Excel, используя для получения данных API.

Справочные материалы

В качестве основного источника информации воспользуемся документацией на API от Kaseya, которая доступна по ссылке 

http://help.kaseya.com/webhelp/EN/restapi/9040000/index.asp#home.htm

Для получения деталей запросов есть возможность воспользоваться Swagger, который доступен на каждом сервере Kaseya VSA по адресу:

https://{SERVER}/api/v1.0/swagger/ui/index

где {SERVER} - адрес сервера Kaseya VSA.

Подготовка к работе

Включение доступа к REST API в Kaseya VSA

Для того, чтобы функционал заработал необходимо включить использование API в Kaseya VSA. Включение выполняется по пути System > Server Management > Configure.

Необходимо включить пункт “Enable VSA API Web Service”

Установка ImportExcel

Для выгрузки полученных данных в таблицу Excel без необходимости установки самого пакета на компьютер воспользуемся пакетом ImportExcel

https://github.com/dfinke/ImportExcel

Для выполнения установки для всех пользователей системы достаточно запустить

PowerShell от администратора и выполнить: Install-Module ImportExcel

Код программы



	 # Глобальная переменная дл¤ хранени¤ токена. Значение будет записано при выполнении
$Global:Token = $null
# Глобальная переменная с адресом URL подключением к серверу
$Global:URL = 'https://kaseya.acomps.ru/api/v1.0/'
# Функция для создания экземпляра реализации хэш-алгоритма.
function hash($algorithm, $text) {
$data = [system.Text.Encoding]::UTF8.GetBytes($text)
[string]$hash = -join
([Security.Cryptography.HashAlgorithm]::Create($algorithm).ComputeHash($data) | ForEach {
"{0:x2}" -f $_ })
return $hash
}
# Функция, которая получает данные из сервера Kaseya VSA
# Данные преобразовываются в хеш-таблицы
function GetKaseyaData($urn)
{
# Так как большие объемы данных разделяются на страницы, вводим механизм постраничного получения данных
# $i - номер текущей страницы
$i=0
# По умолчанию API Kaseya VSA возвращает по 100 записей на каждой странице
$objectsPerPage = 100
# Создаем пустую переменную, в которой будем хранить Хеш-таблицу данных для возврата результата
$results = @()
# Цикл для постраничной обработки.
# Окончание цикла - если количество записей меньше, чем записей на странице
do
{
# Строка для добавления к URL для выбора страницы при запросе
$Page = '?$skip=' + [string]($i * $objectsPerPage)
# Переменная с параметрами запроса
$params = @{
# Формирование Uri для запроса.
# Состоит из:
# - глобальной переменной URL API сервера Kaseya VSA
# - полученного URN
# - сформированной части URN, отвечающей за номер страницы
Uri = $Global:URL + $urn + $Page
# Переменная с заголовком, включая строку аутентификации
Headers = @{ 'Authorization' = "Bearer $Global:Token" }
# Переменная, отвечающая за метод
Method = 'GET'
# Тип передаваемого контента
ContentType = 'application/json'
}
# Вызов метода обращения к серверу Kaseya VSA через API
$resultObject = Invoke-RestMethod @params
# Полученный результат добавим к переменной results
$results += $resultObject.Result
# Увеличим счетчик страниц
$i++
}
# Если количество полученных строк совпадает с количеством строк на странице, возвращаемся в начало цикла
while ($resultObject.Result.Count -eq $objectsPerPage)
# Если количество полученных строк не совпало с количеством строк на странице,
# возвращаем полученный результат и завершаем функцию return $results
}
$vsa_url = $Global:URL + 'auth'
# Пользователь в Kaseya VSA
$username = 'testuser'
# Пароль пользователя
$password = 'SuperSecretPassword'
# Запишем в переменную текущее местоположение скрипта
$scriptPath = split-path -parent $MyInvocation.MyCommand.Definition
# Путь и имя файла результатов
$resultFile = $scriptPath + "\compdata.xlsx"
# Проверим наличие файла на момемнт запуска
if (Test-Path -PathType Leaf -Path $resultFile)
{
# Если Файл уже существует, нужно его удалить
Remove-Item -Path $resultFile -Force
}
# Получим случайное число и запишем его в переменную
$random = Get-Random
# В следующих строках кода создадим переменные, которые участвуют в аутентификации
$SHA1Hash = hash "SHA1" "$password$username"
$SHA256Hash = hash "SHA256" "$password$username"
$SHA1Hash = hash "SHA1" "$SHA1Hash$random"
$SHA256Hash = hash "SHA256" "$SHA256Hash$random"
# Создадим строку аутентификации на основании переменных
$auth ="user=$username,pass2=$SHA256Hash,pass1=$SHA1Hash,rand2=$random,rpass2=$SHA256H
ash,rpass1=$SHA1Hash,twofapass=:undefined"
# Выполним преобразование Base64 для строки аутентификации
$base64 = [System.Convert]::ToBase64String([System.Text.Encoding]::UTF8.GetBytes($auth))
# Аутентифицируемся на сервере и получаем строку для поддержания сессии
$bearer = Invoke-RestMethod -Method Get -Uri $vsa_url -Headers @{'Authorization' = "Basic
$base64"}
# Сохраним токен сессии в глобальной переменной
$Global:Token = $bearer.Result.Token
# Получим данные об агентах
 $RestResultAgents = GetKaseyaData('assetmgmt/agents')
# Создадим строку заголовков для Excel таблицы, добавим одну строку и запишем в них $resultHeader = ConvertFrom-Csv @"InventoryNumber,CompName,OS,OSVer,Manufacturer,ProductName,SN,ChManufacturer,LastUs
er,AgentId,LastCheckin,LastReboot
Test01,Test02,Test03,Test04,Test05,Test06,Test07,Test08,Test09,Test10,Test11,Test12
"@
# Запишем строку в файл
$resultHeader | Export-Excel -Path $resultFile -AutoSize -StartRow 1 -WorksheetName
"Computers"
# Инициируем счетчик
$i=2
# Откроем созданный файл
$excel = Open-ExcelPackage -Path $resultFile
# Указатель на страницу, где создается отчет
$KasWS = $excel.Workbook.Worksheets['Computers']
 
#Выделим строку заголовков утолщенным шрифтом Set-ExcelRange -Worksheet $KasWS -Range "A1:L1" -Bold
# Цикл для каждого компьютера foreach($agent in $RestResultAgents)
{
# Для каждого компьютера получим дополнительную информацию и запишем её в переменную $AuditFields = GetKaseyaData('/assetmgmt/audit/' + $agent.AgentId + '/summary')
# Инвентарный номер, который записан в дополнительное поле Kaseya VS Set-ExcelRange -Worksheet $KasWS -Range "A$i" -AutoSize -Value $AuditFields.CustomFields.InventoryNumber
# Имя компьютера
Set-ExcelRange -Worksheet $KasWS -Range "B$i" -AutoSize -Value $agent.ComputerName
# Операционная система
Set-ExcelRange -Worksheet $KasWS -Range "C$i" -AutoSize -Value $agent.OperatingSystem
# Версия операционной системы
Set-ExcelRange -Worksheet $KasWS -Range "D$i" -AutoSize -Value $agent.OSVersion
# Производитель компьютера Set-ExcelRange -Worksheet $KasWS -Range "E$i" -AutoSize -Value
$AuditFields.SystemInfo.Manufacturer
# Имя компьютера как продукта Set-ExcelRange -Worksheet $KasWS -Range "F$i" -AutoSize -Value
$AuditFields.SystemInfo.ProductName
# Серийный номер Set-ExcelRange -Worksheet $KasWS -Range "G$i" -AutoSize -Value
$agent.SystemSerialNumber
# Производитель корпуса
Set-ExcelRange -Worksheet $KasWS -Range "H$i" -AutoSize -Value
$AuditFields.Chassis.ChassisManufacturer
# Учетная запись последнего работающего пользователя
Set-ExcelRange -Worksheet $KasWS -Range "I$i" -AutoSize -Value $agent.LastLoggedInUser
# Идентификатор агента Kaseya VSA
Set-ExcelRange -Worksheet $KasWS -Range "J$i" -AutoSize -Value $agent.AgentId
# Время последнего активного ответа от системы
Set-ExcelRange -Worksheet $KasWS -Range "K$i" -AutoSize -Value
$AuditFields.TimeInfo.LastCheckin
# Время, когда была выполнена последняя перезагрузка ОС
Set-ExcelRange -Worksheet $KasWS -Range "L$i" -AutoSize -Value
$AuditFields.TimeInfo.LastReboot
# Увеличим счетчик
$i++
}
# Закроем Excel документ
Close-ExcelPackage -ExcelPackage $excel

Результат

В результате мы получили Excel таблицу