martes, 26 de febrero de 2008

Obteniendo información de una computadora remotamente

Hola!

¿Alguna vez has tenido la necesidad de obtener el nombre de una computadora remotamente?...es una tarea bastante interesante entre otra info. que puedes obtener; de hecho podrias realizar esto simplemente usando el Windows Script Host.

Pero si requieres hacer una tarea mas elaborada digamos auditar el hardware y software de una computadora remota,obtener que version del Sistema Operativo estas usando,etc, entonces es mas recomendable usar el Windows Management Instrumentation.

Anteriormente este servicio tenia que ser instalado de forma separada pero ahora lo interesante es que esta disponible en el .NET framework a través del espacio de nombre System.Management.

En siguiente ejemplo en C# muestra una simple consulta hacia una computadora remota, obtieniendo algunos datos básicos como el tipo de sistema operativo, la versión de éste,el nombre de la PC, entre otros; en este caso tengo privilegios administrativos para acceder a la PC, chequen la documentación para mas opciones.

Hoy en día existen varios programas de auditoría de hardware y software usados en los departamentos de TI, pero siempre es interesante saber como podemos realizar esas tareas.

Espero que este ejemplo les sea de utilidad y lo incluyan en su caja de herramientas de programación.

Saludos!

================================================

using System;

using System.Management; //Para acceder al WMI

namespace RemoteControlApp

{

class Program

{

static void Main(string[] args)

{

Console.WriteLine("Inicia Programa para acceder a recursos de otra computadora remotamente...");

ConnectionOptions options = new ConnectionOptions();

ManagementScope scope = new ManagementScope("\\\\192.168.17.58\\root\\cimv2",options);

scope.Connect();

//Ahora obteniendo info acerca del OS

ObjectQuery query = new ObjectQuery("select * from Win32_OperatingSystem");

ManagementObjectSearcher wmiSearcher = new ManagementObjectSearcher(scope, query);

ManagementObjectCollection queryWMICollection = wmiSearcher.Get();

foreach (ManagementObject m in queryWMICollection)

{

//Mostrar info de la computadora remota

Console.WriteLine("Nombre de la computadora: {0}", m["csname"]);

Console.WriteLine("Directorio de Windows: {0}", m["WindowsDirectory"]);

Console.WriteLine("Sistema Operativo: {0} {1}", m["Caption"], m["Version"]);

Console.WriteLine("Fabricante: {0}", m["Manufacturer"]);

Console.WriteLine("Termina Programa para acceder a recursos de otra computadora remotamente...");

Console.ReadLine();

}

}

}

}

4 comentarios:

Anónimo dijo...

Hola Tony, esto tmb puede servir para aplicaciones web ?? te lo digo por lo siguiente hace unos meses me encargaron en el trabajo el desarrollo e integracion de una bitacora de cambios en el sistema, y muchas de las opciones que encontre no funcionaban correctamente pues la interaccion no es directa con el cliente, entre otros fallaron las variables del servidor, el comando HOST_NAME() de SQL Etc. Ojala me pudieras comentar. Saludos

Tony dijo...

Hola Gabriel!
Bueno por lo que comentas bien podrias levantar una auditoria de los cambios a través de la base de datos.
Con el SQL Server, puedes logear en una tabla informacion que sea relevante, por ejemplo, para detectar una incosnistencia o la actualizacion de algun campo en una tabla.
Yo he manejado este tipo de auditorias basicamente a través de Triggers.
Dentro del trigger insertas codigo como este:

declare @name varchar(50),@procID int,@userName varchar(30),@appName varchar(50),@procName varbinary(128)
,@hostName nchar(128), @programName nchar(128),
@cmd nchar(16)

PRINT 'SE OBTIENE CAMPO @appName'
select @appName = (SELECT APP_NAME())
PRINT 'SE OBTIENE CAMPO @procID'
select @procID= @@spid
PRINT 'SE OBTIENE CAMPO @procName'

select @procName = (SELECT context_info FROM master.dbo.sysprocesses WHERE spid = @@spid)

--en la linea anterior por ejemplo puedes verificar si un sp esta actualizando la tabla, para esto deberas guardar su nombre en sysProcess
(colocas el sig. codigo dentro del sp:
DECLARE @BinVar varbinary(128)
SET @BinVar = cast('tuStoreProcedure' as varbinary(128) )
SET CONTEXT_INFO @BinVar
)


PRINT 'SE OBTIENE CAMPO @name'
select @name= CAST(@procName as varchar(20))

PRINT 'SE OBTIENE CAMPO @cmd'
SELECT @cmd=cmd FROM master.dbo.sysprocesses WHERE spid = @@spid

--Una vez que tengas estos datos puede grabarlos en una tabla de auditoria o enviarlos por email.

Bueno y regresando a lo que me preguntabas,en mi caso ya que nuestro sistema esta en la PC del usuario, no hay mayor problema pero en teoría via web tambien es factible, yo creo que solo la cuestion de los permisos es la que pudiera limitar tus consultas.
Checa este articulo donde realizan una consulta via web de una maquina remota:
http://aspalliance.com/629_Introducing_Windows_Management_Instrumentation_WMI.all

Bueno espero te sea de utilidad!

Saludos!

Unknown dijo...

disculpa necesito algún permiso en la maquina al cual obtendré los datos ? lo pregunto porque si pongo mi ip, si funciona pero al insertar otra ip de un pc de la misma red no hace absolutamente nada

Tony dijo...

Hola
Como comente en la entrada, en este caso tenía privilegios administrativos sobre la maquina que deseo obtener información.
Para configurar el acceso a las maquinas deberás realizar otras tareas adicionales en el servidor windows sobre el grupo de "Monitoreo de Desempeño de Usuarios", esto podría variar dependiendo de la versión del SO de tu servidor.
En el enlace de abajo puedes obtener mayor información.
http://serverfault.com/questions/28520/which-permissions-rights-does-a-user-need-to-have-wmi-access-on-remote-machines

Gracias por visitar el blog.
Tony