Skip to the main content.

ScriptRunner Blog

So nutzen Sie ScriptRunner 'FilePicker' Query in einer Action

Inhaltsverzeichnis

 

 

Post Featured Image

Da wir in engem Austausch mit den ScriptRunner Nutzern sind, fließen die Anregungen und Ideen der Nutzer seit langem in die Software ein. Als Anwender von ScriptRunner haben Sie sicherlich schon festgestellt, dass es bisher nicht möglich ist, Dateien hochzuladen, um diese zu verarbeiten. Wir arbeiten daran! Dieses Feature befindet sich gerade in der Entwicklung und wird in der nächsten Version, der Portal Edition R4, enthalten sein. Damit Sie nicht bis zur Veröffentlichung unserer Portal Edition R4 warten müssen, stellen wir im folgenden Artikel einen Workaround dar, um Dateien unterschiedlicher Art in ScriptRunner zu verarbeiten.

Wir haben in PowerShell ein Query-Script geschrieben, mit dem es möglich ist, Dateien über einen Dialog auszuwählen und den Inhalt dieser Dateien dann in einer Action zu verarbeiten. Am Ende dieses Beitrags finden Sie die komplette Anleitung, wie die Query zu erstellen und zu verwenden ist. Das Script funktioniert aktuell nur mit einer Netzwerkfreigabe, einem entsprechenden UNC Pfad und den passenden Credentials mit Berechtigungen auf die Netzwerkfreigabe.
Dabei gibt es zwei Möglichkeiten, die Daten aus dem entsprechenden Pfad abzurufen. Bei der ersten Variante erfolgt die Definition im ScriptRunner Target, bei der zweiten wird innerhalb eines Scripts ein $PSDrive verwendet.

 

Variante #1 – Credentials im Target

Die Credentials, die Zugriff auf die Freigabe haben, werden im Target angegeben. Als Credential verwenden wir einen einfachen AD-Account mit Berechtigungen auf den Network Share.

Screenshot Credential Properties

Das Target muss anschließend wie folgt aufgebaut sein:


Create_Target_Select_Targettype


03__Configure_Target_LocalExecution

Das Target selbst muss als "Local Execution" angelegt und im "Simple Run-as Process Mode" betrieben werden.

Achtung: Befinden sich im Script Parameter von dem Typ "PSCredential" und enthalten diese einen Wert, wird die Query oder die Action nicht starten, da im "Run-as" Modus keine PSCredential Parameter unterstützt werden. Hierauf wird im Target als Hinweistext nochmals verwiesen.

 

Variante #2 – Credentials als Parameter

Die Credentials mit Berechtigungen auf den Share werden an den Parameter "$DomainAccount" übergeben. Der UNC Pfad und die Credentials werden an ein PSDrive gemapped und können hierüber dann abgerufen bzw. verwendet werden. Nach der Beendigung der Query wird die Verbindung zum PS-Drive wieder geschlossen und das PS-Drive gelöscht. Wer auf Nummer sicher gehen möchte, kann aber auch den "Finally" Bereich des Try-Catch Block im Script wieder einkommentieren.

Screenshot Code

Die elegantere Variante ist sicherlich die zweite, da hier die Flexibilität gewahrt wird und man nicht zwangsläufig auf das Target mit den passenden Credentials angewiesen ist. In beiden Varianten muss am Script selbst nichts geändert werden. Die Logik befindet sich innerhalb des Codes.

Das Script kann erst in der Query angewendet werden, wenn es den "_QUERY_" Tag enthält. Der Tag kann über den Namen des Scripts vergeben werden ("QRY_Get-FileFromPath.ps1"), manuell im "Set appropriate Tags" Bereich im Script selbst oder über die Checkbox "This is a query script returning a query result list" im selben Bereich. Auf dem folgenden Screenshot ist das entsprechende Tag zu sehen und gelb gekennzeichnet:

Script_Properties

Wie ist das Script einzusetzen? Schauen wir uns im Folgenden einmal mit Hilfe mehrerer Screenshots den Ablauf an.

 

1. Schritt

Im ersten Schritt erstellen Sie eine Abfrage (Query) vom Typ "With a Script".

Create Query - Select Querytype 'with a Script'

 

2. Schritt

Wählen Sie nun einen passenden Namen für die Query und legen die "Caching Strategy" auf "Real-time Query without Caching" und "…with Automatic Query Execution" fest. Der letzte Punkt ist nur notwendig, wenn die Query automatisch loslaufen soll. Der UNC-Pfad kann auch manuell eintragen und per "Cascading" an die Query übergeben werden, dafür wird an dieser Stelle die Option abgewählt. Create Query - Configure Query 

 

