Powershell-Scripts in Windows 8

Nachdem ich nun meinen privaten PC „platt“ gemacht und auf die finale Version von Windows 8 umgestiegen bin, versuche ich nun meine täglich oder zumindestens häufig genutzten Programme wieder zu installieren bzw. zum Laufen zu kriegen.

Dabei habe ich nun festgestellt, dass das Ausführen von Powershell-Scripts auch in Windows 8 grundsätzlich verboten („restricted“) ist. Um dem abzuhelfen, ist wie folgt vorzugehen:

- Win+X, Eingabeaufforderung (Administrator)
- "powershell" eingeben
- "get-executionpolicy" eingeben (=> "Restricted"?)
- "set-executionpolicy allsigned" eingeben
- "exit"

Damit ist das grundsätzlich schon erledigt – signierte Scripts können ab sofort auf dem System ausgeführt werden. Evtl. müssen die Scripts noch getestet und signiert werden, dazu sind die anderen Posts allenfalls noch hilfreich.

Powershell-Script ausführen

Wenn nun auf dem Desktop eine Verknüpfung zu einem Powershell-Script erstellt wird, führt ein Doppelclick interessanterweise ins Notepad, d.h. ein automatisches Ausführen des Scripts funktioniert nicht einfach so. Zu diesem Zweck muss der Link der Verknüpfung angepasst werden – vor dem effektiven Script ist noch der Powershell-Pfad samt dem Befehl „-noexit“ hinzuzufügen. Mit Noexit kann zumindestens am Anfang noch geprüft werden, ob es irgendwelche Fehler gibt oder nicht.

C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -noexit " & 'U:\mypath\myscript.ps1'"

Falls keine Fehler vorhanden sind, bzw. immer alles funktioniert, kann anstelle von -noexit der Parameter -command verwendet werden.

Je nachdem wo Ihr das Script nun speichert kann es sein, dass es wegen fehlender digitaler Signatur nicht ausgeführt wird. Das ist zwar unschön, dem kann aber abgeholfen werden – allerdings wird es jetzt etwas aufwendig (weil wir ja eigentlich nur ein Script laufen lassen möchten)…

Unter dieser Adresse kann der SDK-Webinstaller des .Net Framework 4 aufgerufen werden, der einem einen selektiven Download ermöglicht. Eine allfällige Fehlermeldung beim Start (von wegen nur .Net 4 Client und nicht Full installiert) kann ignoriert werden. Alle Auswahlen bis zu den Installationsoptions standardmässig durchklicken – hier dann unter „Windows Native Code Development“ den Punkt „Tools“ anklicken und den Rest deaktivieren. Nach Abschluss der Installation sollte jetzt ein Verzeichnis „C:\Program Files\Microsoft SDKs\Windows\v7.1“ bestehen.

Dann mit dem Commandline-Prompt (Achtung wichtig: mit Admin-Rechten) in das Verzeichnis C:\Program Files\Microsoft SDKs\Windows\v7.1\Bin wechseln und die folgenden Befehle ausführen:

makecert -n "CN=PowerShell Local Certificate Root" -a sha1 -eku 1.3.6.1.5.5.7.3.3 -r -sv root.pvk root.cer -ss Root -sr localMachine
makecert -pe -n "CN=PowerShell User" -ss MY -a sha1 -eku 1.3.6.1.5.5.7.3.3 -iv root.pvk -ic root.cer

Für das Erstellen des privaten Schlüssels ist ein Kennwort (z.bsp. „certpassword“) zu definieren; dieses bitte notieren – es muss anschliessend wieder eingegeben werden. Die obigen Befehle müssen mit „Succeeded“ bestätigt werden, ansonsten stimmt etwas nicht.

Danach den folgenden Text in eine Textdatei kopieren und diese mit „Add-Signature.ps1“ benennen.

## add-signature.ps1
## Signiert eine Datei
param([string] $file=$(throw "Geben Sie einen Dateinamen an."))
$cert = @(Get-ChildItem cert:\CurrentUser\My -codesigning)[0]
Set-AuthenticodeSignature $file $cert

Geben Sie folgende Befehle an der Windows PowerShell-Eingabeaufforderung ein, um die Skriptdatei „Add-Signature.ps1“ zu signieren:

$cert = @(Get-ChildItem cert:\CurrentUser\My -codesigning)[0]
Set-AuthenticodeSignature add-signature.ps1 $cert

Damit ist nun das Skript signiert und es kann nun – endlich – das ursprüngliche Skript mit „.\add-signature.ps1 meinscript.ps1“ signiert werden. Wenn man nun die Skript-Datei anschaut, sieht man, dass am Ende der Datei eine Signatur angehängt wurde.

Somit kann nun endlich die eigene Skript-Datei mittels Doppelklick gestartet werden!

Download einer Datei mit Powershell

Bei einem meiner Forex-Provider habe ich das Problem, dass der Java-Client nicht sauber gestartet wird, d.h. dass zwar die .JNLP-Datei runtergeladen wird, dafür aber Java nicht gestartet wird. Um dem abzuhelfen, habe ich beschlossen, dafür ein entsprechendes Powershell-Skript zu erstellen. Der Hauptgrund dafür ist die Tatsache, dass der Download einer Datei aus dem Internet durch Powershell eigentlich problemlos möglich sein müsste – und ist es auch.

Nach einigem Suchen im Internet habe ich folgendes Script zusammengestellt, welches jetzt die gewünschte Datei aus dem Web holt, lokal abspeichert und via Java-Webstart ausführt:

# aktuelle Datei runterladen
# mit Java-Webstart starten
# 18.07.2011
$clnt = new-object System.Net.WebClient
$url = "https://www.xx.com/client/live/jclient/jfo.jnlp"
$file = "c:\temp\jfo.jnlp"
$clnt.DownloadFile($url,$file)
# type $file
C:
cd C:\temp
javaws jfo.jnlp

Diese Datei kann jetzt als scriptname.ps1 gespeichert werden. Damit ist nun schon ein erster Schritt getan und diese Datei kann manuell ausgeführt werden – mit einem Doppelklick gehts noch nicht, aber dazu später mehr.