Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   API de Windows (https://www.clubdelphi.com/foros/forumdisplay.php?f=7)
-   -   Obtener version del Service Pack de Windows (https://www.clubdelphi.com/foros/showthread.php?t=78815)

fide_uci 18-05-2012 20:57:24

Obtener version del Service Pack de Windows
 
Hola amigos,

La cuestion es que estoy desarrollando una aplicacion capaz de determinar si una computadora es actualizada con regularidad, si está desactualizada y cosas así leyendo con WUA (Windows Update Client Api) las actualizaciones instaladas y comparando contra una BD de actualizaciones portable actualizada para determinar cuales actualizaciones no tiene el cliente etc. La verdad es que la tengo casi terinada pero ahora necesito la version del Service Pack de Windows pero ojo, no puede ser con WMI ni con QuickFix_Engineering que puede darse el caso no esten instaladas y/o habilitadas en la PC, por eso necesito una via que sea mediante alguna funcion super escondida del API de Windows o algo asi :P. Por favor si alguien sabe de esto que me eche una mano. Cuando la termine la pienso publicar para que la gente vea y estudie el codigo fuente y lo reutilize en otras labores.

roman 18-05-2012 21:18:23

Código Delphi [-]
var
  VersionInfo: TOSVersionInfo;

begin
  VersionInfo.dwOSVersionInfoSize := SizeOf(VersionInfo);
  GetVersionEx(VersionInfo);  
  ShowMessage(VersionInfo.szCSDVersion);
end;

// Saludos

fide_uci 18-05-2012 21:24:42

Algo como esto se podria uttilizar pero tengo temor de que en versiones de Windows XP u otras que no este instalada la WMI me falle la aplicacion.

Código:

procedure  GetWin32_OperatingSystemInfo;
const
  wbemFlagForwardOnly = $00000020;
var
  FSWbemLocator : OLEVariant;
  FWMIService  : OLEVariant;
  FWbemObjectSet: OLEVariant;
  FWbemObject  : OLEVariant;
  oEnum        : IEnumvariant;
  iValue        : LongWord;
begin;
  //Todas las propiedades y metodos de Win32_OperatingSystem aqui:
  //Win32_OperatingSystem http://msdn.microsoft.com/en-us/library/windows/desktop/aa394239%28v=vs.85%29.aspx

  FSWbemLocator := CreateOleObject('WbemScripting.SWbemLocator');
  FWMIService  := FSWbemLocator.ConnectServer('localhost', 'root\CIMV2', '', '');
  FWbemObjectSet:= FWMIService.ExecQuery('SELECT * FROM Win32_OperatingSystem','WQL',wbemFlagForwardOnly);
  oEnum        := IUnknown(FWbemObjectSet._NewEnum) as IEnumVariant;
  while oEnum.Next(1, FWbemObject, iValue) = 0 do
  begin
    Writeln(Format('Caption = %s', [FWbemObject.CSDVersion]));// String
    Writeln('');
    FWbemObject:=Unassigned;
  end;
end;


fide_uci 18-05-2012 21:28:36

Roman, resulta ser que he probado tu funcion y me devuelve "Service Pack 3" cuando en realidad tengo Windows 7 Service Pack 1. El mismo resultado me lo esta devolviendo otro componente de la Jedi que al pareces utiliza esa misma forma. Con la funcion que puse mas arriba si me devuelve Service Pack 1 (que es el que tengo instalado y el que sale en las propiedades del sistema). No se que será lo que sucede pero por el momento voy a resolver con WMI hasta que encuentre otra vía. Gracias de todas formas y bueno si tienes alguna idea de por que puede estar sucediendo esto te lo agradecería.

Saludos...

roman 18-05-2012 21:50:41

¡Vaya! Pues ¡qué raro! En mi caso da el valor correcto. También he visto que algunos lo toman del registro de windows:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion

de la clave CSDVersion.

// Saludos

fide_uci 19-05-2012 16:27:45

Si pero bueno para leer dicha clave no necesito tener privilegios de administrador? o puedo simplemente leerlo sin problemas ?


La franja horaria es GMT +2. Ahora son las 15:21:58.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi