Получение вложений из рабочих элементов Service Manager через PowerShell

В этой мини публикации я сохраню шпаргалку для получения, чтобы можно было быстро добраться до кода скрипта, который выполняет Получение вложений из рабочих элементов Service Manager через PowerShell. Я использовал этот скрипт в нескольких ранбуках Orchestrator. Пример того, что такое ранбук я уже приводил вот в этой публикации.

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

Описание задачи

Нужно разработать PowerShell скрипт, который будет получать содержимое вложений из рабочих элементов Service Manager. Этот скрипт будет использоваться в качестве одного из шагов в ранбуке. Поскольку в ранбуке я уже буду знать идентификатор вложения (Id), то именно по Id вложения я и буду осуществлять фильтрацию.

Предварительные требования

Сначал нужно установить консоль Service Manager на сервер Orchestrator.

Необходимо установить модуль SMLets на сервере Orchestrator:

Install-Module -Name SMLets -AllowClobber

Получение вложений из рабочих элементов Service Manager через PowerShell

Алгоритм получения вложений немного отличается в зависимости от типа файлов. Для текстовых файлов – это один алгоритм. Для бинарных файлов (фото, видео, исполняемые файлы и т.д.) алгоритм немного отличается.

Текстовые файлы

Пример скрипта:

###########################################
#Блок обязательных переменных
###########################################
#  Расположение директории для сохранения вложения
$AttacmentFolderPath = "C:\attach"

# Идентификатор вложения (получаем его из ранбука)
$AttachmentID = "6fed5ab3-4f08-43c4-a11c-5d41bd0e81f4"


# Тело основного скрипта (здесь ничего менять не нужно)
Import-Module SMLets
$ClassWorkItem = Get-SCSMClass -Name "System.FileAttachment"
$Attachment = Get-SCSMObject -Class $ClassWorkItem -Filter "Id -eq $AttachmentID"
$Content =""
$Content= @()
$MemoryStream = New-Object IO.MemoryStream
$Buffer = New-Object byte[] 8192
[int]$BytesRead | Out-Null
while (($BytesRead = $Attachment.Content.Read($Buffer, 0, $Buffer.Length)) -gt 0)
{
    $MemoryStream.Write($Buffer, 0, $BytesRead)
} 
$Memory = $MemoryStream.Toarray()
$Content = [convert]::ToBase64String($Memory)

$UTF8=[System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBase64String($Content))
$File = New-Item -ItemType File -Path $AttacmentFolderPath -Name $Attachment.DisplayName
Set-Content -Path $File.FullName -Value $UTF8
$MemoryStream.Close()
$Memory = $Null

Бинарные файлы

Пример скрипта:

###########################################
#Блок обязательных переменных
###########################################
#  Расположение директории для сохранения вложения
$AttacmentFolderPath = "C:\attach"

# Идентификатор вложения (получаем его из ранбука)
$AttachmentID = "6fed5ab3-4f08-43c4-a11c-5d41bd0e81f4"


# Тело основного скрипта (здесь ничего менять не нужно)
Import-Module SMLets
$ClassWorkItem = Get-SCSMClass -Name "System.FileAttachment"
$Attachment = Get-SCSMObject -Class $ClassWorkItem -Filter "Id -eq $AttachmentID"
$Content =""
$Content= @()
$MemoryStream = New-Object IO.MemoryStream
$Buffer = New-Object byte[] 8192
[int]$BytesRead | Out-Null
while (($BytesRead = $Attachment.Content.Read($Buffer, 0, $Buffer.Length)) -gt 0)
{
    $MemoryStream.Write($Buffer, 0, $BytesRead)
} 
$Memory = $MemoryStream.Toarray()
$Content = [convert]::ToBase64String($Memory)

$decoded=[System.Text.Encoding]::Default.GetString($Memory)
$File = New-Item -ItemType File -Path $AttacmentFolderPath -Name $Attachment.DisplayName
Set-Content -Path $File.FullName -Value $decoded
$MemoryStream.Close()
$Memory = $Null

Пример базового ранбука

Ниже я приведу пример базового ранбука, который можно использовать для скриптов выше.

На шаге “Monitor New Attachemnt” я получаю сам объект вложения (в момент его создания). На шаге “Get Attachment” я получаю расширенное представление объекта. Заключительным шагом “Save Attachment” я сохраняю вложение.

Единственный момент, который не учтен в этом ранбуке – это различие скрипта при сохранении текстовых и бинарных объектов. Эту логику вы можете заложить как в самом скрипте, так и настроить логику в ранбуке.

По большей части это будет шпаргалка мне, но если у вас есть вопросы – задавайте их в комментариях. Постараюсь помочь.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *