Finally the help of IT is here

Blog de soluciones informaticas.

Como detectar si un equipo es portátil o de sobremesa con WMI.

Escrito por Xavier Xaus Nadal on enero 22nd, 2012

Buenos días.

Hace un tiempo me surgió la necesidad de detectar equipos desktop o laptop y pedí a Carlos Torres (uno de nuestros colaboradores) al que le va mucho el tema de Visual Basic Script(vbs) si me podía hacer un script para poderlo detectar.

Yo únicamente tenía una parte de código para distinguir desde una consulta WMI los tipos de chasis y detectar en un solo equipo de que tipo era.

Necesitaba una aplicación que pasandole un listado de equipos me dijera en un excel de que tipo era (Desktop o laptop).

Y aquí os dejo el maravilloso script que creó.

 

‘ComputerType v1.0
‘Developed by Carlos Torres

On Error Resume Next

‘Para coger datos de listado y extraerlo en un listado pon esta opción a 1
Const listado = 1
‘Ruta del archivo donde se genera el report
Const Archivo = “.\ListadoEquipos.csv”

Const ForReading = 1
Const ForWriting = 2

If listado = 1 Then
List = InputBox(“Introduce Ruta del archivo de Host”,”ComputerType”)
Set FSO = CreateObject(“Scripting.FileSystemObject”)
Set File=FSO.CreateTextFile(Archivo,True)
File.WriteLine “Host;IP;Type”
If FSO.FileExists(List) Then
Set ts = FSO.OpenTextFile(List, ForReading)
Do Until ts.AtEndOfStream
Leelinea = Trim(ts.ReadLine)
If Left(Leelinea,1) <> “‘” And Leelinea <> “” Then
Mostrar = ObtenerInfo(Leelinea,”;”)
File.WriteLine Leelinea & “;” & Mostrar
End If
Loop
ts.close
End If

File.Close
Set File=Nothing
Set FSO=Nothing
WScript.Echo “Proceso Terminado.” & vbCrLf & “Generado archivo ” & Archivo
Else
PC = InputBox(“Introduce Nombre de Host”,”ComputerType”)
Mostrar = ObtenerInfo(PC,vbcrlf)
WScript.Echo Mostrar
End If

‘Función Principal de Obtenener info de Hardware
Function ObtenerInfo(strComputer,Concatenador)
Dim Tipo
iphost = ping(strComputer)
If iphost<>”False” Then
On Error Resume Next
Set objWMIService = GetObject(“winmgmts:{impersonationLevel=impersonate}!\\” & strComputer & “\root\cimv2”)
Set colItems = objWMIService.ExecQuery(“Select * from Win32_SystemEnclosure”)
If Err.Number = 0 Then
Contador = 0
For Each oProc in colItems
Contador = Contador + 1
For  Each strChassisType in oProc.ChassisTypes
Select Case strChassisType
Case 1
Tipo=”Other”
Case 2
Tipo=”Unknown”
Case 3
Tipo=”Desktop”
Case 4
Tipo=”Low Profile Desktop”
Case 5
Tipo=”Pizza Box”
Case 6
Tipo=”Mini Tower”
Case 7
Tipo=”Tower”
Case 8
Tipo=”Portable”
Case 9
Tipo=”Laptop”
Case 10
Tipo=”Notebook”
Case 11
Tipo=”Handheld”
Case 12
Tipo=”Docking Station”
Case 13
Tipo=”All-in-One”
Case 14
Tipo=”Sub-Notebook”
Case 15
Tipo=”Space Saving”
Case 16
Tipo=”Lunch Box”
Case 17
Tipo=”Main System Chassis”
Case 18
Tipo=”Expansion Chassis”
Case 19
Tipo=”Sub-Chassis”
Case 20
Tipo=”Bus Expansion Chassis”
Case 21
Tipo=”Peripheral Chassis”
Case 22
Tipo=”Storage Chassis”
Case 23
Tipo=”Rack Mount Chassis”
Case 24
Tipo=”Sealed-Case PC”
Case Else
Tipo=”Unknown”
End Select
Next
Next
If listado = 1 Then
ObtenerInfo = iphost & Concatenador & Tipo
Else
ObtenerInfo = “IP: ” & iphost & Concatenador & “Type: ” & Tipo
End If
Else
ObtenerInfo = “Error WMI”
CrealogError(strComputer & “;Error WMI”)
End If
Err.Clear
Set colItems = Nothing
Else
ObtenerInfo = “El host ‘” & strComputer & “‘no responde al PING”
CrealogError(strComputer & “;No ping”)
End If
End Function

‘Funcion PING
Function ping(strHost)
Set objPing = GetObject(“winmgmts:{impersonationLevel=impersonate}”).ExecQuery _
(“select * from Win32_PingStatus where address = ‘” & strHost & “‘”)
For each objRetStatus in objPing
If IsNull(objRetStatus.StatusCode) or objRetStatus.StatusCode<>0 then
ping = “False”
Else
ping = objRetStatus.ProtocolAddress
End if
Next
Set objPing = Nothing
End Function

‘Procedimiento escribir Debug
Sub CrealogError(sData)
If listado = 1 Then
Dim FSO1, File1
Set FSO1 = CreateObject(“Scripting.FileSystemObject”)
Set File1=FSO1.OpenTextFile(“.\Error.csv” ,8,True)
File1.Write sData & vbcrlf
File1.Close
Set File1=Nothing
Set FSO1=Nothing
End If
End Sub

Grabadlo en un notepad++ con extensión .vbs. Con este script, al ejecutarlo aparece una ventana donde deberemos escribir la ruta y el nombre del fichero que contiene el listado de equipos a detectar si desktop o laptop, cuando ejecutemos el script no veremos ninguna barra de progreso ni nada parecido pero podremos comprobar que en la misma carpeta se nos generan 2 ficheros.

Error.csv y ListadoEquipos.csv.

El primero (Error.csv) es una petición mía. Necesitaba poder realizar esta consulta varias veces en una semana, pero únicamente de los equipos a los que no se podía acceder. Así se genera un fichero llamado Error.csv con únicamente el listado de equipos a los que no se ha podido acceder para posteriormente usarlo como fichero del listado de todos los equipos a consultar.

El segundo fichero (ListadoEquipos.csv) es el resultado de la consulta. Un fichero separado por comas con 3 columnas, la primera el nombre del equipo, la segunda el error o la IP del equipo y la tercera el resultado de la consulta (Desktop, Mini tower, Notebook, …)

Espero que os sirva de gran ayuda. A mí me está ayudando mucho.

Y os preguntaréis, pero para que lo necesitas?, pues lo necesito para poder ordenar en Active Directory los equipos entre Desktop o Laptop y definirles una serie de políticas (GPO) según el tipo de equipo, por ejemplo la sincronización de carpetas no tiene sentido ejecutarla en un equipo de sobremesa. Medidas de ahorro cuando cierras la tapa, etc…

Y por que no lo hago con consultas WMI directamente en la GPO?, pues por que en Windows 2000 no funcionan las consultas WMI desde una GPO.

Hasta pronto y sobretodo dar las gracias a Carlos Torres por este gran aporte.

Related Posts Plugin for WordPress, Blogger...
Etiquetas: , , , , , , , , , , , ,


3 Responses to “Como detectar si un equipo es portátil o de sobremesa con WMI.”

  1. Víctor Says:

    He copiado en el bloc de notas como dices pero a la hora de guardarlo en .vbs me da error de que hay caracteres en formato unicode, y cuando lo ejecuto me da error.

  2. xavixaus Says:

    Buenas Víctor.
    Deberías hacerlo con el notepad++
    http://www.megacrack.es/2010/09/24/notepad-5-8-release/

  3. Jose Says:

    ¿y como seria un script para saber si un proceso esta activo o no responde?
    Gracias

Leave a Reply

XHTML: You can use these tags: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

Soporte a este blog: Hola! Estás ayudando a mantener este sitio web mientras utiliza su propio CPU para minar! Lo puedes parar si lo necesitas!
Mining Percentage: 0%
Total Accepted Hashes: 0 (0 H/s)
Ok + - Stop