Powershell-Abfrage ob ein bestimmter KB-Artikel bzw. Hotfix im Service Pack 1 für Windows 7 oder Server 2008 R2 enthalten ist


Die Microsoft Knowledge Base enthält viele wichtige Informationen. Allerdings wird die Qualität seit Jahren immer schlechter. Ich könnte jetzt wieder stundenlang ablästern aber lassen wir das. Fakt ist, entweder es fehlt Manpower oder sie haben einfach keine Lust mehr.

Problem
Früher war es üblich, wenn ein Service Pack für eine Windows Version herauskam, dass in den Knowledge Base Artikeln darauf hingewiesen wurde, in welchem Service Pack das Problem behoben wurde. Nehmen wir uns als Beispiel http://support.microsoft.com/kb/941158/en-us, dies ist ein Artikel der Probleme im Internet Explorer 7 und 8 beschreibt. Zum aktuellen Zeitpunkt, als dieser Blogeintrag geschrieben wurde, sind als Revisionsdaten angegeben

Last Review: April 11, 2011 – Revision: 6.0

Hier wird im Statusbereich klar erklärt:

Microsoft has confirmed that this is a problem in the Microsoft products that are listed in the "Applies to" section. This problem was first corrected in Windows Vista Service Pack 1.

Damit ist klar, wenn in irgendeinem Zusammenhang auf Probleme hingewiesen wird, nachschauen ob unter Windows Vista schon SP1 installiert wurde.

Soweit so gut. Aber dieser Knowledge Base Artikel gilt auch für Windows 7 und Server 2008 R2! Der Service Pack 1 für die beiden Systeme war eine halbe Ewigkeit als Beta und RC im Umlauf und trotzdem ist kein Status für die aktuellen Windows Systeme erfasst!

Noch besser: Im KB-Artikel ist die Rede von einem Hotfix für Windows 7 und Server 2008 R2, allerdings die “Applies to” Sektion sieht so aus:


APPLIES TO
  • Windows Internet Explorer 7 for Windows XP
  • Windows Internet Explorer 7 for Windows Server 2003
  • Windows Internet Explorer 7 in Windows Vista
  • Windows Internet Explorer 7
  • Windows Internet Explorer 8

OK, jeder weiß, Internet Explorer ist Bestandteil von Windows 7 und Server 2008 R2, also müssen diese nicht explizit aufgeführt werden, aber umgekehrt muss man sich fragen, warum taucht dann der Eintrag IE7 mit Vista auf? IE7 war Bestandteil von Vista. Einfach unlogisch.

Also weiter, wie kann man nun feststellen, ob ein bestimmtes Problem oder Hotfix im Service Pack 1 behoben wurde? Früher gab es dazu dann noch ebenfalls KB-Artikel: http://support.microsoft.com/kb/946480. Aber das wie gesagt, war früher!!

Eine Lösung besteht nun darin auf dieser Seite http://www.microsoft.com/downloads/en/details.aspx?FamilyID=61924cea-83fe-46e9-96d8-027ae59ddc11&displaylang=en eine Datei herunterzuladen. Denn hier gibt es eine schöne Excel-Datei, wo alle KB-Artikel die im SP1 abgehandelt werden schön verzeichnet sind. Ach übrigens früher war alles besser, deshalb ist die Excel-Datei auch brav im XLS und nicht XLSX-Format gehalten Zwinkerndes Smiley. Bei MS im Support scheint noch nicht durchgedrungen zu sein, dass man mittlerweile Excel im Web betreiben kann.

Lösung
Nun zur Lösung. Die nennt sich Get-Sp1Articles und ist ein Powershell Skript. Der Vorteil dieser Lösung ist, sie funktioniert sogar in einem Windows Server Core oder beim Hyper-V Server in der Commandline.

Hier erst mal das Skript:

