2017年7月9日日曜日

SCSMからSC Orchestratorに添付ファイルを持ってくる 2 - 自分メモ

前回からの続きな自分メモ。

いろいろ見た中で、
Neat Trick to Get SCSM Service Request Attachments
https://systemcenternoise.wordpress.com/2016/01/07/neat-trick-to-get-scsm-service-request-attachments/

をベースに考えてみることとしました。

ただ、SCSMの標準コマンドレットでは、SCSMのアクティビティに割り当てられるGUIDは取れそうもないようでした。
さらに調べてみたところ、PowerShell/SCSM - Finding the GUID of an objectを見つけてそこから
SMLetsというものを知り、GUIDが取れることがわかりました。

SCSM PowerShell Cmdlets

注)Codeplexは2017年12月にその役割を終えることになっています。
SMLetsは、GitHubに移行中とのこと(本稿執筆時点、2017/07/09)

SCSMにSMLetsをインストールして、アクティビティに含まれる添付ファイルをSCSMのローカルフォルダへダウンロードできるかをリモートホスト(この場合は、SC Orchestrator)のPowerShellから試しました。
今のところ、下記のコードでうまくいっているようです。ただ、SC Orchestratorのアクティビティとしての確認はできていません。
$Session=New-PSSession -ComputerName "scsmhost"
Invoke-Command -Session $session -ScriptBlock {
Import-Module 'C:\Program Files\Microsoft System Center\Service Manager\PowerShell\System.Center.Service.Manager.psd1'
Import-Module SMLets
$SMServer="scsmhost"
# SCSMのアクティビティIDを指定し、SMLetsのGet-SCSMObjectでGUIDを取得できるようにしています。# http://www.lazywinadmin.com/2014/09/powershellscsm-finding-guid-of-object.html
# http://smlets.codeplex.com/documentation Shutdown to Dec-2017
$ServiceRequest = Get-SCSMObject -Class (Get-SCSMClass -Name System.WorkItem.ServiceRequest) -filter "ID -eq SCSMのアクティビティIDを指定"
#
$SR=Get-SCClassInstance -ComputerName $SMServer –Id $ServiceRequest.get_id()
#英語環境で作ったはずですが、なぜかDisplayNameで日本語名を指定しないとうまくいきませんでした。
$targetclass=Get-SCSMRelationship -ComputerName $SMServer -DisplayName "添付ファイルがある" | where {$_.Source -eq (get-scsmclass -ComputerName $SMServer -Name System.WorkItem)}
# $targetclass=Get-SCSMRelationship -ComputerName $SMServer -DisplayName "Has File Attachment" | where {$_.Source -eq (get-scsmclass -ComputerName $SMServer -Name System.WorkItem)}
$files=$SR.GetRelatedObjectsWhereSource($targetclass)
$ArchiveRootPath="C:\Temp\OrchestratorRemote\"
#For each file, archive to entity folder
$filelist=@()
if($files -ne $Null)
{
#Create archive folder
$nArchivePath=$ArchiveRootPath + "" + $SR.Id
New-Item -Path ($nArchivePath) -ItemType "directory" -Force|Out-Null

$files|%{
Try
{
$filelist+="$nArchivePath$_"
$fileId=$_.EnterpriseManagementObject.Id
$fileobject=get-scsmclassinstance -ComputerName $SMServer -Id $fileId
$fs = [IO.File]::OpenWrite(($nArchivePath + "\" + $_.EnterpriseManagementObject.DisplayName))
$memoryStream = New-Object IO.MemoryStream
$buffer = New-Object byte[] 8192
[int]$bytesRead|Out-Null
while (($bytesRead = $fileobject.Content.Read($buffer, 0, $buffer.Length)) -gt 0)
{
$memoryStream.Write($buffer, 0, $bytesRead)
}
$memoryStream.WriteTo($fs)
}
Finally
{
$fs.Close()
$memoryStream.Close()
}
}
}
$file1=$filelist[0]
$file2=$filelist[1]
$file3=$filelist[2]
}

Remove-PSSession $Session

0 件のコメント:

コメントを投稿