Foros del Web » Programación para mayores de 30 ;) » Programación General »

Obtener IP mediante MAC en LAN

Estas en el tema de Obtener IP mediante MAC en LAN en el foro de Programación General en Foros del Web. Hola, Mi duda es si es posible hacer alguna aplicación en C# para obtener la IP a partir de la MAC de algo que esté ...
  #1 (permalink)  
Antiguo 20/12/2007, 02:41
 
Fecha de Ingreso: diciembre-2007
Ubicación: Barcelona
Mensajes: 289
Antigüedad: 16 años, 11 meses
Puntos: 8
Obtener IP mediante MAC en LAN

Hola,
Mi duda es si es posible hacer alguna aplicación en C# para obtener la IP a partir de la MAC de algo que esté conectado a la red de la empresa. Las IP se asignan por DHCP y necesito saber que IP se le asigna a ese dispositivo para poder gestionarlo. En mi caso se trata de una cámara IP.
He encontrado programas de ejemplo pero ninguno funciona. Uso el Visual.NET 2003 y la verdad es que el C# no es mi fuerte, así que si alguien me contesta agradecería que fuese como si fuera cortito por que en este tema lo soy.

Muchas gracias de antemano!
  #2 (permalink)  
Antiguo 26/12/2007, 07:22
Avatar de dogduck  
Fecha de Ingreso: enero-2006
Ubicación: ¿Atlantida, Hesperides, Islas afortunadas?
Mensajes: 2.231
Antigüedad: 18 años, 10 meses
Puntos: 19
Re: Obtener IP mediante MAC en LAN

Una forma que se me ocurre, tal vez algo burda, seria:

Envias un ping (la camara ip deberá responder a un ping es decir no debe estar desactivado el protocolo icmp en ambos extremos) a todo el rango de la red, al contestarte los diversos dispositivos de la red se construye la tabla arp de direcciones MAC, luego solo debes de hacer una búsqueda de la MAC en la tabla.
Para un sistema operativo como windows xp, se podria hacer con un scrip tal que:
Código:
@echo off
rem buscamac.cmd
rem para el segmento 192.168.0.0/24 ( 192.168.0.1-192.168.0.254 )
echo Escaneando red mediante icmp ... espere por favor
for /L %%k in (1,1,254) do (
 @ping -n 2 192.168.0.%%K > elping.txt
)
@arp -a > tabla_ip_mac.txt
echo Introduce mac a buscar ( ejemplo:  00-11-21-a2-8c-80 )
set /P lamac=
@find "%lamac%" tabla_ip_mac.txt
rem by javier castañón 2007
Está sin depurar, pero a lo mejor te vale de algo.

salu2 y felices fiestas

Última edición por dogduck; 26/12/2007 a las 07:30
  #3 (permalink)  
Antiguo 28/12/2007, 05:07
Avatar de dogduck  
Fecha de Ingreso: enero-2006
Ubicación: ¿Atlantida, Hesperides, Islas afortunadas?
Mensajes: 2.231
Antigüedad: 18 años, 10 meses
Puntos: 19
Re: Obtener IP mediante MAC en LAN

Mirate: http://www.codeguru.com/Cpp/I-N/netw...icle.php/c5451

Cita:
How do I get a MAC in C or C++, Win32 environment?

There are numerous ways to do this. As I was on my investigation, I realized that there was no clear and simple way to do this. A lot of people said to use NETSTAT and to parse the result. Some people said to create a UUID and pull the MAC from there. A couple of people said to use NetBIOS, and finally one said to query the NDIS miniport driver itself.

Although the last solution sounded the coolest, apparently doing that from user mode wasn't the easiest thing to do. I'll give you a set of solutions from worst to best and then a quick discussion of the Miniport method.

Method One: UuidCreate

One quick way to find out your MAC address, which is very hacky and I wouldn't recommend would be to create a sequential Uuid. Apparently Microsoft uses your MAC address to help it create a universally unique identifier.

All you have to do is check out bytes 2 through 8 and you are done. The code is below and the downloadable EXE and sample code is listed at the end of the article.

// Fetches the MAC address and prints it
static void GetMACaddress(void)
{
unsigned char MACData[6];

UUID uuid;
UuidCreateSequential( &uuid ); // Ask OS to create UUID

for (int i=2; i<8; i++) // Bytes 2 through 7 inclusive
// are MAC address
MACData[i - 2] = uuid.Data4[i];

PrintMACaddress(MACData); // Print MAC address
}

This code will only work in Windows 2000/XP since Microsoft replaced UuidCreate in Windows 2000/XP with one that doesn't use the PC's MAC address. UuidCreate with your MAC address can easily be considered a security risk since you are distributing your ethernet card's address.

Microsoft created UuidCreateSequential in Win2K and XP to do what the old UuidCreate did on Windows 95/98/Me. The current UuidCreate in Windows 2000/XP is not composed of a number which includes the MAC address of your primary NIC, hence they moved over that functionality to UuidCreateSequential. On the older OSes you may still use the UuidCreate function to obtain its MAC address.

This example only supports one NIC card on your PC.

Method Two: Use NetBIOS

This solution is a lot more complicated then the final solution. It supports multiple NIC cards, but requires NetBIOS to be installed on the computer. It also requires you to have the cable connected to a valid NetBIOS network. It works great under all OSes including 95/98/Me/NT/2000/XP.

// Fetches the MAC address and prints it
static void GetMACaddress(void)
{
unsigned char MACData[8]; // Allocate data structure
// for MAC (6 bytes needed)

WKSTA_TRANSPORT_INFO_0 *pwkti; // Allocate data structure
// for NetBIOS
DWORD dwEntriesRead;
DWORD dwTotalEntries;
BYTE *pbBuffer;

// Get MAC address via NetBIOS's enumerate function
NET_API_STATUS dwStatus = NetWkstaTransportEnum(
NULL, // [in] server name
0, // [in] data structure to return
&pbBuffer, // [out] pointer to buffer
MAX_PREFERRED_LENGTH, // [in] maximum length
&dwEntriesRead, // [out] counter of elements
// actually enumerated
&dwTotalEntries, // [out] total number of elements
// that could be enumerated
NULL); // [in/out] resume handle
assert(dwStatus == NERR_Success);

pwkti = (WKSTA_TRANSPORT_INFO_0 *)pbBuffer; // type cast the buffer

for(DWORD i=1; i< dwEntriesRead; i++) // first address is
// 00000000, skip it
{ // enumerate MACs & print
swscanf((wchar_t *)pwkti[i].wkti0_transport_address,
L"%2hx%2hx%2hx%2hx%2hx%2hx",
&MACData[0],
&MACData[1],
&MACData[2],
&MACData[3],
&MACData[4],
&MACData[5]);
PrintMACaddress(MACData);
}

// Release pbBuffer allocated by above function
dwStatus = NetApiBufferFree(pbBuffer);
assert(dwStatus == NERR_Success);
}

As you can tell converting the wide string which is returned from NetWkstaTransportEnum to an BYTE based array is a mess in itself. The great thing about this is that it goes through all the NICs located on your PC. You are also able to easily query other people's PCs by passing in a NetBIOS computer name as the first parameter to this function.

Method Three: Use GetAdaptersInfo

The cleanest way I could find to get all the MAC addresses located on a PC was to use the GetAdaptersInfo method. It includes almost as much information as IPCONFIG /ALL including your DHCP server, Gateway, IP address list, subnet mask and WINS servers. It also enumerates all the NICs on your PC and is supported in 95/98/Me/NT/2000/XP. Finally it also works if your NICs are not connected to valid networks (eg. wires are not even hooked up), but the NICs do have to be "enabled" in Windows.

// Fetches the MAC address and prints it
static void GetMACaddress(void)
{
IP_ADAPTER_INFO AdapterInfo[16]; // Allocate information
// for up to 16 NICs
DWORD dwBufLen = sizeof(AdapterInfo); // Save memory size of buffer

DWORD dwStatus = GetAdaptersInfo( // Call GetAdapterInfo
AdapterInfo, // [out] buffer to receive data
&dwBufLen); // [in] size of receive data buffer
assert(dwStatus == ERROR_SUCCESS); // Verify return value is
// valid, no buffer overflow

PIP_ADAPTER_INFO pAdapterInfo = AdapterInfo; // Contains pointer to
// current adapter info
do {
PrintMACaddress(pAdapterInfo->Address); // Print MAC address
pAdapterInfo = pAdapterInfo->Next; // Progress through
// linked list
}
while(pAdapterInfo); // Terminate if last adapter
}

I probably should mention that statically allocating an array for up to 16 NICs is not the best way to do this. It is a quick and dirty solution that should show you essentially how to get and enumerate all the MAC addresses on your PC.

Method Four: The Miniport Driver

I never implemented this method since it required some very low level coding. It also probably wouldn't be a good method since you are directly talking to the underlying NDIS miniport driver. The basic concept of this is to hit the miniport driver with an OIS query of OID_802_3_CURRENT_ADDRESS. This should return a buffer with the current MAC address.

The way problem with this solution is that there is no easy way to do this from user mode, which is exactly the mode we are coding all our apps in, this is as opposed to kernal mode which drivers reside in.

Conclusion

Although there are no functions named GetMACaddress in the Win32 API, ATL, MFC, or C#, it is fairly easy to find and associate your MAC address with its related IP addresses by calling GetAdaptersInfo(). GetAdaptersInfo is located in the Platform SDK.

I hope you had an interesting time reading this article.

Reference: Get IP address in C#
Reference: Get IP address in C++

About the Author

Khalid Shaikh is a software engineer currently contracting for HP in Palo Alto. He has worked at such companies such as Microsoft, Nvidia, and several silicon valley startups. Khalid has been featured in PC Gamer for innovative driver development techniques and is currently co-founder of HTTP-Tunnel Corp.

If you have any questions, don't hestitate to e-mail me.
  #4 (permalink)  
Antiguo 02/01/2008, 06:00
 
Fecha de Ingreso: diciembre-2007
Ubicación: Barcelona
Mensajes: 289
Antigüedad: 16 años, 11 meses
Puntos: 8
Re: Obtener IP mediante MAC en LAN

Muchas gracias por contestar!!!

Pero tengo muchas dudas a cerca de lo que propones.
En el primer post no se donde quieres que haga eso, en la consola? Quizás me fltó nombrar que uso windos ya que lo de las '@' delante de los comandos no lo he visto nunca. Y el echo solo lo he visto en el php... Quizás voy más pez de lo normal y eso en DOS se puede hacer, pero ahora mismo me suena a chino.

Respecto al segundo post. Me lo he mirado así por encima y a m me parece que lo que obtienes de ahí es tu dirección MAC, la de la máquina que estás usando en ese momento.

Quizá el problema no es tan simple y creo que desistiré.
De todas formas muchas gracias por contestar y haberte molestado.
Saludos y buen año!
  #5 (permalink)  
Antiguo 02/01/2008, 08:37
Avatar de dogduck  
Fecha de Ingreso: enero-2006
Ubicación: ¿Atlantida, Hesperides, Islas afortunadas?
Mensajes: 2.231
Antigüedad: 18 años, 10 meses
Puntos: 19
Re: Obtener IP mediante MAC en LAN

Ya veo que andas pez en ficheros de ejecución por lotes o scripts del dos.

