evinben
Goto Top

Bestimmte Windows Updates blockieren

Hallo Gemeinde,

weiß einer wo Windows die ausgeblendeten Updates abspeichert (im Falle bei Win7 z. B.)?
Mit "RegFromApp" und "Regshot (v.1.9) ist es mir leider nicht gelungen es zu verfolgen.
(Der Hintergrund ist per Batch bestimmte Updates zu blockieren).

Gruß
Evinben

Content-Key: 304355

Url: https://administrator.de/contentid/304355

Printed on: April 19, 2024 at 12:04 o'clock

Member: colinardo
colinardo May 12, 2016 updated at 17:04:01 (UTC)
Goto Top
Hallo enviben,
Updates kannst du komfortabler per Powershell ausblenden. Windows bietet dafür auch ein Tool an um diese dauerhaft auszublenden (Das Tool ist zwar für Windows 10, aber die unten stehenden Code-Schnippsel funktionieren genauso auch unter Windows 7 und 8):
https://support.microsoft.com/en-us/kb/3073930

Wenn du dieses herunter lädst und die Dateiendung auf *.cab änderst und z.B. mit WinRAR öffnest findest du darin ein paar Powershell-Schnippsel mit denen sich Updates auf einfache Weises ausblenden lassen.

Das lässt sich auch direkt per Batch einbinden wenn man das möchte:

Zum Ausblenden eines Updates
powershell.exe -ExecutionPolicy ByPass -Command "&{((New-Object -Com 'Microsoft.Update.Session').CreateUpdateSearcher()).Search(\"IsInstalled=0 and Type='Software'\").Updates | %%{If($_.Title -like '*KB3035583*'){write-host \"Hiding Update $($_.Title)\";$_.IsHidden = $true}}}"  
Wurde auch schon hier besprochen:
Windows Update per .cmd oder .ps1 ausblenden

Mit dem UpdateSearcher-Objekt lässt sich natürlich auch abfragen welche Updates ausgeblendet und nicht installiert wurden, wenn man das benötigt.
PS-Code
((new-object -ComObject "Microsoft.Update.Session").CreateUpdateSearcher()).Search("IsInstalled=0 and IsHidden=1").Updates | select Title,IsHidden  
Grüße Uwe
Member: colinardo
colinardo Jul 15, 2016 at 16:47:32 (UTC)
Goto Top
Wenns das dann war, den Beitrag bitte noch auf gelöst setzen. Merci.
Member: evinben
evinben Aug 15, 2016 at 11:08:24 (UTC)
Goto Top
Hallo Uwe,

danke dir erstmals für eine rasche Hilfe! Ich habe mich nicht sofort melden können, da all dies studiert werden musste und es Probleme gab und danach war schon Sommer dazwischen.

Die Codes aller PowerShell-Dateien aus dem Paket wushowhide.diagcab von Microsoft habe ich mir angeschaut aber ich blicke da auf der Schnelle nicht wirklich ganz durch (mit PowerShell habe ich noch keinerlei Erfahrungen).

Beim Ausführen der Datei "CL_Windows_HU.ps1" (aus demselben Microsoft Paket wushowhide.diagcab) wird gar kein Feedback in der PowerShell ausgegeben, ob sich das was tut oder nicht.

Beim Ausführen deines Codes
powershell.exe -ExecutionPolicy ByPass -Command "&{((New-Object -Com 'Microsoft.Update.Session').CreateUpdateSearcher()).Search(\"IsInstalled=0 and Type='Software'\").Updates | %%{If($_.Title -like '*KB3035583*'){write-host \"Hiding Update $($_.Title)\";$_.IsHidden = $true}}}"  
erhalte ich jeweils folgende Fehlermeldung:
powershell.exe : Der Zeichenfolge, beginnend mit:
Bei D:\Dok\Desktop\Windows Update\Windows Update ausblenden\Windows Update ausblenden.ps1:2 Zeichen:15
+ powershell.exe <<<<  -ExecutionPolicy ByPass -Command "&{((New-Object -Com 'Microsoft.Update.Session').CreateUpdateSearcher()).Search(\"IsInstalled=0 and Type='Software'\").Updates | %%{If($_.Title -like '*KB2952664*'){write-host \"Hiding Update $($_.Title)  
\";$_.IsHidden = $true}}}"  
    + CategoryInfo          : NotSpecified: (Der Zeichenfolge, beginnend mit::String) , RemoteException
    + FullyQualifiedErrorId : NativeCommandError
 
Bei Zeile:1 Zeichen:80

+ &{((New-Object -Com 'Microsoft.Update.Session').CreateUpdateSearcher()).Search( <<<< " IsInstalled=0 and Type=Software\).Updates | %%{If(.Title -like '*KB2952664*'){write-host \Hiding Update \;.IsHidden = True}}}  

fehlt der Terminator: ".  

Bei Zeile:1 Zeichen:207

+ &{((New-Object -Com 'Microsoft.Update.Session').CreateUpdateSearcher()).Search(" IsInstalled=0 and Type=Software\).Updates | %%{If(.Title -like '*KB2952664*'){write-host \Hiding Update \;.IsHidden = True}}} <<<<   

    + CategoryInfo          : ParserError: ( IsInstalled=0 ...idden = True}}}:String) , ParentContainsErrorRecordException

    + FullyQualifiedErrorId : TerminatorExpectedAtEndOfString

Noch habe ich mit dem nachfolgenden Code-Beispiel von hier
Windows Update per .cmd oder .ps1 ausblenden
Windows Update per .cmd oder .ps1 ausblenden
versucht:
$update = "KB2952664"  
$updates = ((New-Object -Com "Microsoft.Update.Session").CreateUpdateSearcher()).Search("IsInstalled=0 and Type='Software'")  
$updates.Updates | %{
   If($_.Title -like "*$update*"){  
      write-host "Hiding Update $($_.Title)"  
      $_.IsHidden = $true
   }
}
aber mit dem wird folgender Fehler gemeldet:
Ausnahme beim Festlegen von "IsHidden": "Ausnahme von HRESULT: 0x80240044"  
Bei D:\Dok\Desktop\Windows Update\Windows Update ausblenden\PowerShell\Eingetragene Windows Update ausblenden.ps1:7 Zeic
hen:10
+       $_. <<<< IsHidden = $true
    + CategoryInfo          : InvalidOperation: (:) , RuntimeException
    + FullyQualifiedErrorId : PropertyAssignmentException

Ziel:
Es sind mehrere Updates (etwa um die 15), welche jeweils auf einen Rutsch versteckt werden sollen und akkurat wäre hier es natürlich, wenn diese zeilenweise abgearbeitet werden (einfach aus einer externen Datei oder zum. am Anfang des jeweiligen Skripts).
Mit Batch wäre dies all für mich schon längst erledigt, wenn es auch hierfür passende Befehle gäbe.

Hier hatte ich dagegen mit VBS Erfolg gehabt (aus meiner Sicht sehr akkurat gemacht aber auch gut dokumentiert - sehr zu empfehlen):

Hiding windows updates based on KB######
http://ss64.org/viewtopic.php?pid=6795


Viele Grüße
Nik
Member: colinardo
colinardo Aug 15, 2016, updated at Aug 16, 2016 at 06:19:43 (UTC)
Goto Top
Beim Ausführen deines Codes
Hallo NIK,
kein Wunder wenn du den ersten Code in ein Powershell-Skript rein kopierst, diese Zeile war für das direkte ausführen in einer Batchdatei gedacht face-smile, sieht man doch an dem vorspann powershell.exe -Executionpolicy ........ face-wink

Für eine Liste an KBs, kannst du das ganz einfach ergänzen und die IDs aus einer Textdatei lesen (ohne KB prefix):
123456
444444
555555
$ids = gc 'C:\liste.txt'  
((new-object -ComObject "Microsoft.Update.Session").CreateUpdateSearcher()).Search("Type='Software' and IsInstalled=0").Updates | ?{$_.KBArticleIDs -in $ids} | %{$_.IsHidden = $true}  

Grüße Uwe
Member: evinben
evinben Aug 15, 2016 updated at 19:05:59 (UTC)
Goto Top
OK Uwe,

ich hätte mich sofort wieder an dich wenden müssen face-wink, aber unvorbereitet war es mir ungern und da du mir Hausaufgaben mit diesen Beispiel-Schnipseln aus dem Microsoft Paket gestellt hast, musste ich erstmals selbst rumprobieren.

Zur Ausführung des obigen PowerShell-Skrtipts aus einer Batch-Datei
Es hat nun perfekt geklappt! face-wink. Danke schön!
Allerdings ist hier aufzupassen etwas mehr Geduld aufzubringen und die Verarbeitung nicht vorzeitig zu beenden, da es relativ lang dauert, so um die ca. 30 Sekunden (mit einem einzigen KB-Eintrag erstmals versucht).

Zur Ausführung deines letzten PowerShell-Skrtipts aus PowerShell direkt
Danke erstmals für deine Hilfe.

Folgende Fehlermeldung wird jeweils generiert (in der txt-Datei ist erstmals nur 2952664 eingetragen) :
Sie müssen auf der rechten Seite des Operators "-" einen Wertausdruck angeben.  
Bei D:\Windows Update ausblenden (einzelne KBs aus .txt-Datei einlesen).ps1:5 Zeichen:132
+ ((new-object -ComObject "Microsoft.Update.Session").CreateUpdateSearcher()).Search("Type='Software'").Updates | ?{$_.KBArticleIDs - <<<< in $ids} | %{$_.IsHidden = $true}  
    + CategoryInfo          : ParserError: (:) , ParentContainsErrorRecordException
    + FullyQualifiedErrorId : ExpectedValueExpression


KBs einzeln aus der Textdatei einzulesen war vor allem aus diesem Grund gemeint, um da übersichtlich Notizen zu den einzelnen KBs eintragen zu können.
Können in der Textdatei Notizen (z. B. mit einem vorangestellten ' | ; | : oder mit # wie in einem PowerShell-Skript) berücksichtigt werden?

Gruß
Nik
Member: colinardo
Solution colinardo Aug 16, 2016 updated at 06:15:54 (UTC)
Goto Top
Zitat von @evinben:

OK Uwe,
Allerdings ist hier aufzupassen etwas mehr Geduld aufzubringen und die Verarbeitung nicht vorzeitig zu beenden, da es relativ lang dauert, so um die ca. 30 Sekunden (mit einem einzigen KB-Eintrag erstmals versucht).
Das ist normal, da Windows hier erst mal online und das System nach installerten Updates scannt und das dauert halt seine Zeit.


Folgende Fehlermeldung wird jeweils generiert (in der txt-Datei ist erstmals nur 2952664 eingetragen) :
##red|
Sie müssen auf der rechten Seite des Operators "-" einen Wertausdruck angeben.
Den Operator -in gibt es erst ab Powershell 3.0, und du darfst da kein Leerzeichen zwischen dem Strich und dem in machen.


KBs einzeln aus der Textdatei einzulesen war vor allem aus diesem Grund gemeint, um da übersichtlich Notizen zu den einzelnen KBs eintragen zu können.
Können in der Textdatei Notizen (z. B. mit einem vorangestellten ' | ; | : oder mit # wie in einem PowerShell-Skript) berücksichtigt werden?
Kann man, dazu muss man dann aber diese Kommentare für die Verarbeitung ausfiltern z.B. so
$ids = gc 'c:\liste.txt' | ?{$_ -notlike '#*'}  
Hiermit werden dann alle Zeilen die mit einer Raute beginnen nicht eingelesen, bzw. ausgefiltert.

Grüße Uwe
Member: evinben
evinben Aug 16, 2016 at 07:51:52 (UTC)
Goto Top
Den Operator -in gibt es erst ab Powershell 3.0, und du darfst da kein Leerzeichen zwischen dem Strich und dem in machen.
habe aber kein Leerzeichen dazwischen eingefügt. Der Code ist 1:1 übernommen worden.

Laut dem Verzeichnis "C:\Windows\system32\WindowsPowerShell\v1.0" ist hier bei mir die v.1.0.
(Dateiversion von PowerShell ISE.exe: 6.1.7600.16385).
Was ist denn dann hier faul?

$ids = gc 'c:\liste.txt' | ?{$_ -notlike '#*'}
Danke face-wink!

Nik
Member: colinardo
colinardo Aug 16, 2016 updated at 08:06:01 (UTC)
Goto Top
Zitat von @evinben:
Laut dem Verzeichnis "C:\Windows\system32\WindowsPowerShell\v1.0" ist hier bei mir die v.1.0.
(Dateiversion von PowerShell ISE.exe: 6.1.7600.16385).
Nein, so kannst du die Powershell-Version nicht bestimmen face-smile
Dazu gebe folgendes in eine PS Konsole ein
$PSVersiontable
Was ist denn dann hier faul?
zu 99,9% eine zu alte Powershell 2.0 die den -IN Operator einfach noch nicht kennt, Windows 7 wird damit ja ausgeliefert, wenn du also kein Update des Management Frameworks durchgeführt hast bist du noch auf 2.0. Ich kanns dir aber auch für PS 2.0 umschreiben wennst willst face-wink

PS 2.0 kompatible Variante
$ids = gc 'c:\liste.txt' | ?{$_ -notlike '#*'}  
((new-object -ComObject "Microsoft.Update.Session").CreateUpdateSearcher()).Search("Type='Software' and IsInstalled=0").Updates | ?{$_.KBArticleIDs -match ($ids -join '|')} | %{$_.IsHidden = $true}  
Geht hier einwandfrei...
Member: evinben
evinben Aug 16, 2016 updated at 09:37:09 (UTC)
Goto Top
$PSVersiontable gibt mir folgendes aus:
Name                           Value                                                                                        
----                           -----                                                                                        
CLRVersion                     2.0.50727.5485                                                                               
BuildVersion                   6.1.7601.17514                                                                               
PSVersion                      2.0                                                                                          
WSManStackVersion              2.0                                                                                          
PSCompatibleVersions           {1.0, 2.0}                                                                                   
SerializationVersion           1.1.0.1                                                                                      
PSRemotingProtocolVersion      2.1          
Dies überrascht mich aber nun sehr, dass das System bei mir keine Updates (etwa des Management Frameworks) durchgeführt hat, obwohl alle wichtigen Updates gezogen werden.
Wo soll ich nachschauen?
Soll ich es hier manuell anstoßen?
Windows Management Framework 4.0 https://www.microsoft.com/de-de/download/details.aspx?id=40855

Jedenfalls über Windows Updates war so was hier bei mir noch nie angeboten…
Member: colinardo
colinardo Aug 16, 2016 updated at 09:41:46 (UTC)
Goto Top
PSVersion 2.0
Wie vermutet.
Dies überrascht mich aber nun sehr, dass das System bei mir keine Updates (etwa des Management Frameworks) durchgeführt hat, obwohl alle wichtigen Updates gezogen werden.
Nö, das Management Framework wird nicht durch Windows Updates auf eine neue Version gezogen, das muss man immer manuell installieren!! Genau so wie das NET-Framework sich nicht selber von Version 2 auf 4 updated, da musst du genauso Hand anlegen ...
Member: evinben
evinben Aug 16, 2016 updated at 12:27:27 (UTC)
Goto Top
Jetzt habe ich PowerShell aus dem oberen Link aktualisiert (Windows Management Framework 4.0).
Die Oberfläche sieht ganz anders aus, gleich mit einer praktischer Befehlsliste und Suche rechts face-wink.

Beim Ausführen erhalte ich weiterhin Fehlermeldung:
Ausnahme beim Festlegen von "IsHidden": "Ausnahme von HRESULT: 0x80240044"  
In D:\Windows Update ausblenden (einzelne KBs aus .txt-Datei einlesen_ab PS v.3.0).ps1:10 Zeichen:145
+ ...  -in $ids} | %{$_.IsHidden = $true}
+                    ~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) , SetValueInvocationException
    + FullyQualifiedErrorId : CatchFromBaseAdapterSetValueTI
Member: colinardo
Solution colinardo Aug 16, 2016 updated at 12:49:41 (UTC)
Goto Top
Das liegt aber definitiv nicht am Skript,.
Du startest das Skript aber schon "elevated" ? Das ist zwingend Voraussetzung, dieser Fehler kommt nämlich wenn das Skript bzw. die Konsole nicht elevated gestartet wurde!

Ansonsten liegt es dann an deiner Maschine:
https://www.google.de/search?q=0x80240044
Member: evinben
evinben Aug 16, 2016 updated at 18:29:20 (UTC)
Goto Top
entschuldige mich bitte sehr. Ich hätte einfach selbst nach dem Fehler suchen müssen … (hab leider auf der Schnelle den Error-Code übersehen, da ich in der Eile war).
Dies alles ist für mich hier erstmals sehr verwirrend mit PowerShell bzw. mit dort intern angestoßenen Tools, welche so eine kryptische Meldung wegen nicht ausreichender Rechten ausgeben … grrrr
Auf der Schnelle bin ich gar nicht drauf gekommen, dass dies so eine banale Ursache sein könnte.
Sonst melden gewöhnlich doch fast alle Tools "geheimnislos" wörtlich verständlich (über Batch, VBS oder sonst wo überall in Windows), dass zur Ausführung keine Zugriffsberechtigungen vorliegen (wenn versucht wird angestoßene Prozessaufgaben bloß mit normalen Rechten auszuführen, welche nur für hohe Rechte zugelassen sind).
Über PowerShell-Dateien habe ich nicht diese klassische "Rechtsklick>Ausführen als Admin…"-Option im Kontextmenü, wie bei sonstigen bat, cmd, exe, reg, vbs und anderen ausführbare Dateien. Dies werde ich aber gleich ins Kontextmenü einbauen!

So und hier ist der neue Kontextmenü-Eintrag:
Dateiname: "Option 'Als Administrator ausführen' zum Kontextmenü für 'Microsoft.PowerShellScript.1' hinzufügen.reg"
und ihr Inhalt:
Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\Microsoft.PowerShellScript.1\Shell\runas]
"HasLUAShield"=""  

[HKEY_CLASSES_ROOT\Microsoft.PowerShellScript.1\Shell\runas\Command]
;@="\"C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\powershell_ise.exe\" \"%1\""  

;Oder über "powershell.exe" direkt ausführen:  
@="\"C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\powershell.exe\" \"-noexit\" \"%1\""  
Nun habe ich eine "RunAsAdmin"-Möglichkeit auch über .ps1-Dateien. Und es funktioniert auch "elevated" face-wink!

Oben sind zwei Varianten: Skripte über powershell_ise.exe oder über powershell.exe mit erhöhten Rechten laufen zu lassen.
Aber über powershell.exe hat es bei mir erst funktioniert, nachdem ich die Argument-Variable [%1] zwischen drei Anführungszeichen gesetzt habe (im Gegensatz zu den Syntax-Varianten, welche in der Registrierung sonst zu finden waren).

Also es werden keine Fehler mehr in derPowerShell mit diesem Skript gemeldet.
Wäre es so OK oder hättest du da bessere Lösungen bzw. wie sollte es eigentlich offiziell mit "elevated rights" gemacht werden und wie würdest du es machen?

Nik
Member: colinardo
colinardo Aug 16, 2016 updated at 18:21:11 (UTC)
Goto Top
Zitat von @evinben:
Nun habe ich eine "RunAsAdmin"-Möglichkeit auch über .ps1-Dateien. Und es funktioniert auch "elevated" !
Ja ja die Powershell Anfänger face-wink, Danke für deine Mühe die hätte ich dir auch abnehmen können face-wink, aber egal so lernt man wenigstens was wenn man es sich selber erarbeitet.
Wäre es so OK oder hättest du da bessere Lösungen bzw. wie sollte es eigentlich offiziell mit "elevated rights" gemacht werden und wie würdest du es machen?
Über den Taskplaner z.B. oder man lässt das Script selber überprüfen ob es elevated gestartet wurde oder nicht, dann startet es sich im Fall der Fälle selber nochmal elevated, habe ich hier im Forum schon mal in folgendem Thread gezeigt:
Powershell Script mit Benutzerabfrage

