Ir al contenido



Foto

Como obtener las actualizaciones y parches del sistema


  • Por favor identifícate para responder
6 respuestas en este tema

#1 JoAnCa

JoAnCa

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 742 mensajes
  • LocationPinar del Río, Cuba

Escrito 27 junio 2014 - 11:19

Hola a todos
Sigo con mi software de auditoría informática, ahora el problema que se me presentó fue al obtener las actualizaciones (updates) y parches (Hotfix) del sistema operativo
Estaba usando un componente de MiTEc, pero me dio incompatibilidad con sistemas de 64 bit, y por lo tanto ya tuve que desistir del mismo
Se que esos datos estan en el Registro de Windows, pero me pierdo un poco a la hora de sacarlos del regedit para ubicarlos en un ListView

Lo que necesito es la forma de obtener el listado de todas las actualizaciones (updates) y parches (Hotfix), ya sea por el Registro de Windows o por otra vía


  • 0

#2 JoAnCa

JoAnCa

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 742 mensajes
  • LocationPinar del Río, Cuba

Escrito 30 junio 2014 - 10:55

Parace que no se entiende bien lo que quiero  :| :

La clave del Registro es:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Updates

En esa clave se almacena cada software que se actualiza como clave y sus actualizaciones como sublaves, y en los datos (a la derecha) el nombre de la actualizacion, fecha, tipo (hotfix o update), etc

Mas bien la pregunta podria ser, como leer esta clave del Registro  :undecided:




  • 0

#3 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.047 mensajes
  • LocationMéxico

Escrito 30 junio 2014 - 01:03

Pues se entiende y yo usaría la unidad TRegistry para hacer un bucle con ReadString() para recorrer las claves del registro.

