Dirección MAC

HMG en Español

Moderator: Rathinagiri

User avatar
edufloriv
Posts: 240
Joined: Thu Nov 08, 2012 3:42 am
DBs Used: DBF, MariaDB, MySQL, MSSQL, MariaDB
Location: PERU

Dirección MAC

Post by edufloriv »

Saludos colegas.

Hace ya bastante tiempo, pregunté y pregunté en diversos foros, sobre como obtener la dirección MAC de la tarjeta de red de un equipo, con el propósito de evitar las copias no autorizadas de mis sistemas a otras computadoras. Esta necesidad me surgió del hecho de que, hasta la fecha, había estado usando una función que obtenía el número de serie del disco duro, pero este método tiene como inconveniente que si el cliente reformatea su disco duro (que pasa muy seguido dependiendo de la cantidad de clientes que uno tenga) te llama para que lo licencies de nuevo. Por supuesto, esto podría parecer una ventaja porque aprovechamos para cobrarle al cliente y obtenemos un ingreso extra, pero la verdad en mi caso, sopesando el esfuerzo beneficio y el tiempo gastado, no se justifica.

Busqué y busqué sin encontrar respuesta alguna. Bueno, desde ayer que tengo algo de tiempo disponible, retome el tema y me propuse hallar una solución. Luego de horas de ardua búsqueda, y como suele pasar a veces, encontré lo que parece ser una solución razonable en un site que tengo siempre en mis narices, la WIKIPEDIA, copio el enlace para aquellos que, como yo, desconocen un poco de este tema:

http://es.wikipedia.org/wiki/Direcci" onclick="window.open(this.href);return false;ón_MAC

Pues bien, por supuesto, resultado de esto, escribí la función, misma que pongo a disposición de todos, con el propósito de que sea usada y mejorada.

*-------------------------------------------------------------------------
*-------------------------------------------------------------------------
*-------------------------------------------------------------------------

FUNC GetMAC

LOCAL cMacTxt , nMacIni , cMacId

SHELLEXECUTE( 0 , , "mac.bat" , , 0 , 0 )
cMacTxt := MEMOREAD('c:\mac.txt')
nMacIni := AT('-',cMacTxt)-2
cMacId := SUBSTR( cMacTxt , nMacIni , 17 )

RETURN( cMacId )

*-------------------------------------------------------------------------
*-------------------------------------------------------------------------
*-------------------------------------------------------------------------

Aquí el contenido del archivo mac.bat

getmac > c:\mac.txt

*-------------------------------------------------------------------------
*-------------------------------------------------------------------------
*-------------------------------------------------------------------------

Bueno, sería fantástico si alguien propusiera una solución para evitar la existencia del archivo mac.bat. Por supuesto se me ocurre que se puede verificar si el archivo existe y si no, por código se podría crear facilmente.

Esperando haber contribuido en algo, ya que Ustedes me ayudan muchísimo, cosa que les agradezco de corazón.


Mis sinceros saludos a todos.


:D

Eduardo Flores Rivas


LIMA - PERU
User avatar
andyglezl
Posts: 1461
Joined: Fri Oct 26, 2012 7:58 pm
Location: Guadalajara Jalisco, MX
Contact:

Re: Dirección MAC

Post by andyglezl »

Hola
Aquí unas modificaciones a tu funcion:

Code: Select all

FUNC GetMAC
	LOCAL cMacTxt , nMacIni , cMacId

	MemoWrit( System.TempFolder+"mac.bat", "getmac > "+System.TempFolder+"mac.txt" )
	SHELLEXECUTE( 0 , , System.TempFolder+"mac.bat", , 0 , 0 )
	cMacTxt := MEMOREAD(System.TempFolder+'mac.txt')
	nMacIni := AT('-',cMacTxt)-2
	cMacId := SUBSTR( cMacTxt , nMacIni , 17 )
	FErase(System.TempFolder+"mac.bat") 
	FErase(System.TempFolder+"mac.txt") 
RETURN( cMacId )
Andrés González López
Desde Guadalajara, Jalisco. México.
Javier Tovar
Posts: 1275
Joined: Tue Sep 03, 2013 4:22 am
Location: Tecámac, México

Re: Dirección MAC

Post by Javier Tovar »

Hola edufloriv,

Gracias por compartir!

Saludos
User avatar
edufloriv
Posts: 240
Joined: Thu Nov 08, 2012 3:42 am
DBs Used: DBF, MariaDB, MySQL, MSSQL, MariaDB
Location: PERU

Re: Dirección MAC

Post by edufloriv »

Gracias Andrés, con eso evitamos la existencia del archivo .bat y la función queda autónoma.


Saludos.

Eduardo Flores Rivas


LIMA - PERU
User avatar
danielmaximiliano
Posts: 2625
Joined: Fri Apr 09, 2010 4:53 pm
Location: Argentina
Contact:

Re: Dirección MAC

Post by danielmaximiliano »

Hi / Hola :

un poco tarde pero dejo este ejemplo para no depender de archivos externos

a little late but I leave this example to not depend on external files

Code: Select all

#include <hmg.ch>

Function Main
Public aAdapters [10] [3]
getMacAddress()

        DEFINE WINDOW Form_1  ;
		AT                0,0 ;
		WIDTH             600 ;
		HEIGHT            360 ;
		TITLE 'AdapterInfo()' ;
		MAIN 
			

		DEFINE GRID Grid_1
		    ROW      10  
            COL      10  
			WIDTH   580 
			HEIGHT  310 
			HEADERS {'Number ','Interface ','Mac address'} 
			WIDTHS  {50       ,340         ,180          }  
			ITEMS   aAdapters  
			VALUE   1
			TOOLTIP 'Grid Control'  
		END GRID	

	    END WINDOW
	
Form_1.Center

Form_1.Activate	

Return


*-----------------------------
FUNCTION getMacAddress()
*-----------------------------
Local oWmi := WmiService()
Local oAdapter
Local nI := 0 

 for each oAdapter in oWmi:ExecQuery("Select * from Win32_NetworkAdapter where physicaladapter=true") 
   If !empty(oAdapter:MACAddress)
      ++nI
	  *msginfo(  oAdapter:description , oAdapter:MACAddress )
	  aAdapters [ nI ] 	:= { Str( nI , 2 , 0 ) , oAdapter:description , oAdapter:MACAddress }
   Endif
 next
oWMI := Nil
Return Nil 

*-----------------------------
FUNCTION WMIService()
*-----------------------------
local oWMI, oLocator

oLocator   := win_oleCreateObject( "wbemScripting.SwbemLocator" )
oWMI       := oLocator:ConnectServer()

Return oWMI
2014-01-29 22_02_36-AdapterInfo().jpg
2014-01-29 22_02_36-AdapterInfo().jpg (34.06 KiB) Viewed 3890 times
*´¨)
¸.·´¸.·*´¨) ¸.·*¨)
(¸.·´. (¸.·` *
.·`. Harbour/HMG : It's magic !
(¸.·``··*

Saludos / Regards
DaNiElMaXiMiLiAnO

Whatsapp. := +54901169026142
Telegram Name := DaNiElMaXiMiLiAnO
User avatar
andyglezl
Posts: 1461
Joined: Fri Oct 26, 2012 7:58 pm
Location: Guadalajara Jalisco, MX
Contact:

Re: Dirección MAC

Post by andyglezl »

Hola

Aqui el detalle esta en poder identificar cual es la MAC del dispositivo fisico de red.
Ya que no sabemos en que orden se presenten en ambos ejemplos, ya que cada
computadora pudiera tener uno o varios dispositivos con MAC.
-----------------------------------------------------------------------------------------------------
Hello

Here the detail was to identify which is the MAC of the physical network device.
Since we do not know in what order are presented in both examples, since each
computer may have one or more devices with MAC.

*******************************************************************************
C:\temp>getmac

Dirección física Nombre de transporte
=================== ==========================================================
44-87-FC-5F-5C-C4 \Device\Tcpip_{9C5503B7-2A66-464F-B792-59E23A7BAA6B}
08-00-27-00-B8-D1 \Device\Tcpip_{8A6280D8-8ADA-40D0-B306-A33B50A14F52}
Dispositivo Virtual del VirtualBox
*******************************************************************************
Attachments
DirecMac.jpg
DirecMac.jpg (22.29 KiB) Viewed 3885 times
Andrés González López
Desde Guadalajara, Jalisco. México.
User avatar
danielmaximiliano
Posts: 2625
Joined: Fri Apr 09, 2010 4:53 pm
Location: Argentina
Contact:

Re: Dirección MAC

Post by danielmaximiliano »

Hola Andrés :

hice modificaciones a la aplicación, pero sigue devolviendo que los dispositivos virtuales son físicos.
PhysicalAdapter

Data type: boolean
Access type: Read-only

Indicates whether the adapter is a physical or a logical adapter. If True, the adapter is physical.
http://msdn.microsoft.com/en-us/library ... 85%29.aspx

por algún motivo devuelve siempre .T.
2014-01-30 09_43_59-AdapterInfo().jpg
2014-01-30 09_43_59-AdapterInfo().jpg (52.58 KiB) Viewed 3859 times
se agrego la indicación si esta conectado .

Code: Select all

*-----------------------------
FUNCTION getMacAddress()
*-----------------------------
Local oWmi := WmiService()
Local oAdapter
Local nI                   := 0 
Local nTemp                := 0 
Local cNetConnectionStatus := ''
Local aNetConnectionStatus [ 13 ] 
Local cPhysicalAdapter     := ''

aNetConnectionStatus  [ 1 ]    :=    'Disconnected'
aNetConnectionStatus  [ 2 ]    :=    'Connecting'
aNetConnectionStatus  [ 3 ]    :=    'Connected'
aNetConnectionStatus  [ 4 ]    :=    'Disconnecting'
aNetConnectionStatus  [ 5 ]    :=    'Hardware not present'
aNetConnectionStatus  [ 6 ]    :=    'Hardware disabled'
aNetConnectionStatus  [ 7 ]    :=    'Hardware malfunction'
aNetConnectionStatus  [ 8 ]    :=    'Media disconnected'
aNetConnectionStatus  [ 9 ]    :=    'Authenticating'
aNetConnectionStatus  [ 10 ]   :=    'Authentication succeeded'
aNetConnectionStatus  [ 11 ]   :=    'Authentication failed'
aNetConnectionStatus  [ 12 ]   :=    'Invalid address'
aNetConnectionStatus  [ 13 ]   :=    'Credentials required'

 for each oAdapter in oWmi:ExecQuery("Select * from Win32_NetworkAdapter where physicaladapter=true") 
   If !empty(oAdapter:MACAddress)
      ++nI
	   nTemp := oAdapter:NetConnectionStatus
	   cPhysicalAdapter     := Iif( ( oAdapter:PhysicalAdapter ) , 'Physical' , 'Virtual' )
	  aAdapters [ nI ] 	:= { Str( nI , 2 , 0 ) , oAdapter:description , oAdapter:MACAddress ,  aNetConnectionStatus  [ nTemp + 1 ], cPhysicalAdapter }
   Endif
 next
oWMI := Nil
Return Nil 
AdapterInfo.rar
Source files
(6.8 KiB) Downloaded 230 times
*´¨)
¸.·´¸.·*´¨) ¸.·*¨)
(¸.·´. (¸.·` *
.·`. Harbour/HMG : It's magic !
(¸.·``··*

Saludos / Regards
DaNiElMaXiMiLiAnO

Whatsapp. := +54901169026142
Telegram Name := DaNiElMaXiMiLiAnO
User avatar
danielmaximiliano
Posts: 2625
Joined: Fri Apr 09, 2010 4:53 pm
Location: Argentina
Contact:

Re: Dirección MAC

Post by danielmaximiliano »

Bingo :
mediante la busqueda con google llegue a la solucion de los dispositivo fisicos de red mediante la modificacion de la consulta

by google search with the solution reaches the physical network device by modifying the query

Code: Select all

 for each oAdapter in oWmi:ExecQuery("Select * from Win32_NetworkAdapter where physicaladapter=true") 
Change

Code: Select all

for each oAdapter in oWmi:ExecQuery("SELECT * FROM   Win32_NetworkAdapter WHERE  Manufacturer != 'Microsoft' AND NOT PNPDeviceID LIKE 'ROOT\\%'")
2014-01-30 10_16_38-AdapterInfo().jpg
2014-01-30 10_16_38-AdapterInfo().jpg (38.12 KiB) Viewed 3856 times
*´¨)
¸.·´¸.·*´¨) ¸.·*¨)
(¸.·´. (¸.·` *
.·`. Harbour/HMG : It's magic !
(¸.·``··*

Saludos / Regards
DaNiElMaXiMiLiAnO

Whatsapp. := +54901169026142
Telegram Name := DaNiElMaXiMiLiAnO
User avatar
andyglezl
Posts: 1461
Joined: Fri Oct 26, 2012 7:58 pm
Location: Guadalajara Jalisco, MX
Contact:

Re: Dirección MAC

Post by andyglezl »

Gracias Max por tu ejemplo y tu empeño !

Lo estoy probando pero de despliega un error.
( El ejemplo es para HMG o para Extend ? )
Attachments
GetMac.jpg
GetMac.jpg (92.8 KiB) Viewed 3837 times
Andrés González López
Desde Guadalajara, Jalisco. México.
User avatar
danielmaximiliano
Posts: 2625
Joined: Fri Apr 09, 2010 4:53 pm
Location: Argentina
Contact:

Re: Dirección MAC

Post by danielmaximiliano »

Andy :
Disculpas , hubo un error no corregido en el codigo.
subo modificacion y agregado

Andy:
Apologies, there was an uncorrected error in the code.
upload modified and added
2014-01-30 20_16_50-AdapterInfo().jpg
2014-01-30 20_16_50-AdapterInfo().jpg (38.32 KiB) Viewed 3806 times
AdapterInfo2.rar
(7.39 KiB) Downloaded 251 times
*´¨)
¸.·´¸.·*´¨) ¸.·*¨)
(¸.·´. (¸.·` *
.·`. Harbour/HMG : It's magic !
(¸.·``··*

Saludos / Regards
DaNiElMaXiMiLiAnO

Whatsapp. := +54901169026142
Telegram Name := DaNiElMaXiMiLiAnO
Post Reply