Saludo0s a todos

Pues mi duda es esa, de que manera ó maneras podria determinar que sistema operativo corre en una pc, ya sea xp, vista o seven en VB6.

Se agradece de antemano cualquier ayuda o comentario.

pedrito90
pues se usa la Api get version y getversionex

edito:

Aquí tienes la forma de averiguar la versión de Windows en la que se está ejecutando tu aplicación.

Te muestro dos formas de averiguarlo, una es usando la función GetVersion y la otra es usando GetVersionEx que utiliza el tipo de datos OSVERSIONINFOEX.
Aunque en realidad son tres formas, pero dos de ellas usan la misma función GetVersionEx aunque con dos versiones diferentes del tipo OSVERSIONINFO.


Las definiciones de las funciones, tipos y constantes

La función GetVersion es muy simple, solo devuelve un valor de tipo Long en el que están los tres valores típicos de la versión: Mayor, Menor y Build. Lo que pasa es que está todo como "aglomerado" y hace falta desglosarlo, para ese desglose se deben tomar los valores dividiendo (o troceando) el valor en distintas partes, para eso se necesitan de otras funciones, ahora lo verás en la sección de cómo usar la función.

La definición de la función:

Código: Seleccionar todo

Private Declare Function GetVersion Lib "kernel32" () As Long


La función GetVersionEx utiliza un tipo de datos en el que se indican los diferentes valores. Esa versión puede usar el mismo tipo pero con más o menos información, por tanto, aquí te muestro dos definiciones según se quiera usar la versión reducida o extendida.

La definición de los tipos y las funciones:

'

Código: Seleccionar todo

 La versión simple
Private Type OSVERSIONINFO
    dwOSVersionInfoSize As Long
    dwMajorVersion As Long
    dwMinorVersion As Long
    dwBuildNumber As Long
    dwPlatformId As Long
    szCSDVersion As String * 128
End Type

Private Declare Function GetVersionEx Lib "kernel32" Alias "GetVersionExA" _
    (lpVersionInformation As OSVERSIONINFO) As Long


' La versión extendida
Private Type OSVERSIONINFOEX
    dwOSVersionInfoSize As Long
    dwMajorVersion As Long
    dwMinorVersion As Long
    dwBuildNumber As Long
    dwPlatformId As Long
    szCSDVersion As String * 128
    wServicePackMajor As Integer
    wServicePackMinor As Integer
    wSuiteMask As Integer
    wProductType As Byte
    wReserved As Byte
End Type

Private Declare Function GetVersionEx2 Lib "kernel32" Alias "GetVersionExA" _
    (lpVersionInformation As OSVERSIONINFOEX) As Long

Cómo usar las funciones y tratar los resultados

Para usar la función GetVersion no hay que hacer nada especial, salvo guardar el valor en una variable de tipo Long, y como te comentaba antes, ese valor hay que "desgranarlo" para obtener los valores correspondientes.

Veamos cómo se usa y más abajo puedes ver las funciones "extras" que he usado:

Código: Seleccionar todo

Dim ret As Long
Dim s As String

' Usando GetVersion
ret = GetVersion
    
Dim vMajor As Long, vMinor As Long, vBuild As Long
    
vMajor = LoByte(LoWord(ret))
vMinor = HiByte(LoWord(ret))

' A partir de NT 4 tiene el Build (no en Me/9x)
vBuild = HiWord(ret)
    
s = "Versión: " & _
            vMajor & "." & vMinor & "." & vBuild


Para usar la versión GetVersionEx debemos declarar una variable del tipo OSVERSIONINFO que es donde nos indica los valores de la versión. Aquí te muestro el código de forma simple, pero en el ZIP con el proyecto completo para Visual Basic 6.0 tienes más información de cómo identificar el sistema operativo según los valores de la versión.

Código: Seleccionar todo

Dim OSInfo As OSVERSIONINFO
Dim ret As Long
Dim s As String

OSInfo.szCSDVersion = Space$(128)
OSInfo.dwOSVersionInfoSize = Len(OSInfo)
ret = GetVersionEx(OSInfo)

s = "MajorVersion     " & OSInfo.dwMajorVersion & vbCrLf & _
    "MinorVersion     " & OSInfo.dwMinorVersion & vbCrLf & _
    "BuildNumber      " & OSInfo.dwBuildNumber & vbCrLf & _
    "PlatformId       " & OSInfo.dwPlatformId & vbCrLf & _
    "CSDVersion       " & szTrim(OSInfo.szCSDVersion)

Me.txtOSVersion.Text = s


Las versiones de Windows dependen del valor de Mayor y Menor, (y la combinación de los dos), y más o menos te puede servir la siguiente tabla, que es aplicable a los valores de las dos funciones comentadas:

Sistema operativo Mayor
Windows NT 3.51 3
Windows 95, 98, Me y NT 4.0 4
Windows 2000, XP y 2003 5
Windows Vista/Longhorn 6


Sistema operativo Menor
Windows NT 3.51 51
Windows 95 0
Windows 98 10
Windows Me 90
Windows NT 4.0 0
Windows 2000 0
Windows XP 1
Windows 2003 2
Windows Vista/Longhorn 0

Por ejemplo, si el valor de Mayor es 5 y el de Menor es 2 es un Windows 2003 Server.
Si el valor de Mayor es 5 y el de Menor es 1 es un Windows XP.

Para averiguar cosas de Windows 9x o de Windows 2000 Server, si es XP Home o Profesional, lo ves en el ejemplo completo, que están casi todas las explicaciones necesarias y que son aburridas y no es plan de rellenar con cosas que a lo mejor no es lo que te interesa.

Código: Seleccionar todo

Private Function szTrim(ByVal s As String) As String
    ' Quita los caracteres en blanco y los Chr$(0)                  (13/Dic/01)
    Dim i As Long

    i = InStr(s, vbNullChar)
    If i Then
        s = Left$(s, i - 1)
    End If
    s = Trim$(s)
    
    szTrim = s
End Function

Private Function LoWord(ByVal Numero As Long) As Long
    ' Devuelve el LoWord del número pasado como parámetro
    LoWord = Numero And &HFFFF&
End Function

Private Function HiWord(ByVal Numero As Long) As Long
    ' Devuelve el HiWord del número pasado como parámetro
    HiWord = Numero \ &H10000 And &HFFFF&
End Function

Private Function LoByte(ByVal Numero As Integer) As Integer
    ' Devuelve el LoByte del número pasado como parámetro
    LoByte = Numero And &HFF
End Function

Private Function HiByte(ByVal Numero As Integer) As Integer
    ' Devuelve el HiByte del número pasado como parámetro
    HiByte = Numero \ &H100 And &HFF
End Function
Solo lee el registro


Sistema Operativo:

Código: Seleccionar todo

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Productname
Service Pack:

Código: Seleccionar todo

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\csdversion
Versión: (solo modificados)

Código: Seleccionar todo

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\RegisteredOwner
Procesador:

Código: Seleccionar todo

HKEY_LOCAL_MACHINE\HARDWARE\DESCRIPTION\System\CentralProcessor\0\ProcessorNameString

Como veras hay muchas cosas que estan en el registro, solo es cuestion de buscar
Muchisimas gracias por sus respuesta!!

Lo que busco es usarlo con un modulo para desabilitar uac. Lo que tenia pensado era que, el programa obtuviera el sistema operativo usado, en caso de que fuese vista o seven usar el modulo anti UAC, y en caso contrario no.

La forma de Sanlegas la veo mas facil, pero, si el UAC está activado, ¿me permitiria leer el registro? ¿El UAC solo impide escritura en este?

Supongo que la forma que expuso slandg seria mas rapida porque utiliza apis, ¿o me equivoco?
Bueno, segun entendi, en el code me dara 2 valores (o mas) pero los que me importan es MajorVersion y MinorVersion, cierto?

entonces, para ponerlo en mi proyecto tendria que poner algo asi?:

Código: Seleccionar todo

if MajorVersion = x and MinorVersion = x then
call ANTI-UAC 
else
end sub
La cosa vendria siendo asi o me equivoco?,aun ando aprendiendo del visual, por eso las preguntas tan...duh!
De no ser de esa manera, ¿me podrian dar un ejemplito base de como poder implementarlo? =)

Gracias de antemano.
Saludo0s.
Responder

Volver a “VB/.NET”