Recuerdo que alguna vez hice un componente para leer el registro de windows y colocar las llaves en un treeview, voy a ver si aún lo tengo, se llama RegistryEditor, estaba en éste hilo pero está dañado :(

Saludos
  • 0

#4 escafandra

escafandra

    Advanced Member

  • Moderadores
  • PipPipPip
  • 3.898 mensajes
  • LocationMadrid - España

Escrito 30 junio 2014 - 01:08

Quizás esto te de alguna idea.

Saludos.
  • 0

#5 escafandra

escafandra

    Advanced Member

  • Moderadores
  • PipPipPip
  • 3.898 mensajes
  • LocationMadrid - España

Escrito 01 julio 2014 - 09:48

Ahora, con un poco de tiempo, te muestro un ejemplo para leer esa clave y subclaves encontrando las actualizaciones escritas en el registro de windows.

Debe ejecutarse como administrador, al menos en Win8 que es donde lo he escrito y probado.

delphi
  1. program Updates;
  2.  
  3. {$APPTYPE CONSOLE}
  4.  
  5. uses
  6.   SysUtils, Windows, RegEx;
  7.  
  8.  
  9. function ListRegAction(hKey0: HKEY; Path, Name: PCHAR; KeyType: integer; VData: PBYTE; Size: DWORD): integer; stdcall;
  10. begin
  11.   if KeyType = -1 then WriteLn(Name);
  12.   if (KeyType = REG_EXPAND_SZ) or (KeyType = REG_SZ) or (KeyType = REG_MULTI_SZ) then
  13.     if lstrcmp(Name, 'ThisVersionInstalled') = 0 then
  14.     begin
  15.       if (PCHAR(VData) = 'Y') or (PCHAR(VData) = 'y') then
  16.         WriteLn('Instalado')
  17.       else WriteLn('No Instalado');
  18.     end;
  19.   Result:= 0;
  20. end;
  21.  
  22.  
  23. begin
  24.   ScanRegistry('HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Updates', '', @ListRegAction, List or SubKeys, nil, false);
  25.   ReadLn;
  26. end.

Nota: El fuente de la unit RegEx lo encuentras aquí.


Saludos.
  • 0

#6 JoAnCa

JoAnCa

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 742 mensajes
  • LocationPinar del Río, Cuba

Escrito 02 julio 2014 - 07:34

Muchas gracias por la ayuda,  (y)
Con eso aprendí más a manipular el Registro de windows, no obstante ya habia encontrado una solución un poco mas sencilla, pero quizas se pueda optimizar un poco, pues lo hice ensayando hasta que me saliera lo que quería y todavía no lo he optimizado


delphi
  1. procedure TfrmAuditor.btnUpdatesClick(Sender: TObject);
  2. const
  3.   Updates = '\SOFTWARE\Microsoft\Updates';
  4.  
  5. var
  6.   i,:integer;
  7.   Registro            :TRegistry;
  8.   ListSoft, LsAct,
  9.   LsValores            :TStringList;
  10.   ListItem            :TListItem;
  11.   Tipo, Desc, Fabric  :String;
  12.  
  13. begin
  14.   Screen.Cursor:= crHourGlass;
  15.   lblResult.Caption:='Parches y Actualizaciones Instalados';
  16.   btnMasDetalles.Enabled:=False;
  17.   CualBoton:=8;
  18.   {Inicializar el ListView}
  19.   with lvResultados do
  20.   begin
  21.     Clear; Columns.Clear;
  22.     with Columns.Add do
  23.     begin
  24.       Caption:='Software';
  25.       Width:=170;
  26.     end;
  27.     with Columns.Add do
  28.     begin
  29.       Caption:='Actualización';
  30.       Width:=80;
  31.     end;
  32.     with Columns.Add do
  33.     begin
  34.       Caption:='Tipo';
  35.       Width:=60;
  36.     end;
  37.     with Columns.Add do
  38.     begin
  39.       Caption:='Descripción';
  40.       Width:=350;
  41.     end;
  42.   end;
  43.  
  44.   Registro:=TRegistry.Create;
  45.   ListSoft:=TStringList.Create;    //Nombre de la Aplicacion
  46.   LsAct:=TStringList.Create;      //Nombre de la actualizacion
  47.   LsValores:=TStringList.Create;  //Valores
  48.  
  49.   with Registro do
  50.     begin
  51.     RootKey:=HKEY_LOCAL_MACHINE;
  52.     OpenKey(Updates, False);
  53.     GetKeyNames(ListSoft);
  54.  
  55.     for i:=0 to ListSoft.Count-1 do
  56.     begin
  57.       OpenKey(Updates + '\' + ListSoft.Strings[i], False);
  58.       GetKeyNames(LsAct);
  59.  
  60.       ListItem:=lvResultados.Items.Add;
  61.       ListItem.Caption:=ListSoft.Strings[i];
  62.       for j:=0 to LsAct.Count-1 do
  63.       begin
  64.         ListItem:=lvResultados.Items.Add;
  65.         ListItem.SubItems.Add(LsAct.Strings[j]);
  66.  
  67.         //--- Obtener los Valores ---
  68.         OpenKey(Updates + '\'+ ListSoft.Strings[i] +'\'+ LsAct.Strings[j], False);
  69.         GetValueNames(LsValores);
  70.  
  71.         if LsValores.IndexOf('ReleaseType') <> -1 then
  72.           Tipo:=Registro.ReadString(LsValores.Strings[LsValores.IndexOf('ReleaseType')])
  73.         else
  74.           Tipo:='';
  75.         if LsValores.IndexOf('PackageName') <> -1 then
  76.           Desc:=Registro.ReadString(LsValores.Strings[LsValores.IndexOf('PackageName')])
  77.         else
  78.           Desc:='';
  79.  
  80.         ListItem.SubItems.Add(Tipo);
  81.         ListItem.SubItems.Add(Desc);
  82.       end;
  83.     end;
  84.     end;
  85.  
  86.   ListSoft.Free; LsAct.Free;
  87.   Registro.CloseKey;
  88.   Registro.Destroy;
  89.   Screen.Cursor:= crDefault;
  90. end;

De esta forma me sale bien lo que quiero
(h)


:| Donde esta lo de configurar el codigo delphi? no lo veo  ^o|
  • 0

#7 escafandra

escafandra

    Advanced Member

  • Moderadores
  • PipPipPip
  • 3.898 mensajes
  • LocationMadrid - España

Escrito 02 julio 2014 - 09:29

Donde esta lo de configurar el codigo delphi? no lo veo  ^o|


[nobbc][code=delphi][/code][/nobbc]


Saludos.
  • 0