The task XML is malformed

Mit Windows Server 2012 und Windows 8, also mit PowerShell 3 kam die Möglichkeit einen Task für den Windows Task Schedular mit PowerShell zu importieren.

Register-ScheduledTask -Xml .\VM-Export.xml -TaskName "VM-Export"

Diesen Aufruf quittiert Windows anschließend mit der Fehlermeldung (The task XML is malformed).

image

Der PowerShell-Befehl Register-ScheduledTask kann die XML-Datei nicht korrekt interpretieren, eine Lösung dazu (hier reicht auch schon der genaue Blick in den Screenshot) ist die XML-Datei über den folgenden Aufruf zu lesen.

Register-ScheduledTask -Xml (Get-Content .\VM-Export.xml |Out-String) -TaskName "VM-Export"

Enjoy it, b!

Ausführen von PowerShell über eine Batch

PowerShell Skripte oder CmdLets lassen sich auch über eine Batchdatei (.cmd / .bat) ausführen. Das geht recht einfach und sogar Parameter können mit angegeben werden. Es muss lediglich auf korrekte gesetzte Quoten (Anführungszeichen) geachtet werden.

:: Variables
set log="%temp%\Expand-Raw.log"

:: Header
echo Expand-Raw ...
echo Expand-Raw ... >%log%
echo.

for /f "tokens=*" %%a in ('dir RAW*.zip /b') do (

	rem  PowerShell -NoExit "&" ""P:\Code\Distribute-Pictures.ps1" -Action dis -File '.\%%a'"
	PowerShell ""P:\Code\Distribute-Pictures.ps1" -Action dis -File '.\%%a'"
	echo [RC=%ERRORLEVEL%], PowerShell -NoExit "&" ""P:\Code\Distribute-Pictures.ps1" -Action dis -File '.\%%a'" >>%log%

)

:_End

Schauen wir uns das PowerShell-Skript genauer an, dann sehen wir das insgesamt 4 Parameter übergeben werden:

  • -Action und die entsprechende Aktion, also –Action dis
  • -File und Dateiname, also –File ‘RAW 2017-01-08-01, Huskies auf der Alb.zip’

Der Aufruf unter PowerShell (also nicht über eine Batch sieht wie folgt aus):

.\Distribute-Pictures.ps1 -Action dis -File 'RAW 2017-01-08-01, Huskies auf der Alb.zip'

Die Batch Datei, welche nun drum herum abläuft, soll das PowerShell-Skript einfach mehrfach für eine Reihe von Dateien im gleichen Verzeichnis ausführen. Darum erfolgt ein Aufruf von PowerShell.exe mit dem Script und den Parametern aus der Batch heraus.

PowerShell ""P:\Code\Distribute-Pictures.ps1" -Action dis -File '.\%%a'"

PowerShell ruft die PowerShell.exe auf, danach wird der vollständige Aufruf für PowerShell in normale Anführungszeichen gesetzt.

""P:\Code\Distribute-Pictures.ps1" -Action dis -File '.\%%a'"

Innerhalb dieser Anführungszeichnen (“) steht dann das PowerShell-Script in weiteren Anführungszeichen, gefolgt von den Parametern. Der letzte Parameter, welcher den Dateinamen darstellt, wird in einfache Anführungszeichen (‘) gesetzt, da ihn PowerShell dann literal behandelt.

Enjoy it, b!

Transcript und externe Befehle in PowerShell

PowerShell bietet mit dem Transcript-Befehl eine nach meiner Meinung sehr effektive und elegante Möglichkeit an, die Ausgaben von Befehlen an STDOUT und STDERR auf zu zeichnen. Leider klappt das mit externen Befehlen welche aus dem PowerShell-Script heraus aufgerufen werden nicht zuverlässig. Eine Lösung hier ist die Ausgabe von STDOUT und STDERR nach Transcript um zu leiten.

Hier mal ein Beispiel-Code dazu:

$ErrorActionPreference="SilentlyContinue"
Stop-Transcript | out-null
$ErrorActionPreference = "Continue"
 
$Log = "C:\Temp\output.log"
Start-Transcript -Path $Log -Append
 
# Umleiten von STDOUT und STDERR (2>&1) nach transcript:
befehl.exe 2>&1 | out-host
 
Stop-Transcript

Dieser Workaround hat mir neulich bei einem Script sehr geholfen!

Enjoy it, b!

Windows SBE 2012 R2 Dashboard

Für den Windows Server Small Business Essentials 2012 R2 hat Microsoft das Management mit PowerShell nochmals deutlich verbessert und liefert eine Reihe hilfreicher PowerShell Befehle mit.

https://technet.microsoft.com/en-us/library/dn205088(v=wps.630).aspx

Im Gegensatz zu früheren Versionen, lässt sich damit z.B. das Dashboard nach einer Migration auf SBE 2012 R2 von Benutzerkonten säubern welche dort nicht angezeigt werden sollen (Service Accounts, zusätzliche Admins, etc.).

Dazu wird einfach PowerShell als Administrator gestartet und die vorhandenen Benutzer des Dashboards ermittelt:

# Ermittlung der im Dashboard angezeigten Benutzer
Get-WssUser | fl UserName

image

Die beiden grün markierten Benutzer sollen nicht mehr im Dashboard angezeigt werden (das eine ist mein Administrator, der andere DHCP2DNS ist der Proxy-Account für DNS Updates).

# Deaktivieren der Anzeige von Benutzern im Dashboard
Set-WssUserDashboardVisibility -Name bernd-adm -Hidden

Set-WssUserDashboardVisibility -Name DHCP2DNS-Update -Hidden

image

Damit zeigt das Dashboard lediglich den Administrator und die eigentlichen SBE Benutzer an.

Enjoy it, b!