Servicenowのいろんなアプリの記事(インシデントチケットでもナレッジ記事でも)にはおおむね添付ファイルが付けられる。
一般的なファイル形式であればServicenow上で全文検索も可能で便利ではあるがServicenowの外で添付ファイルを扱いたいケースもある。そんな場合は添付ファイルを探してダウンロードという作業を繰り返す必要がある。
API経由でごそっとダウンロードできればそんな面倒が解放されるはずなのでPowershellで試してみる。
お試しだけなら超簡単、APIエクスプローラで、
Namespace:now, API Name:Attachment APIとし、Retrieve attachment content(GET)を選択し、Sysidだけ入れてやれば、すぐ動く。
しかも画面下部のCode SamplesのところでPowershell([ServiceNow Script][cURL][Python][Ruby][JavaScript][Perl][Powershell])などから、自分の使う言語を指定すれば、ほぼそのまま使えるコードまで出してくれる。
だが、このサンプルコードだけだと概ねいいのだが、そのままではファイル保存しないのとファイル名が固定だったりするので、ちょっと弄ってローカル保存するときのファイル名を添付ファイルの名前にしたり、パラメータを変数化したりしておきたい。
今回のコードはこちら。
# https://arm-lab.blogspot.com/2021/03/servicenowpowershell.html | |
# Parameters | |
$user = "admin" | |
$pass = "admin" | |
$instansname = "dev00000" | |
$SysID = "8180046a2fba601033e449e72799b680" | |
$BasePath = "C:\" | |
# Build auth header | |
$base64AuthInfo = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(("{0}:{1}" -f $user, $pass))) | |
# Set proper headers | |
$headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]" | |
$headers.Add('Authorization',('Basic {0}' -f $base64AuthInfo)) | |
$headers.Add('Accept','*/*') | |
# Specify endpoint uri | |
$MetaUri = "https://$instansname.service-now.com/api/now/attachment/$SysID" | |
$FileUri = "https://$instansname.service-now.com/api/now/attachment/$SysID/file" | |
# Send HTTP request Get FileName from MetaData | |
$response = Invoke-RestMethod -Headers $headers -Method "GET" -Uri $MetaUri | |
$FileFullPath = $BasePath + $response.result.file_name | |
# Send HTTP request GetFile | |
Invoke-RestMethod -Headers $headers -Method "GET" -Uri $FileUri -OutFile $FileFullPath |
ちなみにこの動作では、事前に添付ファイルのSysIDを知っておく必要があり、一般的にユーザが意識する記事上の添付ファイルを一式ダウンロードみたいな動きにはなっていない。それを実現するには恐らく、
①記事のSysIDをGET
②https://[YourInstanceName].service-now.com/sys_attachment_list.do から、該当の記事の添付ファイル一覧情報を取得。
③「②」の添付ファイルのSysID配列にForeachで今回の記事のロジックを関数化したのを回す。
といったう感じの処理になると思う。
こちらもその内出来たら記事化したい。
0 件のコメント:
コメントを投稿