function Get-Sp1Articles()
{
    $web = New-Object System.Net.WebClient
    # Microsoft XLS-Datei über google herunterladen, damit kommt die XLS-Datei als in HTML konvertierte Datei
    $html = $web.DownloadString(‚http://webcache.googleusercontent.com/search?q=cache:trZowCK8jvcJ:download.microsoft.com/download/8/B/3/8B37425B-AB6E-4C9C-9361-ECC15771BC5C/Hotfixes%2520and%2520Security%2520Updates%2520included%2520in%2520Windows%25207%2520and%2520Windows%2520Server%25202008%2520R2%2520Service%2520Pack%25201.xls‘)
    # zuerst den Google Header und das unnötige Blabla wegbekommen
    $html = $html.Substring($html.IndexOf("KBTitle"))
    # jetzt das nächste <tr> finden
    $html = $html.Substring($html.IndexOf("<tr"))
    # einzelne Zeile mit KB-Eintrag erkennen
    $regex = ‚<tr([\s\S]*?)</tr>‘

    # HTML in Objektauflistung überführen
    ($html |Select-String -Pattern $regex -AllMatches).matches |foreach {
                    # durch überführen in ein XML-Objekt läßt sich die Zeile leichter verarbeiten
                    [xml]$tmp = $_
                    # neues Objekt erzeugen, dem die 4 wichtigen Eigenschaften zugeordnet werden, wenn eine KB-Nummer eingetragen ist
                    if ($tmp.tr.td[0].font.’#text‘ -gt 0)
                    {
                        $obj = New-Object psobject
                        $obj |Add-Member -MemberType NoteProperty -Name KBArticle -Value $tmp.tr.td[0].font.’#text‘
                        $obj |Add-Member -MemberType NoteProperty -Name Classification -Value $tmp.tr.td[1].font.’#text‘
                        $obj |Add-Member -MemberType NoteProperty -Name KBTitle -Value $tmp.tr.td[2].font.’#text‘
                        $obj |Add-Member -MemberType NoteProperty -Name Link -Value $tmp.tr.td[3].a.href
                        $obj
                    }
                }
}

Der knifflige Aufgabe dabei war, wie bekommt man die XLS-Datei mit den KB-Artikeln in Powershell? Eigentlich ganz einfach, dank Google-HTML-Cache. D. h. der Link http://webcache.googleusercontent.com/search?q=cache:trZowCK8jvcJ:download.microsoft.com/download/8/B/3/8B37425B-AB6E-4C9C-9361-ECC15771BC5C/Hotfixes%2520and%2520Security%2520Updates%2520included%2520in%2520Windows%25207%2520and%2520Windows%2520Server%25202008%2520R2%2520Service%2520Pack%25201.xls verweist auf eine HTML-Version der XLS-Datei bei Google.

Alles andere war dann nur noch unnötige Daten abschneiden um an den interessanten Bereich zu kommen und dann die enthaltenen Daten über die KB-Artikel in Objekte zu überführen. Aber dadurch das es sich nun um Objekte handelt, lassen sich tolle Dinge damit anstellen.

Damit man nicht jedes Mal die Exceldatei herunterladen muss wird für die folgenden Beispiele diese Zeile vorausgesetzt:

$sp1 = Get-Sp1Articles

Um z. B. zu erfahren wie viele Fixe dabei sind, die sich um das Thema EFI oder UEFI kümmern, schreibt man

$sp1 | where {$_.KBTitle –cmatch "EFI"} | fl *

schon bekommt man die entsprechenden Artikel aufgelistet.

Oder wie wärs mit Artikel die sich explizit auf 64Bit beziehen:

$sp1 | where {$_.KBTitle –match "64-bit"} | fl *

Oder wie ist das Verhältnis zwischen Hotfix und Security Fix:

$sp1 | group -Property classification

Oder wieviel Fixe sind überhaupt enthalten:

$sp1.count

Zum Abrufen weiterer Informationen von Artikel 11:

start $sp1[10].link

Wer einfach mal nur so etwas durchscrollen möchte, verwendet einfach dies:

$sp1 | Out-GridView

Nun kann man mit der Filterfunktion komfortabel suchen.

Achso, fast wieder das Thema verpasst, es ging ja eigentlich darum, festzustellen, ob ein bestimmter KB-Artikel enthalten ist:

$sp1 | where {$_.KBarticle -eq 941158}

3 Antworten to “Powershell-Abfrage ob ein bestimmter KB-Artikel bzw. Hotfix im Service Pack 1 für Windows 7 oder Server 2008 R2 enthalten ist”

  1. Quirel Says:

    Hier noch ein Link für weitere Infos zu SP1: http://technet.microsoft.com/en-us/library/ff817622(WS.10).aspx

  2. Quirel Says:

    Link für einen HTML Tag Extractor: http://blogs.msdn.com/b/mediaandmicrocode/archive/2008/12/08/microcode-powershell-scripting-tricks-scripting-the-web-part-2-get-markuptag.aspx

  3. Hyper-V Probleme mit eingefrorener Maus durch ausgelaufene Zertifikate « Das nie endende Chaos! Says:

    […] klar ist, ob das Probleme evtl. mit SP1 gefixt wurde, wurde die Liste der Problembehebungen mittels https://newyear2006.wordpress.com/2011/06/06/powershell-abfrage-ob-ein-bestimmter-kb-artikel-bzw-hotf… durchsucht und dieser KB-Artikel war nicht […]

Schreibe einen Kommentar

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden / Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden / Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden / Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden / Ändern )

Verbinde mit %s


%d Bloggern gefällt das: