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 .
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.
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.
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 .
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.
Muchísimas gracias por la mención Manuel.
ResponderBorrarPersonalmente 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.
Te agradezco mucho tu apoyo, quizá me falta mucha experiencia programando después de todo #:-S , pero de cualquier modo gracias por todo.
BorrarEs todo cuestión de práctica y perseverar.
ResponderBorrarCualquier duda que tengas ya sabes donde estoy :-)
Sigue sin funcionar en Windows 10, por lo menos a mi, me dice que Windows 8. ¿Hay alguna forma de solucionar esto?.
ResponderBorrarQue 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.
BorrarA mi en Windows 10 Anniversary también me funciona. Mi entrada de registro da Windows 10 Home.
ResponderBorrar