3. Schritt

Je nach Variante, für die Sie sich entschieden haben, wird jetzt ein entsprechendes Target hinterlegt. Bei den Credentials im Parameter sollte die Konfiguration wie auf dem Screenshot aussehen. Die Query läuft via "Direct Service Execution", und der Netzwerkpfad wird inklusive Credentials auf ein PSDrive gemapped. 

Hinweis: Das PSDrive erhält als Namen eine GUID. Somit ist der Name zum einen eindeutig und zum anderen kann er nicht mit anderen Laufwerken o.ä. kollidieren.

Der $Include Parameter gibt an, nach welchen Dateiendungen gesucht wird. Bleibt der Parameter leer, werden alle Dateien angezeigt. Möchtest Sie z.B. nur TXT Dateien anzeigen, dann muss der Eintrag *.txt lauten.

Script Configuration - Query Configure Query

Soll die Autorisierung am Share über das Target laufen, dann muss der Parameter $DomainAccount leer bleiben und das als Target wird das Target wie oben beschrieben hinterlegt.

 

4. Schritt

Nun kann die Query getestet werden. Ist alles korrekt eingestellt, dann sollte das Ergebnis wie folgt aussehen:

Execute Query - Query Result

 

Hier kommt zum Überblick der ganze Code:


<#
.SYNOPSIS
.DESCRIPTION
.NOTES
.COMPONENT
.LINK
.Parameter NetworkPath
[sr-en] Enter filepath in UNC format
[sr-de] Bitte den Verzeichnispfad im UNC Format eintragen
.Parameter Include
[sr-en] Specify the file extensions (e.g. *.csv)
[sr-de] Nach Dateiendungen filtern (z.B. *.csv)
.Parameter DomainAccount
[sr-en] Specify a domain account with permission for the network share
[sr-de] Bitte einen Domänen Benutzer mit Berechtigungen für das Netzlaufwerk eintragen
#>
param (
[ValidatePattern('(?:[^\\\/:*?"<>|\r\n]+\\)*[^\\\/:*?"<>|\r\n]*')]
[string]$NetworkPath,
[string]$Include,
[pscredential] $DomainAccount
) try { if ($null -ne $DomainAccount) {
try {
$GUID = [guid]::NewGuid().toString()
[hashtable]$cmdArgs = @{
"Name" = $GUID
"PSProvider" = "FileSystem"
"Root" = $NetworkPath
"Credential" = $DomainAccount
}
$PSDrive = New-PSDrive @cmdArgs
$TestPath = Test-Path -Path $PSDrive.Root
if ($TestPath -eq "True") {
$Files = Get-ChildItem -Path $PSDrive.Root -Include $Include -File
if ($null -ne $Files) {
foreach ($itm in $Files) {
if ($null -ne $SRXEnv) {
$null = $SRXEnv.ResultList.Add($itm) $null = $SRXEnv.ResultList2.Add("$($itm.Name)") } else { Write-Output "$($itm.Name)" } } } else { Write-Output "No files in specified folder $($PSDrive.Root) found." } } else { Write-Output "Either path $($PSDrive.Root) does not exist or access is denied!" } } catch { throw } finally { <#if ($PSDrive) { Remove-PSDrive -Name $GUID }#> } } else { $TestPath = Test-Path -Path $NetworkPath if ($TestPath -eq "True") { $Files = Get-ChildItem -Path $NetworkPath -Include $Include -File if ($null -ne $Files) { foreach ($itm in $Files) { if ($null -ne $SRXEnv) { $null = $SRXEnv.ResultList.Add($itm) $null = $SRXEnv.ResultList2.Add("$($itm.Name)") } else { Write-Output "$($itm.Name)" } } } else { Write-Output "No files in specified folder $($NetworkPath) found." } } else { Write-Output "Either path $($NetworkPath) does not exist or access is denied!" } } } catch { throw }

 

Fazit

Es gibt selbstverständlich noch andere Möglichkeiten, Dateien innerhalb von ScriptRunner Actions zu verarbeiten. Außerdem kann dieses Script so angepasst werden, dass auch Unterordner in den Verzeichnissen angezeigt werden. Dies soll nur ein kleiner Workaround sein, bis ScriptRunner die Funktion von Haus aus mitbringt.

 


 

Zusammenhängende Posts

2 min read

VMUG Webcast: VMware Management meistern mit PowerCLI

5 min read

PowerShell mit Get-Help meistern

Über den Autor: