Asunto: CPU, SO, IP, RAM con WMI y Visual Basic .Net
Tengo una aplicación hecha en Visual Basic .Net de Visual Studio .Net 2010. Necesito desarrollar un módulo adicional para obtener los datos de los equipos de la empresa: CPU (datos del procesador como fabricante, cores, modelo), RAM (memoria RAM libre y ocupada, memoria virtual), Red (adaptador de red, IPs), sistema operativo (versión, nombre, service pack), datos del usuario, datos del dominio, etc. He estado investigando un poco y necesito hacerlo de forma automática sin instalar nada en los equipos.
Todos los equipos de mi red pertenecen y están agregados a un dominio, todos con Windows XP, Windows Vista, Windows 7 y servidores con Windows Server 2000, Windows Server 2003 y Windows Server 2008. Necesito poder obtener los datos de los equipos desde uno de ellos, sin necesidad de molestar al usuario ni de tener que instalar software en los equipos pues tengo más de 100 y sería imposible.
He investigado un poco y he visto que mediante WMI se puede hacer esto pero no tengo ni idea de por dónde empezar. Agradezco cualquier ayuda.
Publicado:
Jue Jun 28, 2012 8:53 pm
alonsojpd Administrador/Moderador
Registrado: Sep 16, 2003 Mensajes: 2228
Asunto: Re: CPU, SO, IP, RAM con WMI y Visual Basic .Net
varios escribió:
Tengo una aplicación hecha en Visual Basic .Net de Visual Studio .Net 2010. Necesito desarrollar un módulo adicional para obtener los datos de los equipos de la empresa: CPU (datos del procesador como fabricante, cores, modelo), RAM (memoria RAM libre y ocupada, memoria virtual), Red (adaptador de red, IPs), sistema operativo (versión, nombre, service pack), datos del usuario, datos del dominio, etc. He estado investigando un poco y necesito hacerlo de forma automática sin instalar nada en los equipos.
Todos los equipos de mi red pertenecen y están agregados a un dominio, todos con Windows XP, Windows Vista, Windows 7 y servidores con Windows Server 2000, Windows Server 2003 y Windows Server 2008. Necesito poder obtener los datos de los equipos desde uno de ellos, sin necesidad de molestar al usuario ni de tener que instalar software en los equipos pues tengo más de 100 y sería imposible.
He investigado un poco y he visto que mediante WMI se puede hacer esto pero no tengo ni idea de por dónde empezar. Agradezco cualquier ayuda.
Sí es posible obtener los datos del equipo con WMI (Windows Management Intrumentation) y si tienes los equipos agregados a un dominio será más sencillo aún en cuanto a permisos se refiere.
A continuación te mostramos todo el código para una aplicación que estamos desarrollando precisamente para obtener los datos del equipo, actualmente esta aplicación está en desarrollo, la idea es que los guarde en base de datos para su posterior consulta y tratamiento. De momento sólo los muestra en pantalla, pero te servirá como ejemplo de uso de WMI con Visual Basic .Net VB.Net:
Código:
Imports System.Management
Public Class formInfoPCWMI
Dim opcionesConexionPCRemoto As ConnectionOptions = New ConnectionOptions
Dim objWMI As ManagementScope
Private Function conectarWMI(ByVal usuario As String,
ByVal contrasena As String,
ByVal dominio As String,
ByVal equipo As String,
ByVal espacioNombres As String) As Boolean
Try
Dim strNameSpace As String
If opEquipoRemoto.Checked Then
strNameSpace = "\\" & equipo & "\" & espacioNombres
opcionesConexionPCRemoto.Username = usuario
opcionesConexionPCRemoto.Password = contrasena
If dominio = "" Then
opcionesConexionPCRemoto.EnablePrivileges = True
opcionesConexionPCRemoto.Impersonation = ImpersonationLevel.Impersonate
opcionesConexionPCRemoto.Authentication = AuthenticationLevel.Packet
Else
opcionesConexionPCRemoto.Authority = "ntlmdomain:" & dominio
End If
objWMI = New ManagementScope(strNameSpace, opcionesConexionPCRemoto)
Else
strNameSpace = "\\.\" & espacioNombres
objWMI = New ManagementScope(strNameSpace)
End If
objWMI.Connect()
Return True
Catch errorN As Exception
txtLog.Text = txtLog.Text & System.Environment.NewLine &
Now & " Error al conectar al equipo: " & errorN.Message
MessageBox.Show("Error al obtener datos del equipo: " &
errorN.Message, "Error al conectar a equipo",
MessageBoxButtons.OK, MessageBoxIcon.Error)
Return False
End Try
End Function
Private Function obtenerValorWMI(ByVal clase As String,
ByVal propiedad As String,
ByVal filtro As String) As String
Try
Dim consultaSQL As String
Dim valorObtenido As String
consultaSQL = "SELECT " & propiedad & " FROM " & clase
If filtro <> "" Then
consultaSQL = consultaSQL & " WHERE " + filtro
End If
Dim objConsultaSQL As New ObjectQuery(consultaSQL)
Dim objObtenido As New ManagementObjectSearcher(objWMI, objConsultaSQL)
valorObtenido = ""
For Each objActualMOS As ManagementObject In objObtenido.Get()
Try
'Si en vez de un valor string es un array (por ejemplo con IPAdress)
If IsArray(objActualMOS.GetPropertyValue(propiedad)) Then
For Each listaValores In objActualMOS.GetPropertyValue(propiedad)
If valorObtenido <> "" Then
valorObtenido = valorObtenido & " " & _
listaValores.ToString()
Else
valorObtenido = listaValores.ToString()
End If
Next
Else
If valorObtenido <> "" Then
valorObtenido = valorObtenido & " " & _
objActualMOS.GetPropertyValue(propiedad).ToString()
Else
valorObtenido =
objActualMOS.GetPropertyValue(propiedad).ToString()
End If
End If
Catch errorN As Exception
txtLog.Text = txtLog.Text & System.Environment.NewLine &
Now & " Error al obtener propiedad WMI [" & propiedad & "]: " &
errorN.Message
End Try
Next
Return valorObtenido
Catch errorN As Exception
txtLog.Text = txtLog.Text & System.Environment.NewLine &
Now & " Error al obtener propiedad WMI: " &
errorN.Message
Return ""
End Try
End Function
Private Function obtenerDatosRedWMI() As String
Try
' For Each objItem In colItems
'
' arrIPAddresses = objItem.IPAddress
' For Each strAddress In arrIPAddresses
' If strAddress = strTargetAddress Then
' strMACAddress = objItem.MacAddress
' End If
' Next
' Next
Dim consultaSQL As String
Dim valorObtenido As String = ""
Dim objIPs As ManagementObject
consultaSQL = "Select * From Win32_NetworkAdapterConfiguration Where IPEnabled = True"
Dim objConsultaSQL As New ObjectQuery(consultaSQL)
Dim objObtenido As New ManagementObjectSearcher(objWMI, objConsultaSQL)
For Each objIPs In objObtenido.Get
valorObtenido = valorObtenido & " " & objIPs("IPAddress")(0)
Next
Return valorObtenido
Catch errorN As Exception
txtLog.Text = txtLog.Text & System.Environment.NewLine &
Now & " Error al obtener propiedad WMI: " &
errorN.Message
Return ""
End Try
End Function
Private Function obtenerPropiedadWMI(ByVal clase As String,
ByVal propiedad As String,
ByVal filtro As String) As String
Return obtenerValorWMI(clase, propiedad, filtro)
End Function
Private Function sumarValoresWMI(ByVal valor As String, ByRef numero As Integer) As String
'el valor de WMI obtendrá un número por cada item
'separado con un espacio
Try
Dim total As Double = 0
Dim arrayPalabras() As String, i As Integer
arrayPalabras = Split(valor, " ")
numero = 0
For i = 0 To UBound(arrayPalabras)
numero = numero + 1
total = total + Convert.ToDouble(arrayPalabras(i))
Next i
Return CStr(total / 1024 / 1024)
Catch errorN As Exception
txtLog.Text = txtLog.Text & System.Environment.NewLine &
Now & " Error al obtener valor numérico: " &
errorN.Message
numero = 0
Return ""
End Try
End Function
Private Sub btObtenerInformacionPCWMI_Click(sender As System.Object, e As System.EventArgs) Handles btObtenerInformacionPCWMI.Click
Dim valor As String = ""
Dim numero As Integer = 0
Dim informacionWMIPC As String = ""
If conectarWMI(txtUsuario.Text, txtContrasena.Text,
txtDominio.Text, txtEquipo.Text, "root\CIMV2") Then
Try
'Placa base
informacionWMIPC = "----PLACA BASE-----------" & Environment.NewLine
valor = obtenerPropiedadWMI("Win32_BaseBoard", "Manufacturer", "")
txtPlacaBaseFabricante.Text = valor
informacionWMIPC = informacionWMIPC & "Fabricante: " & valor & Environment.NewLine
valor = obtenerPropiedadWMI("Win32_BaseBoard", "Product", "")
txtPlacaBaseIDProducto.Text = valor
informacionWMIPC = informacionWMIPC & "Producto: " & valor & Environment.NewLine
valor = obtenerPropiedadWMI("Win32_BaseBoard", "SerialNumber", "")
txtPlacaBaseNumeroSerie.Text = valor
informacionWMIPC = informacionWMIPC & "Serie: " & valor & Environment.NewLine
'BIOS
informacionWMIPC = informacionWMIPC & Environment.NewLine & Environment.NewLine &
"----BIOS-----------" & Environment.NewLine
valor = obtenerPropiedadWMI("Win32_BIOS", "Manufacturer", "")
txtBIOSFabricante.Text = valor
informacionWMIPC = informacionWMIPC & "Fabricante: " & valor & Environment.NewLine
valor = obtenerPropiedadWMI("Win32_BIOS", "Version", "")
txtBIOSVersion.Text = valor
informacionWMIPC = informacionWMIPC & "Versión: " & valor & Environment.NewLine
valor = obtenerPropiedadWMI("Win32_BIOS", "ReleaseDate", "")
txtBIOSFecha.Text = valor
informacionWMIPC = informacionWMIPC & "Fecha: " & valor & Environment.NewLine
'Sistema operativo
informacionWMIPC = informacionWMIPC & Environment.NewLine & Environment.NewLine &
"----Sistema operativo-----------" & Environment.NewLine
valor = obtenerPropiedadWMI("Win32_OperatingSystem", "Caption", "")
txtSO.Text = valor
informacionWMIPC = informacionWMIPC & "SO: " & valor & Environment.NewLine
valor = obtenerPropiedadWMI("Win32_OperatingSystem", "Version", "")
txtSOVersion.Text = valor
informacionWMIPC = informacionWMIPC & "Versión: " & valor & Environment.NewLine
valor = obtenerPropiedadWMI("Win32_OperatingSystem", "ServicePackMajorVersion", "")
valor = valor & "." & obtenerPropiedadWMI("Win32_OperatingSystem", "ServicePackMinorVersion", "")
txtSOServicePack.Text = valor
informacionWMIPC = informacionWMIPC & "Service Pack: " & valor & Environment.NewLine
valor = obtenerPropiedadWMI("Win32_OperatingSystem", "InstallDate", "")
txtSOFecha.Text = valor
informacionWMIPC = informacionWMIPC & "Fecha: " & valor & Environment.NewLine
valor = obtenerPropiedadWMI("Win32_OperatingSystem", "OSArchitecture", "")
txtSOArquitectura.Text = valor
informacionWMIPC = informacionWMIPC & "Arquitectura: " & valor & Environment.NewLine
valor = obtenerPropiedadWMI("Win32_OperatingSystem", "WindowsDirectory", "")
txtSOCarpeta.Text = valor
informacionWMIPC = informacionWMIPC & "Carpeta: " & valor & Environment.NewLine
'Memoria RAM y virtual
informacionWMIPC = informacionWMIPC & Environment.NewLine & Environment.NewLine &
"----Memoria-----------" & Environment.NewLine
valor = obtenerPropiedadWMI("Win32_PhysicalMemory", "Capacity", "")
valor = sumarValoresWMI(valor, numero)
txtMemoriaRAMTotal.Text = valor
informacionWMIPC = informacionWMIPC & "RAM física total: " & valor & Environment.NewLine
txtMemoriaRAMSlot.Text = Convert.ToString(numero)
informacionWMIPC = informacionWMIPC & "Nº slot: " &
Convert.ToString(numero) & Environment.NewLine
valor = obtenerPropiedadWMI("Win32_OperatingSystem", "FreePhysicalMemory", "")
If valor <> "" Then
txtMemoriaRAMLibre.Text =
Convert.ToString(Math.Truncate(Convert.ToDouble(valor) / 1024))
informacionWMIPC =
informacionWMIPC & "RAM libre: " &
Convert.ToString(Math.Truncate(Convert.ToDouble(valor) / 1024)) &
Environment.NewLine
Else
txtMemoriaRAMLibre.Text = ""
informacionWMIPC =
informacionWMIPC & "RAM libre: --" &
Environment.NewLine
End If
valor = obtenerPropiedadWMI("Win32_OperatingSystem", "TotalVirtualMemorySize", "")
If valor <> "" Then
txtMemoriaVirtualTotal.Text =
Convert.ToString(Math.Truncate(Convert.ToDouble(valor) / 1024))
informacionWMIPC = informacionWMIPC & "Memoria virtual total: " &
Convert.ToString(Math.Truncate(Convert.ToDouble(valor) / 1024))
Else
txtMemoriaVirtualTotal.Text =
Convert.ToString(Math.Truncate(Convert.ToDouble(valor) / 1024))
informacionWMIPC = informacionWMIPC & "Memoria virtual total: --"
End If
'Procesador
informacionWMIPC = informacionWMIPC & Environment.NewLine & Environment.NewLine &
"----Procesador-----------" & Environment.NewLine
valor = obtenerPropiedadWMI("Win32_Processor", "Name", "")
txtCPUNombre.Text = valor
informacionWMIPC = informacionWMIPC & "Nombre: " & valor & Environment.NewLine
valor = obtenerPropiedadWMI("Win32_ComputerSystem", "NumberOfProcessors", "")
txtCPUNumero.Text = valor
informacionWMIPC = informacionWMIPC & "Nº físicos: " & valor & Environment.NewLine
valor = obtenerPropiedadWMI("Win32_Processor", "NumberOfCores", "")
txtCPUCores.Text = valor
informacionWMIPC = informacionWMIPC & "Nº Cores: " & valor & Environment.NewLine
valor = obtenerPropiedadWMI("Win32_Processor", "NumberOfLogicalProcessors", "")
txtCPUNumeroLogicos.Text = valor
informacionWMIPC = informacionWMIPC & "Nº lógicos: " & valor & Environment.NewLine
valor = obtenerPropiedadWMI("Win32_Processor", "Manufacturer", "")
txtCPUFabricante.Text = valor
informacionWMIPC = informacionWMIPC & "Fabricante: " & valor & Environment.NewLine
valor = obtenerPropiedadWMI("Win32_Processor", "MaxClockSpeed", "")
txtCPUVelocidad.Text = valor
informacionWMIPC = informacionWMIPC & "Velocidad: " & valor & Environment.NewLine
valor = obtenerPropiedadWMI("Win32_Processor", "Architecture", "")
Select Case valor
Case 0
valor = "x86"
Case 1
valor = "MIPS"
Case 2
valor = "Alpha"
Case 3
valor = "PowerPC"
Case 6
valor = "Itanium-based systems"
Case 9
valor = "x64"
Case Else
valor = valor & " Desconocida"
End Select
txtCPUArquitectura.Text = valor
informacionWMIPC = informacionWMIPC & "Arquitectura: " & valor & Environment.NewLine
valor = obtenerPropiedadWMI("Win32_Processor", "Family", "")
txtCPUFamilia.Text = valor
informacionWMIPC = informacionWMIPC & "Familia: " & valor & Environment.NewLine
valor = obtenerPropiedadWMI("Win32_Processor", "Description", "")
txtCPUDescripcion.Text = valor
informacionWMIPC = informacionWMIPC & "Descripción: " & valor
'Red
informacionWMIPC = informacionWMIPC & Environment.NewLine & Environment.NewLine &
"----Red-----------" & Environment.NewLine
'valor = obtenerDatosRedWMI()
valor = obtenerPropiedadWMI("Win32_NetworkAdapterConfiguration", "IPAddress", "IPEnabled = True")
txtRedIP.Text = valor
informacionWMIPC = informacionWMIPC & "IP: " & valor & Environment.NewLine
Catch errorN As Exception
txtLog.Text = txtLog.Text & System.Environment.NewLine &
Now & " Error: " & errorN.Message
End Try
End If
txtInfoPC.Text = informacionWMIPC
End Sub
End Class
Publicado:
Jue Jun 28, 2012 8:57 pm
alonsojpd Administrador/Moderador
Registrado: Sep 16, 2003 Mensajes: 2228
Asunto: Re: CPU, SO, IP, RAM con WMI y Visual Basic .Net
En breve publicaremos esta aplicación con su código fuente en VB.Net correspondiente, como siempre gratuito.
Puede publicar nuevos temas en este foro No puede responder a temas en este foro No puede editar sus mensajes en este foro No puede borrar sus mensajes en este foro No puede votar en encuestas en este foro