update ultima fall descargar creators como actualizar actualizacion c# windows powershell windows-update

c# - ultima - ¿Cómo verificar mediante programación las reglas de aplicabilidad de una actualización de Windows?



windows 10 fall creators update descargar (2)

Puede utilizar la API del Agente de Windows Update para consultar las actualizaciones instaladas (de hecho, tiene mucha información), algo como esto:

// in .NET, you need to add a reference // to the WUAPI COM component located in /windows/system32/wuapi.dll // to be able to access the WUAPI object model UpdateSearcher searcher = new UpdateSearcher(); searcher.Online = false; // you can remove this line if you allow the API to get online to search var res = searcher.Search("IsInstalled=0"); // search not installed update foreach (IUpdate update in res.Updates) { Console.WriteLine("update:" + update.Title); // get history information // this can return nothing for example it it was hidden by end user // note we use update''s identity and rev number here for matching a specific update var histories = searcher.QueryHistory(0, searcher.GetTotalHistoryCount()).OfType<IUpdateHistoryEntry>().Where( h => h.UpdateIdentity.UpdateID == update.Identity.UpdateID && h.UpdateIdentity.RevisionNumber == update.Identity.RevisionNumber); foreach (var history in histories) { Console.WriteLine(" code:" + history.ResultCode); Console.WriteLine(" hr:0x" + history.HResult.ToString("X8")); } }

Sin embargo, eso no le dirá cuáles fueron las reglas internas (registro / wmi, etc.) utilizadas para determinar si se instalaron las actualizaciones. Esto no está expuesto por el WUAPI.

Al explorar el contenido de un archivo .msu de actualización de Windows (por ejemplo, al usar una herramienta como 7zip), uno puede encontrar, entre otros, una serie de archivos que definen los requisitos previos y las reglas de aplicabilidad . Por ejemplo:

<UpdateIdentity UpdateID="E6CF1350-C01B-414D-A61F-263D14D133B4" RevisionNumber="1" /><Properties UpdateType="Category" /><ApplicabilityRules><IsInstalled><True /></IsInstalled></ApplicabilityRules> .... <UpdateIdentity UpdateID="2bf7ed9c-6f43-493a-b156-db20f08c44c4" RevisionNumber="101" /><Properties UpdateType="Detectoid" /><Relationships /><ApplicabilityRules><IsInstalled><b.RegSz Key="HKEY_LOCAL_MACHINE" Subkey="SYSTEM/CurrentControlSet/Control/Nls/Language" Value="InstallLanguage" Comparison="EqualTo" Data="0409" /></IsInstalled></ApplicabilityRules> .... <UpdateIdentity UpdateID="6AECE9A4-19E3-4BC7-A20C-070A5E31AFF4" RevisionNumber="100" /><Properties UpdateType="Detectoid" /><Relationships> ... <UpdateIdentity UpdateID="3B4B8621-726E-43A6-B43B-37D07EC7019F" /><ApplicabilityRules><IsInstalled><b.WmiQuery Namespace="root/cimv2" WqlQuery="SELECT Manufacturer FROM Win32_ComputerSystem WHERE Manufacturer = ''Samsung Electronics'' or Manufacturer = ''Hewlett-Packard'' or Manufacturer = ''Gateway''" /></IsInstalled></ApplicabilityRules> ...

Ahora, dado un determinado archivo .msu y mi computadora local, ¿hay una manera de iterar sobre esas reglas y averiguar si una no está satisfecha, y cuál?

¿Puedo usar WSUS 3.0 Class Library para este propósito? ¿O hay una herramienta / script?

Lo que realmente quiero es saber con precisión qué condición hizo que una computadora rechazara una cierta actualización de Windows (KB2973201) con el mensaje La actualización no es aplicable a su computadora (el código de error detrás de esto es WU_E_NOT_APPLICABLE ).

Parece que hay muy poca documentación con respecto a estas reglas de aplicabilidad de una actualización. ¿Hay buenas fuentes?

Referencias:


Ahora, dado un determinado archivo .msu y mi computadora local, ¿hay una manera de iterar sobre esas reglas y averiguar si una no está satisfecha, y cuál?
¿Puedo usar WSUS 3.0 Class Library para este propósito? ¿O hay una herramienta / script?

Puede actualizar las Reglas de aplicabilidad a través de la biblioteca de clases WSUS 3.0, aunque no ofrece funcionalidad para verificar si las reglas se aprobarán, a menos que (supongo) ejecute el instalador, pero eso no le dice cuál falló.

Simon mencionó que la biblioteca WUAPI no expone las reglas internas y (afaik) no hay manera de hacer coincidir los códigos de resultado de WUAPI con las reglas de capacidad de aplicación que fallan.

Y, desafortunadamente, las bibliotecas como Microsoft.Deployment.WindowsInstaller.dll no funcionan con los archivos MSU, por lo que no tenemos suerte con las opciones "listas para usar". Por lo tanto, debe hacerlo manualmente con el código y el archivo XML (msu.xml):

<Updates> <UpdateIdentity UpdateID="E6CF1350-C01B-414D-A61F-263D14D133B4" RevisionNumber="1" /> <Properties UpdateType="Category" /> <ApplicabilityRules> <IsInstalled> <True /> </IsInstalled> </ApplicabilityRules> <UpdateIdentity UpdateID="2bf7ed9c-6f43-493a-b156-db20f08c44c4" RevisionNumber="101" /> <Properties UpdateType="Detectoid" /> <Relationships /> <ApplicabilityRules> <IsInstalled> <b.RegSz Key="HKEY_LOCAL_MACHINE" Subkey="SYSTEM/CurrentControlSet/Control/Nls/Language" Value="InstallLanguage" Comparison="EqualTo" Data="0409" /> </IsInstalled> </ApplicabilityRules> <UpdateIdentity UpdateID="6AECE9A4-19E3-4BC7-A20C-070A5E31AFF4" RevisionNumber="100" /> <Properties UpdateType="Detectoid" /> <Relationships></Relationships> <UpdateIdentity UpdateID="3B4B8621-726E-43A6-B43B-37D07EC7019F" /> <ApplicabilityRules> <IsInstalled> <b.WmiQuery Namespace="root/cimv2" WqlQuery="SELECT Manufacturer FROM Win32_ComputerSystem WHERE Manufacturer = ''Dell Inc.'' or Manufacturer = ''Samsung Electronics'' or Manufacturer = ''Hewlett-Packard'' or Manufacturer = ''Gateway''" /> </IsInstalled> </ApplicabilityRules> </Updates>

Use este código para ver qué errores de ApplicabilityRules:

private void btnWillPassApplicabilityRules_Click(object sender, EventArgs e) { XDocument doc = XDocument.Load("msu.xml"); var elements = doc.Element("Updates").Elements("ApplicabilityRules").Elements("IsInstalled").Elements(); foreach (var element in elements) { if (element.ToString().StartsWith("<b.RegSz")) { string subKeyName = element.Attribute("Subkey").Value; string keyName = element.Attribute("Value").Value; string keyValue = element.Attribute("Data").Value; //TODO: Leave the Registry Hive "Switch()" upto reader to fully implement if (!ValueExistsInRegistry(Registry.LocalMachine, subKeyName, keyName, keyValue)) { Console.WriteLine("Install is not applicable as Applicability Rule failed: " + element.ToString()); } } else if (element.ToString().StartsWith("<b.WmiQuery")) { string nameSpace = element.Attribute("Namespace").Value; string wqlQuery = element.Attribute("WqlQuery").Value; if (!ValueExistsInWMI(nameSpace, wqlQuery)) { Console.WriteLine("Install is not applicable as Applicability Rule failed: " + element.ToString()); } } } } private bool ValueExistsInRegistry(RegistryKey root, string subKeyName, string keyName, string keyValue) { using (RegistryKey key = root.OpenSubKey(subKeyName)) { if (key != null) return keyValue == key.GetValue(keyName).ToString(); } return false; } private bool ValueExistsInWMI(string nameSpace, string wqlQuery) { ManagementScope scope = new ManagementScope(String.Format("////{0}//" + nameSpace, "."), null); //The "." is for your local PC scope.Connect(); ObjectQuery query = new ObjectQuery(wqlQuery); ManagementObjectSearcher searcher = new ManagementObjectSearcher(scope, query); if (searcher.Get().Count == 0) { return false; } else { return true; } return false; } }

Antes de ejecutar las Reglas de aplicabilidad, es mejor verificar primero si la actualización pasará la prueba de aplicabilidad del sistema operativo (OS) y del paquete de servicios (SP). No hay ningún punto que compruebe el registro / wmi, etc. para determinar si una actualización pasará las reglas si no es aplicable al sistema operativo y al SP .

Para ver ApplicabilityInfo, ejecute la utilidad de línea de comandos expand :

expand -f:* "C:/temp/msu/Windows6.1-KB2973201-x64.msu" "C:/temp/msu"

Esto creará los siguientes archivos:

  • WSUSSCAN.cab
  • Windows6.1-KB2973201-x64.cab
  • Windows6.1-KB2973201-x64.xml
  • Windows6.1-KB2973201-x64-pkgProperties.txt

Los archivos xml y txt tardan unos 5 segundos en crearse. Abra el archivo pkgProperties.txt y la línea superior tiene la información:

ApplicabilityInfo = "Windows 7.0 Client SP1; Windows 7.0 Server Core SP1; Windows 7.0 Embedded SP1; Windows 7.0 Server SP1; Windows 7.0 WinPE 3.1;"

Ref. MSDN: Descripción del instalador independiente de Windows Update en Windows