Avatar billede tax Nybegynder
23. august 2002 - 00:41 Der er 5 kommentarer og
1 løsning

Indhentning af MAC adresse

Jeg sidder i en situation hvor jeg skal indhente MAC adressen fra den PC hvor mit program afvikles på.

Jeg har skrevet applikationen i VB6 og det kan lade sig gøre for mig at bruge en OCX og derved komme frem til MAC adressen.

Problemet er blot at de PCere mit program skal køre på ikke altid er tilsluttet et netværk, og det bevirker (i windows 2000) at MAC adressen detekteres forkert eller der opstår fejl når jeg søger at indhente MAC adressen.

Dette vil jeg gerne undgå og derfor tænkte jeg at det ville være muligt at hente den igennem noget benhård C++ kode og importere det i Visual Basic som en slags objekt.

Hvorledes kan det foregå?

Hvis der er en metode til at identificere en PC, der er bedre vil jeg gerne høre om det. Blev der nogensinde implementeret et serienummer i hver CPU? Jeg mener det var oppe og vende for et stykke tid siden.
Avatar billede iblarsen Praktikant
23. august 2002 - 07:16 #1
Her er en stump VB kode - prøve det

'*
'* GetMacAddress
'*
 
Private Const NCBASTAT = &H33
Private Const NCBNAMSZ = 16
Private Const HEAP_ZERO_MEMORY = &H8
Private Const HEAP_GENERATE_EXCEPTIONS = &H4
Private Const NCBRESET = &H32

  Private Type NCB
        ncb_command As Byte 'Integer
        ncb_retcode As Byte 'Integer
        ncb_lsn As Byte 'Integer
        ncb_num As Byte ' Integer
        ncb_buffer As Long 'String
        ncb_length As Integer
        ncb_callname As String * NCBNAMSZ
        ncb_name As String * NCBNAMSZ
        ncb_rto As Byte 'Integer
        ncb_sto As Byte ' Integer
        ncb_post As Long
        ncb_lana_num As Byte 'Integer
        ncb_cmd_cplt As Byte  'Integer
        ncb_reserve(9) As Byte ' Reserved, must be 0
        ncb_event As Long
  End Type
  Private Type ADAPTER_STATUS
        adapter_address(5) As Byte 'As String * 6
        rev_major As Byte 'Integer
        reserved0 As Byte 'Integer
        adapter_type As Byte 'Integer
        rev_minor As Byte 'Integer
        duration As Integer
        frmr_recv As Integer
        frmr_xmit As Integer
        iframe_recv_err As Integer
        xmit_aborts As Integer
        xmit_success As Long
        recv_success As Long
        iframe_xmit_err As Integer
        recv_buff_unavail As Integer
        t1_timeouts As Integer
        ti_timeouts As Integer
        Reserved1 As Long
        free_ncbs As Integer
        max_cfg_ncbs As Integer
        max_ncbs As Integer
        xmit_buf_unavail As Integer
        max_dgram_size As Integer
        pending_sess As Integer
        max_cfg_sess As Integer
        max_sess As Integer
        max_sess_pkt_size As Integer
        name_count As Integer
  End Type
  Private Type NAME_BUFFER
        name  As String * NCBNAMSZ
        name_num As Integer
        name_flags As Integer
  End Type
  Private Type ASTAT
        adapt As ADAPTER_STATUS
        NameBuff(30) As NAME_BUFFER
  End Type

  Private Declare Function Netbios Lib "netapi32.dll" (pncb As NCB) As Byte
  Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (hpvDest As Any, ByVal hpvSource As Long, ByVal cbCopy As Long)
  Private Declare Function GetProcessHeap Lib "kernel32" () As Long
  Private Declare Function HeapAlloc Lib "kernel32" (ByVal hHeap As Long, ByVal dwFlags As Long, ByVal dwBytes As Long) As Long
  Private Declare Function HeapFree Lib "kernel32" (ByVal hHeap As Long, ByVal dwFlags As Long, lpMem As Any) As Long

Public Function bsGetMacAddress() As String
  Dim myNcb As NCB
  Dim bRet As Byte
  myNcb.ncb_command = NCBRESET
  bRet = Netbios(myNcb)

  myNcb.ncb_command = NCBASTAT
  myNcb.ncb_lana_num = 0
  myNcb.ncb_callname = "*              "

  Dim myASTAT As ASTAT, tempASTAT As ASTAT
  Dim pASTAT As Long
  myNcb.ncb_length = Len(myASTAT)
  pASTAT = HeapAlloc(GetProcessHeap(), HEAP_GENERATE_EXCEPTIONS Or HEAP_ZERO_MEMORY, myNcb.ncb_length)
  If pASTAT = 0 Then
    Exit Function
  End If
  myNcb.ncb_buffer = pASTAT
  bRet = Netbios(myNcb)
  CopyMemory myASTAT, myNcb.ncb_buffer, Len(myASTAT)
  bsGetMacAddress = Hex(myASTAT.adapt.adapter_address(0)) & " " & _
                    Hex(myASTAT.adapt.adapter_address(1)) & " " & _
                    Hex(myASTAT.adapt.adapter_address(2)) & " " & _
                    Hex(myASTAT.adapt.adapter_address(3)) & " " & _
                    Hex(myASTAT.adapt.adapter_address(4)) & " " & _
                    Hex(myASTAT.adapt.adapter_address(5))
  HeapFree GetProcessHeap(), 0, pASTAT
End Function
Avatar billede iblarsen Praktikant
23. august 2002 - 07:19 #2
Du kan også bruge programmet Ipconfig med parameteren /All - og derefter finde MacAdressen.
Avatar billede tax Nybegynder
23. august 2002 - 10:16 #3
det skal jeg lige prøve. tak
Avatar billede tax Nybegynder
23. august 2002 - 12:11 #4
Jeg har ikke prøvet det endnu, men er der noget om at netkortets profil fjernes fra windowskonfigurationen når netstikket tages ud og det er det der skaber hele problemet?
Avatar billede iblarsen Praktikant
25. august 2002 - 19:48 #5
Der bør ikke ske noget med netkortets profil. Hvis du kører med DHCP til IP-adresse - kan IP-adressen være en anden næste gang du sætter stikket i.
Avatar billede tax Nybegynder
30. oktober 2002 - 16:08 #6
jeg hentede MAC igenem ipconfig /all .. det spiller OK
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester