Páginas

miércoles, 10 de febrero de 2016

Corrección para la función "Saber la versión de Windows instalada desde VB.Net"

Parche  Algunas semanas atrás publiqué el código fuente de una función en VB.Net para obtener la versión de Windows instalada, pues bien, aunque el código fuente trabajaba bien, no lo hacía con Windows 10. Este era detectado como Windows 8, sin embargo gracias a una persona que sigue este blog y reportó el problema, el mismo ya ha sido corregido y a continuación lo publico para beneficio de todos, no sin antes darle las gracias.

  Una de las grandes ventajas del mundo Open Source es, no solo beneficiarnos del trabajo de alguien más (legalmente), sinó de aprender de otros y si en nuestras manos está, poder ayudar a alguien más. Creo que eso es algo estupendo y en lo personal un servidor ha podido comprobarlo con sus propios ojos; como mencionaba al principio el código fuente original al parecer trabajaba bien, pero con la última versión del sistema operativo Windows (10) no funcionaba correctamente.

Publicidad


  Pues bien, Javier Gutierrez Chamorro (Guti) se dio a la tarea de hacerme la observación de que dicho código fuente no trabajaría en Windows 10, me hizo una sugerencia para mejorarlo. Lamentablemente no pude implementarla en VB.Net, pero ya confirmando que efectivamente el código no trabajaba en la última versión de Windows busque otra alternativa y la comparto, esperando les sea de utilidad.

La solución consiste en analizar el registro de Windows. Este sistema operativo guarda el nombre (al igual que la versión de bits del mismo) en dicha base de datos, lo único que hay que hacer entonces es saber donde buscar y recuperar esos datos y listo, si todo sale bien obtendremos el nombre del sistema operativo, de lo contrario o en caso de error recurrimos a la versión anterior de dicho código fuente. Dejo algunas capturas de pantalla para mostrar que ahora si funciona correctamente guiño.






Procedencia de las imágenes:
File: Parche (clipart)
URL: http://images.all-free-download.com/images/graphiclarge/two_patch_icon_clip_art_9626.jpg
Licencia: Creative Commons

Código fuente corregido:

'#### Purpose: Return windows version
  '#### Created date: 27/10/2012
  '#### Created by username: Juan Manuel Mar Hdz.
  '#### Last modified date: 21/01/2016
  '#### Thanks to Javier Gutierrez Chamorro (GUTI) http://www.javiergutierrezchamorro.com/
  '#### Detection of bug thanks to GUTI http://marjuanm.blogspot.mx/2016/01/saber-la-version-de-windows-instalada.html?showComment=1453388084860#c6644367260581658729
  '#### Thanks to https://social.technet.microsoft.com/Forums/en-US/fab32208-ac7f-4e7a-9295-ce963967bc25/how-do-i-convert-windows-10-pro-technical-preview-to-windows-10-enterprise-technical-preview-and?forum=WinPreview2014General
  Public Function getVersion() As String
 
  Dim winver As String = ""
  Dim key As Microsoft.Win32.RegistryKey = Microsoft.Win32.Registry.LocalMachine
 
  Try
 
  winver = key.OpenSubKey("SOFTWARE\Microsoft\Windows NT\CurrentVersion").GetValue("ProductName").ToString().Trim
 
  If winver.IsNullOrEmpty(winver) = False Then
  Return winver.Trim
  Else
  Return getVersionByClassicalMethod().Trim
  End If
 
  Catch exp As Exception
 
  Try
  Return getVersionByClassicalMethod().Trim
  Catch ex As Exception
  Return "Unknown"
  End Try
 
  End Try
 
  End Function

  '#### Purpose: Return windows version
  '#### Created date: 21/01/2016
  '#### Created by username: Juan Manuel Mar Hdz.
  '#### Last modified date: 21/01/2016
  '#### Last modified username: Juan Manuel Mar Hdz.
  '#### Thanks to http://social.msdn.microsoft.com/Forums/en-US/csharpgeneral/thread/5956c04f-072a-406c-ae6a-cc8b3a207936
  '#### Thanks to https://en.wikipedia.org/wiki/Windows_NT
  '#### Thanks to https://msdn.microsoft.com/en-gb/library/windows/desktop/ms724833%28v=vs.85%29.aspx
  Private Function getVersionByClassicalMethod() As String
 
  Dim strVersion As String = "Unknown"
 
    Select Case Environment.OSVersion.Platform
   
     Case PlatformID.Win32S
            strVersion = "Windows 3.1"
         
        Case PlatformID.Win32Windows
         
            Select Case Environment.OSVersion.Version.Minor
           
            Case 0I
                  strVersion = "Windows 95"
               
            Case 10I
           
             If Environment.OSVersion.Version.Revision.ToString() = "2222A" Then
                    strVersion = "Windows 98 Second Edition"
                  Else
                    strVersion = "Windows 98"
                  End If
               
              Case 90I
                  strVersion = "Windows ME"
               
            End Select
             
        Case PlatformID.Win32NT
       
         Select Case Environment.OSVersion.Version.Major
         
           Case 3I
                    strVersion = "Windows NT 3.51"
                Case 4I
                    strVersion = "Windows NT 4.0"
                 
                Case 5I
               
                 Select Case Environment.OSVersion.Version.Minor
                 
                    Case 0I
                            strVersion = "Windows 2000"
                         
                    Case 1I
                     strVersion = "Windows XP"
                   
                    Case 2I
                            strVersion = "Windows XP/Windows 2003/Windows Server 2003 R2/Windows Home Server"
                             
                     End Select
                     
                Case 6I
               
                 Select Case Environment.OSVersion.Version.Minor
                         
                         Case 0I
                             strVersion = "Windows Vista/Windows Server 2008"
                           
                         Case 1I
                            strVersion = "Windows 7/Windows Server 2008 R2/Windows Server 2011"
                         
                         Case 2I
                            strVersion = "Windows 8/Windows Server 2012"
                         
                         Case 3I
                            strVersion = "Windows 8.1/Windows Server 2012 R2"
                         
                         Case 4I
                            strVersion = "Windows 8.1/Windows Server 2012 R2"
                         
                    End Select
                 
                 
                Case 10I
               
                 Select Case Environment.OSVersion.Version.Minor
                         
                         Case 0I
                             strVersion = "Windows 10"
                           
                    End Select
                 
             End Select
             
          Case PlatformID.WinCE
              strVersion = "Windows CE"
           
          Case PlatformID.Unix
              strVersion = "Unix"
             
    End Select
 
    Return strVersion
     
  End Function

¿Te gustó este post?, entonces si lo deseas puedes apoyarnos para continuar con nuestra labor, gracias.

6 comentarios:

  1. Muchísimas gracias por la mención Manuel.

    Personalmente no me gusta nada confiar en el registro de Windows para acceder a determinadas características. Principalmente porque es algo en general no documentado, y que por tanto puede cambiar de una versión a otra. Además de ser bastante ineficiente como todos sabemos.

    No se que problemas tuviste para implementar RtlGetVersion en VB.NET, en principio la idea es la misma que en otro lenguaje. Cargamos dinámicamente la librería, obtenemos la función y la ejecutamos.

    Aquí verás un ejemplo: http://www.vbforums.com/showthread.php?800859-Get-Windows-Version&p=4907705&viewfull=1#post4907705

    Saludos.

    ResponderBorrar
    Respuestas
    1. Te agradezco mucho tu apoyo, quizá me falta mucha experiencia programando después de todo #:-S , pero de cualquier modo gracias por todo.

      Borrar
  2. Es todo cuestión de práctica y perseverar.
    Cualquier duda que tengas ya sabes donde estoy :-)

    ResponderBorrar
  3. Sigue sin funcionar en Windows 10, por lo menos a mi, me dice que Windows 8. ¿Hay alguna forma de solucionar esto?.

    ResponderBorrar
    Respuestas
    1. Que tal Alvaro, gracias por tu comentario, es raro porque a mi si me funciona, podrías por favor entrar a tu registro de windows e indicarme que valor te da en HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion?, busca ahora la entrada ProductName, gracias.

      Borrar
  4. A mi en Windows 10 Anniversary también me funciona. Mi entrada de registro da Windows 10 Home.

    ResponderBorrar