1.- Abre el notepad
2.-
Copia y pega
Código:
@echo off
rem buscamac.cmd
rem para el segmento 192.168.0.0/24 ( 192.168.0.1-192.168.0.254 )
echo Escaneando red mediante icmp ... espere por favor
for /L %%k in (1,1,254) do (
 @ping -n 2 192.168.0.%%K > elping.txt
)
@arp -a > tabla_ip_mac.txt
echo Introduce mac a buscar ( ejemplo:  00-11-21-a2-8c-80 )
set /P lamac=
@find "%lamac%" tabla_ip_mac.txt
pause
rem by javier castañón 2007
3.- Guarda el fichero como buscamac.cmd o como buscamac.bat
4.- inicio> ejecutar > cmd >cd \ > cd c:\directorio > buscamac.cmd

salu2

Última edición por dogduck; 02/01/2008 a las 11:43
  #6 (permalink)  
Antiguo 05/01/2008, 06:51
 
Fecha de Ingreso: diciembre-2007
Ubicación: Barcelona
Mensajes: 289
Antigüedad: 16 años, 11 meses
Puntos: 8
Re: Obtener IP mediante MAC en LAN

No, no voy tan pez como crees ya que lo que tu propones ya lo hice manualmente. Antes de postear lo primero que probé es hacer el FOR para hacer el barrido de las IPs en la consola y no iba bien. Había IPs que no me las mostraba en el ARP. En cambio si yo hacia un ping a una IP que sabía que estaba activa si que me la mostraba cuando mediante el FOR no había salido.

Creo que la solución sería consultar al DHCP que debe de tener una tabla de asignación o algo por el estilo creo yo. En eso si que voy pez.

Gracias de todas maneras por contestar.
Saludos.
  #7 (permalink)  
Antiguo 05/01/2008, 12:49
Avatar de dogduck  
Fecha de Ingreso: enero-2006
Ubicación: ¿Atlantida, Hesperides, Islas afortunadas?
Mensajes: 2.231
Antigüedad: 18 años, 10 meses
Puntos: 19
Re: Obtener IP mediante MAC en LAN

El script no está pensado para hacerlo manualmente ... De todas formas, anímate y lo podrías modificar ...
Puede que te afecte el tema de los tiempos de refresco de las entradas dinámicas en la tabla arp (hacemos el fichero de la tabla arp dentro del for) y también te puede afectar en lo remolones que sean los equipos para contestar a un ping ( aumentamos de 2 a 4 los ecos del ping, no lo aconsejo ya que tarda mucho el escaneo ). También, mea culpa, hacemos que cada vez que haya una entrada en el fichero de ping o tabla no se borre ... esto se consigue con >> en lugar de con un > (@ping -n 2 192.168.0.%%k >> elping.txt)
Las modificaciónes quedarian:

Código:
@echo off
rem buscamac.cmd
echo Segmento 192.168.0.0/24 ( 192.168.0.1-192.168.0.254 )
echo Introduce mac a buscar ( ejemplo:  00-11-21-a2-8c-80 )
set /P lamac=
echo Nº de ecos del ping ( minimo:1, maximo:4)
set /P necos=
echo Escaneando red mediante icmp ... espere por favor
for /L %%k in (1,1,254) do (
 echo Escaneando IP: 192.168.0.%%k ...
 echo.
 ping -n %necos% 192.168.0.%%k >> elping.txt
 arp -a 192.168.0.%%k >> tabla_ip_mac.txt
)
echo.
echo Fin escaneo por icmp
@find "%lamac%" tabla_ip_mac.txt
pause
rem by javier castañón 2007

salu2

Última edición por dogduck; 05/01/2008 a las 16:07
  #8 (permalink)  
Antiguo 05/01/2008, 19:09
 
Fecha de Ingreso: diciembre-2007
Ubicación: Barcelona
Mensajes: 289
Antigüedad: 16 años, 11 meses
Puntos: 8
Re: Obtener IP mediante MAC en LAN

Tio como te lo curras, el lunes vuelvo al trabajo y lo pruebo en la red de la empresa que es donde debe de funcionar y te digo algo. De todos modos muchas gracias por la molestia!
Saludos.
  #9 (permalink)  
