Peter’s PowerShell Blog (German only)

Kleine Tipps für Zwischendurch (Teil 14) – die ASCII-Codes eines Strings

Dezember 8, 2009 · Kommentar schreiben

Wie erhält man eigentlich die ASCII-Codes der einzelnen Zeichen einer Zeichenkette? Zum Beispiel wie folgt:
$Tipp = „Mach mal Urlaub“
$Tipp.ToCharArray() | Foreach-Object { „U+{0:x2}“ -f [int]$_ }

Die Typenkonvertierung per [int] ist notwendig. Dass der Zeichencode als Hexadezimalzahl ausgegeben wird natürlich nicht.

→ Einen Kommentar schreibenKategorien: WPSTipps

So ausführlich sollten Fehlermeldungen immer sein…

Dezember 7, 2009 · Kommentar schreiben

Nach Ausführen eines Enter-PsSession-Cmdlets mit „CredSSP“ für den Authentication-Parameter habe ich folgende Fehlermeldung erhalten;

Enter-PSSession : Beim Verbinden mit dem Remoteserver ist folgender Fehler aufgetreten: Die Anforderung kann vom WinRM-Client nicht verarbeitet werden. Eine Computerrichtlinie ermöglicht nicht die Delegierung der Benutzeranmeldeinformationen an den Zielcomputer. Verwenden Sie „gpedit.msc“, und betrachten Sie die folgende Richtlinie: Computerkonfiguration -> Administrative Vorlagen -> System -> Delegierung von Anmeldeinformationen -> Delegierung von aktuellen Anmeldeinformationen zulassen.  Stellen Sie sicher, dass die Anwendung aktiviert und mit einem für den Zielcomputer geeigneten SPN konfiguriert ist.  Beispiel: Für den Zielcomputernamen „myserver.domain.com“ kann der SPN eine der folgenden Bezeichnungen besitzen: WSMAN/myserver.domain.com oder WSMAN/*.domain.com. Weitere Informationen finden Sie im Hilfethema „about_Remote_Troubleshooting“.

Nicht nur, dass die Fehlerursache recht ausführlich beschrieben wird, sie enthält auch eine komplette Schritt für Schritt-Anleitung, mit der sich der Fehler durch Aktivieren einer Gruppenrichtlinie beheben lassen könnte (wenngleich das zumindestens bei mir leider nicht die Fehlerursache war).

Klar, das PowerShell-Team weiß natürlich, dass das die typischen Problemfelder bei PowerShell-Remoting sind. Trotzdem war ich über diese Fehlermeldung positiv überrascht (es fehlt eigentlich nur noch ein „Viel Erfolg!“ am Schluss).

→ Einen Kommentar schreibenKategorien: WPSTipps

Auflisten von Netzwerklaufwerken (es lebe die Vielfalt)

Dezember 7, 2009 · Kommentar schreiben

Das Auflisten von Netzwerklaufwerken ist im Grunde ganz einfach:

>WMI-Klasse Win32_MappedLogicalDisk
>Registry-Key HKCU\Network
>EnumNetworkDrives-Methode beim WScript.Network-COM-Objekt

Auch ein Get-PsDrive listet die Netzwerklaufwerke mit auf (wobei ich hier auf die Schnelle keine Möglichkeit gefunden habe, ein lokales Laufwerk von einem Netzwerklaufwerk zu unterscheiden).

Seltsamerweise funktioniert auf meinem Vista-Notebook lediglich die Registry-Variante, ein Gwmi Win32_MappedLogicalDisk gibt z.B. nichts zurück (was ein wenig zu wenig ist).

Der folgende Befehl listet z.B. die Namen und Pfade der Netzwerklaufwerke per Registry-Key-Abfrage auf:

Get-ChildItem Hkcu:\\Network | Select-Obect @{Name="Laufwerk";Expression={$_.PSCHildName}}, @{Name="Remotepfad";Expression={$_.GetValue("RemotePath")}}

→ Einen Kommentar schreibenKategorien: WPSTipps

Mein Kurztrip zur TechEd in Berlin

November 13, 2009 · Kommentar schreiben

JeffreySnoverAtTechEd09 
(Jeffrey Snover während eines kleinen Intermezzos während seines TechEd 09-Vortrags in Berlin)

Ich war dann doch zu mindestens einen Tag auf der TechEd 09 (dem Doktor sei Dank;), so dass ich den (inoffiziellen) „PowerShell-Tag“ miterleben konnte.  Es gab drei Vorträge:

>Remote Management Improvements and Solutions for Windows Server 2008 R2 - der Vortrag von Jeffrey Snover (insgesamt ein guter und wie üblich unterhaltsamer Vortrag, wenngleich er ein wenig zu sehr an der Oberfläche blieb, für die Mehrheit der Teilnehmer aber sicher sehr informativ war – seine Vortragsfolien gibt es hier). Mit dabei war auch ein wenig „PowerShell-Prominenz“ (u.a. Tobias Weltner und Thomas Lee, der die britische PowerShell-User Group mitgründete und, im Stile eines echten UserGroup-Meetings, einen dicken Stapel DVDs mit PowerShell-Tools verteilte).

>Microsoft SQL Server Automation including PowerShell Support (im Konferenzheftchen hieß der Vortrag noch „SQL Server Management with PowerShell“, was aber ein Fehler war. Es ging nur in den etwa letzten 5 Minuten um PowerShell und der Vortrag litt ein „wenig“ unter einer wenig reaktionsfreudigen virtuellen Maschine).

>Managing Windows Server 2008R2 and WIndows 7 with PowerShell V2 von Corey Heins (auch ein interessanter Vortrag mit aktuellem Bezug – wenn der Referent aber nachdem 3/4 des Vortrags vorbei sind das ForEach-Object-Cmdlet erklärt wird deutlich, dass er sich in erster Linie an den PowerShell-Neuling richtete). Trotzdem interessante kleine Beispiele und ein paar Tipps am Rande (etwa zu IPSec als einfacher und sicherer Authentifizierungsmechanismus).

Allen drei Vorträgen war gemeinsam, dass sie sehr an der Oberfläche blieben. Neu ist auch, dass es in aktuellen Vorträgen zur PowerShell weniger um technische Details zur PowerShell geht, sondern in erster Linie um die Rolle der „neuen“ Shell im Rahmen von Windows Server 2008 R2.  Stichwort: TCO (lange nichts mehr davon gehört) senken durch intelligente Administration. Wirklich schade war, dass es bei keinem der Vorträge die Gelegenheit gab Fragen zu stellen – gerade für Jeffrey Snover hätte ich einige Fragen gehabt – so fuhr ich mit gemischten Eindrücken und einigen unbeantworteten Fragen wieder nach Hause. Die Scripting Guys durften leider auch nicht aus Redmond kommen (auch bei Microsoft wird gespart, was sich u.a. auch bei Namen-Badges bemerkbar macht, die neuerdings aus Papier sind und nicht mehr aus Plastik wie früher).

Insgesamt hat die TechEd 09 auf mich (wieder einmal) einen eher gemischten Eindruck hinterlassen. 7.000 Teilnehmer und über 700 Vorträge sprechen für sich. Theoretisch war für jeden etwas dabei, insbesondere natürlich,wenn man sich über die aktuellen Server-Produkte Windows Server 2008 R2, Exchange Server 2010, ForeFront, System Center und diverse andere Server-Produkte von Microsoft informieren wollte. Groß vertreten war Intel als Aussteller (die eigentlich immer dabei sind), mit dabei waren AMD, EMC, IBM und HP.  Leider weiß man bei den Vorträgen nie was einen erwartet. Nicht alle halten, was sie zunächst versprechen. Von den 736 Vorträgen waren nur 47 auf 400er-Niveau (Experten-Level), 288 waren auf 300er-Niveau (Advanced) und 232 auf 200er-Niveau (Intermediate), was einiges über die Gewichtung der Konferenz aussagt.

Die Konferenz fand in der Berliner Messe – Südeingang statt (leider nicht im ICC, wie ich zunächst dachte). Man braucht eine Weile, um sich zu orientieren (wenngleich alles vorbildlich beschildert wurde) und die ganze Messehallen haben den Charme einer typisch deutschen Messehalle aus den 80er Jahren – heute IT, morgen Nutzfahrzeuge (ich kannte die Messe bereits vom Linux-Tag 2008, für den das Ambiente etwa besser passt). Klein Vergleich zum netten Konferenzcenter in Barcelona. Nächstes Jahr soll die TechEd anscheinend wieder in Berlin stattfinden. Berlin ist zwar immer eine Reise wert, aber wenn irgendwie möglich nicht im November (wie wäre es mit Mai?).

→ Einen Kommentar schreibenKategorien: WPSTipps

Wie viele PowerShell-Session gibt es auf der PDC09?

November 11, 2009 · Kommentar schreiben

Ein wenig interessanter als die Frage welche Aussteller es auf einer Konferenz gibt ist natürlich die Frage, welche Vorträge es gibt. Auch das lässt sich herausfinden. Das folgende PowerShell 2.0-Skript stammt von MVP Doug Finke – ich habe es lediglich ein wenig modifiziert. Es benutzt die WPK-Funktionen aus dem neuen PowerShellPack für die PowerShell 2.0, mit dem sich relativ einfach (aber immer noch relativ anspruchsvoll) WPF-Funktionalitäten kapseln und in einem PowerShell-Skript einsetzen lassen.

# Ermöglicht eine Suchabfrage gegen einen RSS-Feed
# in diesem Fall der PDC-Konferenz
if(-Not (Get-Module wpk)) { Import-Module WPK}
$Wc = New-Object System.Net.WebClient
$Feed = [xml] ($Wc.Downloadstring(„
http://microsoftpdc.com/Sessions/RSS“))
$Global:PdcInfo = $Feed.Rss.Channel.item | Sort-Object Title | Foreach-Object {$_}
New-Window -WindowStartupLocation CenterScreen -Width 600 -Height 480 -Show {
    New-Grid -Rows 40, 50*, 100* -Columns 1 {
        New-TextBox -Name Search -Margin 4 -On_PreviewKeyUp {
            $Titles = $this.Parent.Parent | Get-ChildControl Titles
            $Titles.ItemsSource = ($Global:PdcInfo | Where-Object {$_.Title -match $this.Text} )
        }
        New-ListBox -Name Titles -Row 1 -Column 0 -Margin 5 `
            -DisplayMemberPath title  -On_SelectionChanged {
                $Session = $this.Parent.Parent | Get-ChildControl Session
                $Session.Source = $this.SelectedItem.link
        }
        New-WebBrowser -Name Session -Row 2 -Column 0 -Margin 5
    }
}

Ein schönes Beispiel, das zeigt in welche Richtung die PowerShell 2.0 mit Erweiterungen mit dem WPK-Modul geht.

→ Einen Kommentar schreibenKategorien: WPSTipps

Start-Transcript – kleiner Bug, einfaches Workaround

November 6, 2009 · Kommentar schreiben

Das Start-Transcript-Cmdlett besitzt (genau wie Stop-Transcript) einen kleinen Bug, der mit der Version 2.0 nicht behoben wurde. Wird Start-Transcript aufgerufen während bereits eine Aufzeichnung läuft, resultiert ein Fehler, der sich auch mit ErrorAction SilentlyContinue nicht unterdrücken lässt.

Der folgende kleine Workaround behebt die kleine Unschönheitheit, in dem aus dem Fehler über ErrorAction Stop ein terminierender Fehler gemacht wird, der mit Try/Catch (oder dem Trap-Befehl) abgefangen werden kann:

# Set-Transcript-Bug Workaround
try
{
Start-Transcript -ErrorAction Stop
}
catch
{ „Fehler beim Aufruf von Start-Transcript ($($Error[0]))“ }

→ Einen Kommentar schreibenKategorien: WPSTipps

Kleine Tipps für Zwischendurch – wieviele Aussteller gibt es auf der TechEd 2009 in Berlin?

November 5, 2009 · Kommentar schreiben

Nächste Woche findet in Berlin im altehrwürdigen ICC die TechEd 2009 Europe (das erste Mal seit vielen Jahren wieder in Deutschland) statt, mit dabei unter anderem ein Vortrag von „PowerShell-Erfinder “ Jeffrey Snover zum Thema „Remote Management Improvements and Solutions for Windows 2008 R2″  (in dem es aber vermutlich nur um den üblichen Überblick gehen wird, wenngleich der Vortrag Sicherheit einen Besuch wert ist – ob ich dabei werde ist noch nicht sicher, auch wenn PowerShell-Vorträge zu besuchen eine Art Hobby von mir ist).

Mich hat vor allem die Frage interessiert, wie viele Aussteller vertreten sind und aus welchen Ländern sie stammen.

Mit der PowerShell und einem einfachen regulären Ausdruck lässt sich die Frage (relativ) schnell beantworten:

1) Ausgangspunkt ist die TechEd-Webseite http://www.msteched.com/europe/Public/exhibitors.aspx.

2) Leider ist es mir nicht gelungen, den Webseiteninhalt über ein (New-Object System.Net.WebClient(TechedUrl, „TechEdUrls.txt“) zu laden, da die Austellerdaten aus einer XML-Datei per JavaScript nachgeladen werden – ich musste daher einen kleinen Umweg gehen und den Webseiteninhalt aus dem Browser in eine Textdatei kopieren.

$DownloadDatei = (gl).Path+“\TechEdUrls.txt“
Write-Host „$AnzahlUrls Austeller-URL’s gefunden“

Hat man die Daten, kann man ein wenig „Data Mining“ betreiben;

Write-Host „VMWare ist dabei: $((Get-Content $DownloadDatei)-Match „vmware“)“

Oder die URLs der Aussteller nach ihrer Top-Level-Domain gruppieren:

$TopLevelDoms = Select-String -Path $DownloadDatei -Pattern „http://www\.([a-z-0-9]+\.)*(?<Top>\w{2,3})“
$TopLevelDoms | Group-Object -Property { $_.Matches[0].Groups["Top"].Value} | Sort-Object Count -Descending

Dabei stellt sich z.B. heraus, dass von den insgesamt 98 Ausstellern nur zwei eine de-Domäne besitzen (2x at), die Schweiz  scheinbar nicht vertreten ist, und es mit 89 com-Domains einen eindeutigen Schwerpunkt gibt (was mich nicht gerade zuversichtlich bezüglich des „Zustands“ der hiesigen Software-Industrie stimmt bzw. ein Beleg dafür ist/sein könnte, dass das Microsoft-Windows-Ökosystem nach wie vor eindeutig seinen Schwerpunkt in den USA hat).

Ab jetzt wird es ein wenig besser, denn über die URL http://www.msteched.com/resources/Content_Files/EU_exhibitor.xml lässt sich die Ausstellerliste auch direkt laden.

Wie wäre es mit einem:

$XDoc = new-object System.Xml.XmlDocument
$XDoc.Load(„
http://www.msteched.com/resources/Content_Files/EU_exhibitor.xml„)
$XDoc.Exhibitors.Exhibitor.Count

oder

$XDoc.Exhibitors.Exhibitor | Select Website

oder

$XDoc.Exhibitors.Exhibitor | Where { $_.WebSite -like „*de“}

100% aussagekräftig ist diese Statistik natürlich nicht, denn mind. ein deutscher Aussteller besitzt eine com-Domäne und eine der de-Domänen gehört einem bekannten Software-Hersteller aus Russland.

Aber das kleine Beispielchen sollte in erster Linie ein weiteres Mal zeigen, wie nett und flexibel die PowerShell sein kann.

PS: Mit der PowerShell 2.0 kam bei Select-String der -AllMatches-Parameter hinzu, durch den alle Übereinstimmungen in einer Zeile gefunden werden (bislang wurde nur die erste Übereinstimmung gefunden).

→ Einen Kommentar schreibenKategorien: WPSTipps

Die PowerShell um Befehlskonstrukte erweitern

Oktober 27, 2009 · 1 Kommentar

Die PowerShell ist wirklich sehr flexibel erweiterbar. Dank der Möglichkeit, einem Funktionsparameter einen Befehsblock übergeben zu können, auch um Befehlskontrukte. Ein Kleinigkeit, die mich schon öfter gestört hat ist der Umstand, dass es ein wenig umständlich ist eine Aktion auszuführen, wenn ein Pipeline-Objekt einen Where-Filter nicht erfüllt. Ich hätte gerne eine Art Where { Filter } { True-Part } { False-Part}-Konstrukt. Was bei VBScript&Co gänzlich undenkbar ist, ist bei der PowerShell keine allzu große Herausforderung:

function IfElse-Object
{
  param
  (
    [Parameter(Mandatory=$true,
               ValueFromPipeline=$true)]
    [Object[]]$InputObject,
    [Parameter(Position=0, Mandatory=$true)]
    [ScriptBlock]$Cond,
    [Parameter(Position=1, Mandatory=$true)]
    [ScriptBlock]$TruePart,
    [Parameter(Position=2, Mandatory=$true)]
    [ScriptBlock]$FalsePart
  )
  process
  {
   if (&$Cond)
   { &$TruePart }
   else { &$FalsePart }
  }
}

Während der InputObject-Parameter seinen Inhalt aus der Pipeline holt, erhalten die Parameter Cond, TruePart und FalsePart ihren Inhalt über die Werte, die beim Aufruf übergeben werden.

Als nächstes wird ein Alias definiert:

Set-Alias -Name IfElse -Value IfElse-Object

Aufgerufen wird der neue „Befehl“ wie folgt:

Get-Item -path *.* | IfElse { $_.Length -eq 0 } { „$($_.Name) ist leer“}  { „$($_.Name) ist nicht leer“ }

Ohne die neue Befehlskonstruktion wird es gleich ein wenig komplizierter, sofern man nicht auf die Standard-Lösung mit Foreach und einem „braven“ If-Befehl zurückgreifen möchte:

Get-Childitem -path *.* | &{ process { $Datei=$_.Name;switch ($_.Length) {{ $_ -eq 0} { „Datei $Datei ist leer“} { $_ -ne 0} { „Datei $Datei ist nicht leer“}}}}

→ 1 KommentarKategorien: WPSTipps

PowerShell 2.0 ist offiziell

Oktober 27, 2009 · Kommentar schreiben

Im PowerShell Team Blog war es bereits zu lesen: Im Rahmen des Windows Mangement Framework 2.0 steht die PowerShell 2.0 nun auch ganz offiziell für Windows XP, Windows Server 2003 und Windows Server 2008 zur Verfügung. Allerdings nicht im Download-Center (hier gibt es nach wie vor CTP2 und CTP3), sondern auf einer eigenen Support-Seite:

http://support.microsoft.com/kb/968929

PS: Jetzt wird es wohl langsam Zeit, dass mein Buch fertig wird.

→ Einen Kommentar schreibenKategorien: WPSTipps

Neu: Das PowerShell Pack mit einer wahren Fülle an Funktionen

Oktober 16, 2009 · Kommentar schreiben

Im PowerShell Team Blog war die Meldung heute bereits zu lesen, daher an dieser Stelle nur die Kurzfassung: Das PowerShell-Team bei Microsoft hat unter dem offiziellen Namen Windows 7 Ressource Kit PowerShell Pack ein „Add-On“ (die Bezeichnung ist anhand der Fülle an Funktionen eine leichte Untertreibung) freigegeben, dass die PowerShell 2.0 vermutlich um alle das erweitert, was man immer schon vermisst haben dürfte (wie wäre es mit einer Test-64Bit-Funktion;). Die Namensgebung ist eventuell ein wenig irritierend. Das PowerPack ist nicht an Windows 7 gebunden, der Titel bezieht sich nur auf das Buch „Windows 7 Ressource Kit“, das kürzlich bei Ms Press erschienen ist, und dem das PowerPack beiliegt.

Der Form halber auch der Download-Link: http://code.msdn.microsoft.com/PowerShellPack

→ Einen Kommentar schreibenKategorien: WPSTipps