Kleine Tipps für Zwischendurch – ISE-Skripte im UTF8-Format speichern

Wer Skripte signieren möchte  stellt unter Umständen einen seltsamen Fehler fest, der darin besteht, dass nach der Signatur der Status „Unknown Error“ lautet. Der Grund dafür kann sein, dass die PowerShell ISE Dateien im „Big Endian“-Format speichert, mit dem Set-Authenticode-Signature nicht klar kommt.

Eine Möglichkeit ist es, alle ISE gespeicherten Dateien nachträglich erneut zu schreiben, dieses Mal mit einem anderen Zeichensatz:

dir *.ps1 | Foreach { (Get-Content -Path $_.FullName) | Set-Content -Path $_.FullName -Encoding UTF8 }

Möchte man erreichen, dass die PowerShell ISE Dateien gleich im UTF-8-Format speichert geht dies nur über eine Menü-Erweiterung, Der folgende Befehl muss in die Profile-Datei der ISE eingetragen werden:

$psISE.CurrentPowerShellTab.AddOnsMenu.SubMenus.Add(„_Als UTF8 speichern“,{$psISE.CurrentFile.Save([System.Text.Encoding]::UTF8)},“Ctrl+Shift+S“)

 

PowerShell Scripting Games 2011 vom 4.4 bis 15.4

PowerShell Scripting Games 2011

PowerShell Scripting Games 2011

Ich freue mich, dass es auch dieses Jahr wieder die PowerShell Scripting Games gibt. Die Idee ist, dass man innerhalb von 7 Tagen insgesamt 10 Aufgaben aus unterschiedlichen Bereichen umsetzt und die Lösungen in ein Repository lädt. Am Ende entscheidet eine Jury über die Qualität einer Lösung und es gibt auch einen Preis zu gewinnen.

Ich bin mit der Meldung leider etwas spät dran, aber wer den RSS-Feed des PowerShell-Teams abonniert hat, weiß ohnehin längst Bescheid und hat sich eventuell bereits angemeldet.

Weitere Infos gibt es unter

http://blogs.technet.com/b/heyscriptingguy/archive/2011/02/19/2011-scripting-games-all-links-on-one-page.aspx

Microsoft Management Summit 2011 am 5. Mai in Hanau

Endlich gibt es wieder einmal einen Microsoft Management Summit in Deutschland:

http://www.systemmanagementsummit.de/

Er dauert zwar nur einen Tag und findet aus welchen Gründen auch immer in Hanau (Südhessen) statt, aber besser als nichts.

Im Mittelpunkt stehen System Center Management, ein wenig Virtualisierung und ein wenig Cloud. Eine ähnliche Veranstaltung gibt es in naher Zukunft (am 19. April) auch in der Schweiz:

https://msevents.microsoft.com/cui/EventDetail.aspx?EventID=1032475991&culture=de-CH

Das Original findet aktuell (wieder einmal) in Las Vegas statt:

https://www1.mms-2011.com

Ich frage mich immer, wer die Zeit hat an solchen Konferenzen teilzunehmen. Aber wie auf der TechEd gilt auch hier, dass man durch ein paar gute Vorträge und das Durcharbeiten einiger Hands Ons Labs eine Menge Know-how mit nach Hause nehmen kann.

Tipps für Zwischendurch: Den Public Key eines Zertifikats erhalten

Den Public Key eines Zertifikats erhält man sehr einfach durch einen Aufruf der GetPublicKey-Methode jenes Objekts (X509Certificate2), den ein Get-Childitem mit dem Cert-Laufwerk liefert:

(Get-childitem Cert:\currentuser\my | Where { $_.Subject -like „CN=ActiveTraining*“ }).GetPublicKey()

Alternativ steht die GetPublicKeyString()-Methode zur Auswahl, die den Public Key nicht als Byte-Folge,sondern als String liefert.

Und wie bekomme ich den Key im Base64-Format und am besten gleich in die Zwischenablage?  Das erledigen die PowerShell Community Extensions 2.0 sehr elegant:

(Get-childitem Cert:\currentuser\my | Where { $_.Subject -like „CN=ActiveTraining*“ }).GetPublicKey() | ConvertTo-Base64 | Set-Clipboard

Alles eine Frage der Technik (sprich der passenden Cmdlets)

Leider ließ sich die Anforderung, derer ich überhaupt auf die Idee kam, einen Public Key aus einen Zertifikat zu extrahieren, damit nicht realisieren: Für die Registrierung auf einer Projektplattform (GitHub) wird ein Public Key benötigt, der aus Open SSH heraus generiert werden soll. Das Einfügen meines Keys führte zu keinem Erfolg, das Einfügen eines per Ssh-Keygen (in einer Bash-Shell unter Windows) funktioniert (natürlich) problemlos. Offenbar ist Public Key nicht gleich Public Key oder ich habe wieder einmal eine Kleinigkeit übersehen.

Kleine Tipps für Zwischendurch – Copy-Item und Push-Location kombinieren, PowerShell in Action endlich fertig und The PowerShell Guy auf den TechDays 2011

Wie lässt sich das Kopieren einer Datei aus dem aktuellen Verzeichnis in das Verzeichnis, aus dem zuvor per Push-Location zum aktuellen Verzeichnis gewechselt wurde, mit dem Wechsel in dieses Verzeichnis kombinieren? Konkret: Aus dem aktuellen Verzeichnis soll eine Datei in ein anderes Vezeichnis kopiert und anschließend in dieses Verzeichnis gewechselt werden, wobei vom Zielverzeichnis zuvor per Push-Location in das aktuelle Verzeichnis gewechselt wurde? Wenn immer noch nicht deutlich wurde, um was es mir geht, hier das Beispiel:

$CurDir = Get-Location;Copy-Item -Path „$CurDir\HalloVB.exe“ -Destination (Pop-Location -PassThru)

Die Datei HalloVB.exe soll in das Verzeichnis kopiert werden, das vor dem Wechseln in das aktuelle Verzeichnis das aktuelle Verzeichnis war. Gleichzeitig soll dieses Verzeichnis zum aktuellen Verzeichnis werden.

Da Copy-Item zuerst den Wert für seinen Destination-Parameter auswertet, der zum Wiederherstellen des bis dahin aktuellen Verzeichnisses führt, und die zu kopierenden Datei dann nicht mehr gefunden werden kann, wird das aktuelle Verzeichnis zuerst in einer Variablen gespeichert. Das müsste noch etwas einfacher möglich sein.

PowerShell in Action endlich fertig

Wie es aussieht hat Bruce Payette sein PowerShell in Action, 2nd Edition endlich fertig. Wie schreibt es Jim Truher aus dem PowerShell-Team so schön: „The book on PowerShell, it has all it’s secrets“. Infos unter http://www.manning.com/payette/.

The PowerShell Guy auf den TechDays 2011 in Basel

Wer in der deutschsprachigen Schweiz wohnt sollte sich bei den TechDays 2011 anmelden, die am 2. und 3. Mai 2011 in Basel stattfinden. Am zweiten Tag wird Marc van Orsouw (aka „The PowerShell Guy“) einen sicher sehr interessanten PowerShell-Vortrag halten. Weitere Infos gibt es unter http://www.microsoft.com/switzerland/msdn/de/techdays/default.aspx.

Kleine Tipps für Zwischendurch–Powershell.exe in die Windows 7-Taskbar integrieren

Die PowerShell ist bei Windows 7 zwar voreingestellt, ganz ohne Vorbereitungen kann sie aber im Allgemeinen nicht gestartet werden:

>Die Ausführungsrichtlinie muss gesetzt werden

>Es gibt kein Profil (und kein Profil-Benutzerverzeichnis)

>Die PowerShell befindet sich nicht in der Taskbar von Windows 7

Für die ersten beiden Punkte gibt es Befehle, für den dritten Punkt nicht, was ein wenig schade ist, da z.B. in einem PowerShell-Kurs das Einrichten der PowerShell nicht komplett in der Eingabeaufforderung erledigt werden kann. Möchte man die TaskBar ansprechen, geschieht dies nach wie vor über die COM-Komponente Shell.Application und dem entsprechenden Verb (bei einem deutschen Windows “An Taskleiste anheften” –  der & wird herausgefiltert).

Das folgende kleine Skript legt über ein Programm, dessen Pfad übergeben wird, eine Verknüpfung in der Taskbar an.

<#
.Synopsis
Programm an die Taskbar heften
.Example
Pin-Taskbar -Path c:\windows\system32\calc.exe“
#>

param($Path)

$PinVerb=“An Taskleiste anheften“
$DirPath = Split-Path -Path $Path
$Shell = New-Object -Com „Shell.Application“
$Folder = $Shell.Namespace($DirPath)
$Item = $Folder.ParseName((Split-Path -Path $Path -Leaf))
$Verbs = $Item.Verbs()
foreach($V in $Verbs)
{
  if($v.Name.Replace(„&“,““) -match $PinVerb)
  { $V.DoIt();break}
}

Druck mir doch mal eben ein paar Tausend Dokumente aus…

Es nicht ganz unwahrscheinlich, dass einem an einem Freitagnachmittag ein Kollegen im Flug einen Memory-Stick in die Hand drückt mit der Bitte, die etwa 123 Word-Dateien mal eben auszudrucken. Alles ganz wichtig und er habe leider keine Zeit usw.

Alles kein Problem, denn das erledigt ein einziger PowerShell-Befehl mit links:

dir G:\Rechnungen\*_.docx | foreach-object -Begin { $WdApp = New-Object -Com Word.Application;$WdApp.Visible=$true }  -Process { $D = $WdApp.Documents.Open($_.FullName) } -End { $WdApp.Quit([ref]$False) }

Der Weg über (COM- bzw. OLE-) Automatisierung ist einfach und scheinbar auch robust. Alternativ gibt es verschiedene Befehlszeilenschalter, wie z.B. /mFilePrintDefault, die man beim Aufruf von Winword.exe übergeben kann, aber damit wird es unnötig kompliziert. Möchte man PDfs drucken, kommt Word nicht in Frage, das PDFs bekanntlich nur speichern, aber nicht lesen kann. Dann müsste z.B. der AcrobatReader mit dem Schalter /t in der Form

AcroRd32.exe /t Dokument.pdf  „Druckername“ „Treibername“ „Portname“

aufgerufen werden. Weitere Infos gibt es im Adobe Acrobat SDK.