Antiguo 07/01/2008, 03:14
 
Fecha de Ingreso: diciembre-2007
Ubicación: Barcelona
Mensajes: 289
Antigüedad: 16 años, 11 meses
Puntos: 8
Re: Obtener IP mediante MAC en LAN

Tio eres el amo...
Funciona perfectamente aun que va lento a más no poder y eso es un grandísimo inconveniente por que tengo que desarrolarlo en C# y no puede tardar tanto.
De todas formas gracias por todo por que ya tengo una idea de como hacerlo.
Saludos!
  #10 (permalink)  
Antiguo 07/01/2008, 04:52
Avatar de dogduck  
Fecha de Ingreso: enero-2006
Ubicación: ¿Atlantida, Hesperides, Islas afortunadas?
Mensajes: 2.231
Antigüedad: 18 años, 10 meses
Puntos: 19
Re: Obtener IP mediante MAC en LAN

Claro que va lento, calcula que para %necos% = 4 ecos, por IP que responda tarda 4 sg y por IP que no responda tarda de 16(4x4) a (4x5) sg.
Por lo que te recomiendo %necos% = 1. Y aún así, se pegará un mínimo de 254 sg ( redondeando unos 5 minutos ). Y eso para un segmento de clase C ...

salu2
  #11 (permalink)  
Antiguo 07/01/2008, 05:49
 
Fecha de Ingreso: diciembre-2007
Ubicación: Barcelona
Mensajes: 289
Antigüedad: 16 años, 11 meses
Puntos: 8
Re: Obtener IP mediante MAC en LAN

Y se te ocurre como hacerlo mucho más rápido??
Como ejemplo te pongo el programa CC Get MAC Address que te lo ahce al momento. Yo quisiera saber como se puede hacer eso.
Con toda mi cara les mandé un mail dicíendoles que como han hecho solo esa parte del programa, y evidentemente no me contestaron pro que el programa es de pago.

Saludos.
  #12 (permalink)  
Antiguo 08/01/2008, 15:04
Avatar de dogduck  
Fecha de Ingreso: enero-2006
Ubicación: ¿Atlantida, Hesperides, Islas afortunadas?
Mensajes: 2.231
Antigüedad: 18 años, 10 meses
Puntos: 19
Re: Obtener IP mediante MAC en LAN

Por cierto xp Y 2K3 ya tienen una utilidad de cónsola para obtener la mac de una ip:
Cita:
C:\Documents and Settings\Administrador>getmac /?

GETMAC [/S sistema [/U nombre_usuario [/P [contraseña]]]] [/FO formato]
[/NH] [/V]

Descripción:
Esta herramienta habilita al administrador para mostrar la dirección MAC
para adaptadores de red en un sistema.

Lista de parámetros:
/S sistema Especifica el sistema remoto al que conectarse.

/U [dominio\]usuario Especifica el contexto de usuario con
en el que el comando se debe ejecutar.

/P contraseña Especifica la contraseña para el
contexto de usuario dado.

/FO formato Especifica el formato en el que se
se va a mostrar la salida.
Valores válidos son "TABLE", "LIST" y "CSV".

/NH Especifica que el "encabezado de columna" no debe
mostrarse en la salida.
Sólo se usa con los formatos TABLE y CSV.

/V Especifica que se muestra la salida detallada.

/? Muestra este mensaje de ayuda.

Ejemplos:
GETMAC /?
GETMAC /FO csv
GETMAC /S sistema /NH /V
GETMAC /S sistema /U usuario
GETMAC /S sistema /U dominio\usuario /P contraseña /FO list /V
GETMAC /S sistema /U dominio\usuario /P contraseña /FO table /NH
Por ejemplo.
Cita:
c:\> getmac /S 192.168.0.45
...
Pero claro, no sé, si la cámara responderá a este comando ...

salu2
  #13 (permalink)  
Antiguo 09/01/2008, 02:26
 
Fecha de Ingreso: diciembre-2007
Ubicación: Barcelona
Mensajes: 289
Antigüedad: 16 años, 11 meses
Puntos: 8
Re: Obtener IP mediante MAC en LAN

Hola de nuevo.
Gracias por tu insistencia y preocupación, pero es que lo que debo encontrar es la IP, no la MAC. La MAC ya la se, ahí es donde está la dificultad.

Ya he solucionado el problema. Me han pasado una libreria del software que trae la cámara que hace lo que necesito. Ahora tengo que ver como lo hago en C# pero el tema ya está solucionado.

Muchas gracias por todo.
Saludos.
  #14 (permalink)  
Antiguo 09/01/2008, 08:46
Avatar de dogduck  
Fecha de Ingreso: enero-2006
Ubicación: ¿Atlantida, Hesperides, Islas afortunadas?
Mensajes: 2.231
Antigüedad: 18 años, 10 meses
Puntos: 19
Re: Obtener IP mediante MAC en LAN

Ya, ya sé que debes de hayar la ip a través de la mac, pero te indicaba lo de getmac, para que modificaras el script:

Código:
@echo off
rem buscamac.cmd
echo Segmento 192.168.0.0/24 ( 192.168.0.1-192.168.0.254 )
echo Introduce mac a buscar ( ejemplo:  00-11-21-a2-8c-80 )
set /P lamac=
echo Nº de ecos del ping ( minimo:1, maximo:4)
set /P necos=
echo Escaneando red ... espere por favor
for /L %%k in (1,1,254) do (
 echo Escaneando IP: 192.168.0.%%k ...
 @echo 192.168.0.%%k >> tabla_ip_mac.txt
 getmac /S 192.168.0.%%k >> tabla_ip_mac.txt
)
echo.
echo Fin escaneo por icmp
@find "%lamac%" tabla_ip_mac.txt
pause
rem by javier castañón 2007
A lo mejor tarda menos que con el ping y el arp.

salu2
  #15 (permalink)  
Antiguo 13/06/2008, 09:28
Avatar de LeCLUB  
Fecha de Ingreso: abril-2003
Ubicación: Barcelona (España)
Mensajes: 205
Antigüedad: 21 años, 6 meses
Puntos: 1
Respuesta: Obtener IP mediante MAC en LAN

Hola.. yo lo utilizo pero buscando por NetBios (por ip se tarda mucho en recorrer toda una red de 255 direcciones)

El programa en si es este:
http://www.inetcat.net/software/nbtscan1_5_1.zip

Aquí teneis las especificaciones:
http://www.inetcat.net/software/nbtscan.html

y aqui el archivo.bat que me he hecho yo:

Código:
@echo off
cls
echo ************************************************
echo *         Buscador de IP mediante MAC          *
echo *                                              *
echo *                xaumet - 2008                 *
echo *                                              *
echo ************************************************
echo.
echo // Introduce el Rango de IP's sobre las que buscar
echo // Ejemplo: 192.168.1.1/24 (busca 255 direcciones)
echo.
set /P rango="-> "
echo.
echo // Introduce la MAC a buscar
echo // Ejemplo: 00-11-21-a2-8c-80
echo.
set /P mac="-> "
echo.
echo // Escaneando la red %rango% mediante
echo // Espere por favor...
nbtscan.exe -q 192.168.1.0/24 > RESULTADO
echo.
@find /i "%mac%" RESULTADO
echo.
echo.
echo Pulsa una tecla para salir...
pause > nul
Aqui teneis una captura de pantalla de como se muestra:




La búsqueda se hace casi inmediata...

Un saludo
__________________
Documentación de VBScript V5.6 en Español:
http://download.microsoft.com/downlo...ES/scd56es.exe
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta

SíEste tema le ha gustado a 2 personas (incluyéndote)




La zona horaria es GMT -6. Ahora son las 04:04.