Herausforderung mit Umlauten beim WebRequest aus Powershell (Windows 10, ISE)
Es sollen aus einem Powershell Script User angelegt werden. Die Userinformationen werden aus einer CSV eingelesen. Im Folgenden ein vereinfachtes Modell. Problem ist, dass die Useranlage wunderbar funktioniert, solange die Namen und Vornamen keine Umlaute, ß oder Ähnliches enthält.
Script bricht dann mit einem Fehler 500 "Internal Server Error" ab. Es gibt wohl ein Thema bei Encoding. Wenn ich z.B. (Müller, Franzä und Seiß schreibe anstatt Müller, Franzä und Seiß), dann funktioniert der Webrequest und die Benutzer werden korrekt angelegt. So wie dargestellt werden normalerweise die Buchstaben angezeigt, wenn eine Datei UTF8 codiert ist aber als ANSI dargestellt wird.
Ich schätze also, dass an der Stelle beim WebRequest, wo der Methodenbody befüllt wird, die enthaltenen Strings noch irgendwie umkonvertiert werden müssen. Hat jemand eine Idee, was da zu machen ist?
Hier das Modell des Scripts:
----------------------------------------------------------
$BaseUrl = "https://databox.dengler.de"
$APIUrl = $BaseUrl + "/api"
$TokenUrl = $BaseUrl + '/oauth/token'
$Username = "system.user"
$Password = "Balduin12."
$ClientId = "mKKELB9JZdswl9d2p7AZ7AbdHE7IJXEB"
$ClientSecret = "Zo9VaSY9sgVwzUsm33fxdVSQU8Iqr06c"
# Login über OAuth
$Base64AuthInfo = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(("{0}:{1}" -f $ClientId,$ClientSecret)))
$Body = @{
"grant_type" = "password"
"username" = $Username
"password" = $Password
}
$Response = Invoke-WebRequest -URI $TokenUrl -Method Post -ContentType "application/x-www-form-urlencoded" -Body $Body -Headers @{Authorization=("Basic {0}" -f $Base64AuthInfo)}
$Content = ConvertFrom-Json $Response.content
$Token = $Content.access_token
#Hier werden die Variablen für den Methodenbody befüllt. Im Original kommen die Werte aus einer Hashtable, welche aus einer CSV befüllt wird.
$vorname = "Franz"
$name = "Müller"
$mail = "f.mullern@dracoon.com"
#Methodenbody befüllen
$parameter= @{
"firstName" = $vorname
"lastName" = $name
"authMethods" = @(@{
"authId" = "sql"
"isEnabled" = $true
})
"login" = $mail
}
$AccountUrl = $APIUrl + "/v4/users"
$Response = Invoke-WebRequest -URI $AccountUrl -Method Post -ContentType "application/json" -Headers @{Authorization=("Bearer {0}" -f $Token)} -Body (convertTo-Json $parameter)
$Content = ConvertFrom-Json $Response.content
Write-Output $Content
------------------------------------------------------------------------------------------------
-
Das Thema ist jetzt gelöst mit Hilfe einiger DRACOON Kollegen. Vielen Dank dafür.
Die Lösung bestand aus 2 Themen. Zum einen muss meine CSV richtig eingelesen werden. Es handelt sich um eine mit Excel erstellte CSV, welche ich so einlese:
$userliste = Import-Csv $FileBrowser.FileName -Delimiter ';' -Encoding Default
Später gebe ich neue CSV zur Controlle aus, die muss natürlich auch korrekt erstellt werden:
$userliste | Export-Csv C:\temp\userListe.csv -Delimiter ';' -Encoding Default
Invoke-Item "C:\temp\userListe.csv"Die eigentliche Lösung des Problems war aber ganz einfach. Der Body ($parameter) musste einfach in das richtige Format gebracht werden, bevor die Methode dann bei DRACOON aufgerufen wurde. Und das ging so:
$parameter = ConvertTo-Json ($parameter)
$parameter = [System.Text.Encoding]::UTF8.GetBytes($parameter) -
Hallo Christoph,
das Problem mit dem CSV-Encoding konnte ich auch lösen. Das Problem hatte ich schon mal.
Anscheinend wird der Default-Parameter für das ANSI-Encoding beim Import-CSV nicht gesetzt, obwohl er so heißt. Erst wenn man es explizit mit dem Parameter '-Encoding Default' angibt funktioniert das Lesen und Schreiben sauber kodiert.
Danke für den Tipp mit dem utf8-kodieren des Parametersatzes. Da wäre ich nie drauf gekommen. Vor allem nicht mit dieser Fehlermeldung.
Mit der Konvertierungszeile für die Parameter, die du oben angegeben hast funktioniert es einwandfrei und alle Umlaute und Sonderzeichen werden korrekt in Dracoon als Benutzernamen angelegt *Daumen hoch*.
Danke für die Hilfe
Bitte melden Sie sich an, um einen Kommentar zu hinterlassen.
Kommentare
2 Kommentare