p.s. Deine Kontextmenü-Variante läuft z.B. auf einem Windows 10 nicht, ich mache das für den Kontextmenüeintrag immer so
Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\Microsoft.PowerShellScript.1\Shell\RunAsAdmin]
@="Run As Admin"  
"HasLuaShield"=""  

[HKEY_CLASSES_ROOT\Microsoft.PowerShellScript.1\Shell\RunAsAdmin\command]
@="\"C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\powershell.exe\" -Executionpolicy ByPass -Command \"start powershell -Verb runas -ArgumentList \\\"-File `\\\"%1`\\\"\\\"\""  
Member: evinben
evinben Aug 16, 2016 at 18:26:44 (UTC)
Goto Top
Ich wollte oben gleich "gierig" auch über powershell.exe mit erhöhten Rechten laufen zu lassen.
@="\"C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\powershell.exe\" \"-noexit\" \"%1\"""  
aber es funktioniert so nicht, wie ich es auf der Schnelle angenommen habe (nur die Shell öffnet sich ohne aber die Datei zu berücksichtigen).
Obwohl die Argument-Variable [%1] in Anführungszeichen gesetzt ist, werden Pfade mit Leerzeichen nicht korrekt verarbeitet (Aufsplittung in mehreren Argumenten). Die Variable zwischen so viele Anführungszeichen zu setzen, bringt also doch nichts.

Danke für die Verlinkung zu dem anderen Beitrag. Ich habe es mir gleich als Script abgespeichert.