Newsgroup: it.comp.lang.visual-basic
Titolo: [?] MAC Address

Salve a tutti, avrei la necessità di recuperare il MAC Address della scheda
rete installata su un PC, ma col seguente codice non sono riuscito. Qualcuno
è in grado di dirmi dove sbaglio?
Nel mio caso specifico mi trovo su un Windows 98, ma il codice dovrebbe
essere compatibile anche con 95/NT/2000. (non pretendo ME perchè non aspiro
all'impossibile ;o)).
Riporto per intero la documentazione che ho reperito io, mi scuso per le
forse eccessive dimensioni del post.
 BAS Module Code
Add the following code to a BAS module:
----------------------------------------------------------------------------
----
Option Explicit
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' Copyright ©1996-2000 VBnet, Randy Birch, All Rights Reserved.
' Some pages may also contain other copyrights by the author.
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' You are free to use this code within your own applications,
' but you are expressly forbidden from selling or otherwise
' distributing this source code without prior written consent.
' This includes both posting free demo projects made from this
' code as well as reproducing the code in text or html format.
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Public Const NCBASTAT As Long = &H33
Public Const NCBNAMSZ As Long = 16
Public Const HEAP_ZERO_MEMORY As Long = &H8
Public Const HEAP_GENERATE_EXCEPTIONS As Long = &H4
Public Const NCBRESET As Long = &H32
Public Type NET_CONTROL_BLOCK  'NCB
   ncb_command    As Byte
   ncb_retcode    As Byte
   ncb_lsn        As Byte
   ncb_num        As Byte
   ncb_buffer     As Long
   ncb_length     As Integer
   ncb_callname   As String * NCBNAMSZ
   ncb_name       As String * NCBNAMSZ
   ncb_rto        As Byte
   ncb_sto        As Byte
   ncb_post       As Long
   ncb_lana_num   As Byte
   ncb_cmd_cplt   As Byte
   ncb_reserve(9) As Byte ' Reserved, must be 0
   ncb_event      As Long
End Type
Public Type ADAPTER_STATUS
   adapter_address(5) As Byte
   rev_major         As Byte
   reserved0         As Byte
   adapter_type      As Byte
   rev_minor         As Byte
   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
Public Type NAME_BUFFER
   name        As String * NCBNAMSZ
   name_num    As Integer
   name_flags  As Integer
End Type
Public Type ASTAT
   adapt          As ADAPTER_STATUS
   NameBuff(30)   As NAME_BUFFER
End Type
Public Declare Function Netbios Lib "netapi32.dll" _
   (pncb As NET_CONTROL_BLOCK) As Byte
Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" _
   (hpvDest As Any, ByVal _
    hpvSource As Long, ByVal _
    cbCopy As Long)
Public Declare Function GetProcessHeap Lib "kernel32" () As Long
Public Declare Function HeapAlloc Lib "kernel32" _
    (ByVal hHeap As Long, ByVal dwFlags As Long, _
     ByVal dwBytes As Long) As Long
Public Declare Function HeapFree Lib "kernel32" _
    (ByVal hHeap As Long, _
     ByVal dwFlags As Long, _
     lpMem As Any) As Long
Public Function GetMACAddress() As String
  'retrieve the MAC Address for the network controller
  'installed, returning a formatted string
   Dim tmp As String
   Dim pASTAT As Long
   Dim NCB As NET_CONTROL_BLOCK
   Dim AST As ASTAT
  'The IBM NetBIOS 3.0 specifications defines four basic
  'NetBIOS environments under the NCBRESET command. Win32
  'follows the OS/2 Dynamic Link Routine (DLR) environment.
  'This means that the first NCB issued by an application
  'must be a NCBRESET, with the exception of NCBENUM.
  'The Windows NT implementation differs from the IBM
  'NetBIOS 3.0 specifications in the NCB_CALLNAME field.
   NCB.ncb_command = NCBRESET
   Call Netbios(NCB)
  'To get the Media Access Control (MAC) address for an
  'ethernet adapter programmatically, use the Netbios()
  'NCBASTAT command and provide a "*" as the name in the
  'NCB.ncb_CallName field (in a 16-chr string).
   NCB.ncb_callname = "*               "
   NCB.ncb_command = NCBASTAT
  'For machines with multiple network adapters you need to
  'enumerate the LANA numbers and perform the NCBASTAT
  'command on each. Even when you have a single network
  'adapter, it is a good idea to enumerate valid LANA numbers
  'first and perform the NCBASTAT on one of the valid LANA
  'numbers. It is considered bad programming to hardcode the
  'LANA number to 0 (see the comments section below).
   NCB.ncb_lana_num = 0
   NCB.ncb_length = Len(AST)
   pASTAT = HeapAlloc(GetProcessHeap(), HEAP_GENERATE_EXCEPTIONS _
            Or HEAP_ZERO_MEMORY, NCB.ncb_length)
   If pASTAT = 0 Then
      Debug.Print "memory allocation failed!"
      Exit Function
   End If
   NCB.ncb_buffer = pASTAT
   Call Netbios(NCB)
   CopyMemory AST, NCB.ncb_buffer, Len(AST)
   tmp = Format$(Hex(AST.adapt.adapter_address(0)), "00") & " " & _
         Format$(Hex(AST.adapt.adapter_address(1)), "00") & " " & _
         Format$(Hex(AST.adapt.adapter_address(2)), "00") & " " & _
         Format$(Hex(AST.adapt.adapter_address(3)), "00") & " " & _
         Format$(Hex(AST.adapt.adapter_address(4)), "00") & " " & _
         Format$(Hex(AST.adapt.adapter_address(5)), "00")
   HeapFree GetProcessHeap(), 0, pASTAT
   GetMACAddress = tmp
End Function
'--end block--'
 Comments
Other hardware and software may be assigned their own MAC addresses. For
example, a modem can have a MAC address. Also, a RAS client or server can
install "dummy" network adapters that correspond to a dialup or serial
connection. Normally, these MAC addresses are randomly generated. If an
adapter status is called on a LANA that corresponds to one of these adapters
when no connection is present, Netbios returns error 0x34 (NRC_ENVNOTDEF)
even if a reset was previously performed.
With the NetBEUI and IPX transports, the same information can be obtained at
a command prompt by using:
     net config workstation
The ID given is the MAC address.
How to Use LANA Numbers in a 32-bit Environment
Last reviewed: August 7, 1996
Article ID: Q138037
The information in this article applies to:
Microsoft Win32 Software Development Kit (SDK) versions 3.1, 3.5, 3.51, 4.0
SUMMARY
NetBIOS uses the concept of a LANA (LAN adapter number) that allows you to
write transport-independent NetBIOS applications. This article describes
what a LANA is and recommends an approach to writing NetBIOS applications.
MORE INFORMATION
A LANA is a field of the NetBIOS NCB structure. In IBM's NetBIOS 3.0
specification, a LANA was used to specify a particular network adapter, as
NetBIOS then supported up to two network adapters in one PC computer.
Specifying a LANA of zero directed a request to the first adapter, and
specifying a LANA of one directed a request to the second adapter.
Originally, IBM sent NetBIOS packets over the NetBEUI protocol, also known
as the NetBIOS Frames protocol. This was the only transport NetBIOS could
use to send data across the network. In other words, each network adapter
had only one protocol to send and receive NetBIOS packets.
Because most computers have only one network adapter, many MS-DOS-based
applications send all their requests to a LANA value of zero (also called
simply 'LANA zero'). If a second network adapter is installed, some programs
allow the user to configure the application to use LANA one instead. As a
result, LANA zero became a default setting, though it was never intended to
be a default.
Today's network technology allows NetBIOS to use transports other than
NetBEUI. Microsoft has extended the meaning of LANA to indicate a specific
transport on a specific adapter. For example, if you have two network
adapters, and have IPX/SPX and NetBEUI transports installed, you have four
LANAs. The LANAs may or may not be sequential, and there is no systematic
way to identify which transport maps to which LANA.
In addition to extending the meaning of a LANA, Microsoft also added an NCB
command (NCBENUM) that returns an array of available LANA numbers. As an
example, the LANA_ENUM structure filled by NCBENUM might hold an array with
values 0, 3, 5, and 6. Zero might map to IPX/SPX on the first adapter, three
might map to NETBEUI on a second adapter, and so on.
In Windows NT and Windows 95, network adapters consist of physical adapters
(like a 3Com Etherlink II) and software adapters (like the Dial Up Adapter).
In addition, a user may have TCP/IP, NETBEUI, IPX/SPX, and other transports
installed, all of which have NetBIOS support.
For Windows NT, LANAs are configurable through the control panel. Choose the
Network applet, choose the NetBIOS Interface component, then choose
Configure. A dialog appears that allows you to edit the LANAs.
For Windows 95, you may only set LANA zero, the default protocol, and if no
protocol is set as default, there won't be a LANA zero. You can set the
default protocol in the control panel. Choose the Network applet, choose the
protocol you want as default, choose Properties, the Advanced tab, and
finally check 'Set this protocol to be the default protocol'.
LANAs may seem like a constraint that your application must work around.
However, making your application ignorant of how users want to configure
their machines is a powerful idea, and one that makes life easier for your
customers.
The best way to write a NetBIOS application is to support all LANAs, and
establish connections over any LANA. A good approach is outlined in the
following steps:
Enumerate the LANAs by submitting NCBENUM.
Reset each LANA by submitting one NCBRESET per LANA.
Add your local NetBIOS name to each LANA. The name may be the same on each
LANA.
Connect using any LANA:
For servers, submit an NCBLISTEN on each LANA. If necessary, cancel any
outstanding listen after the first listen is satisfied.
For clients, submit an NCBFINDNAME (Windows NT only) or an NCBCALL (either
Windows NT or Windows 95) on each LANA. The first successful find name or
call will indicate which LANA to use. When using NCBCALL instead of
NCBFINDNAME, you must cancel any pending NCBCALLs and hang up the extra
completed calls (when two or more calls are successful.)
It is a good idea to submit NCBADDNAME, NCBLISTEN, NCBFINDNAME, and NCBCALL
asynchronously. Asynchronous requests will be processed almost in parallel
on each transport.
This architecture is quite beneficial. Once your application is written to
establish connections in this manner, it will support any transport that
NetBIOS can use. As a result, your customers will not have to configure
anything within your application, and your application will not be affected
by dynamic LANAs such as dial-up adapters or plug-and-play hardware.
Last reviewed: August 7, 1996
1998 Microsoft Corporation. All rights reserved.
--
U m b e r t o    M e r o n i
Software development & Internet Services, Italy
---
E-mail: 
webm...@vbp.it
Personal site: 
http://www.umbertomeroni.com
ICQ: 14660006
---
Chi vuol esser lieto, sia:
di doman non c'è certezza.
---

 all'impossibile ;o)).
La funzione funziona.
Provata in Win95, Win98SE, WinNT4 Sp6a, WinME
Che problema riscontri ?

 essere compatibile anche con 95/NT/2000. (non pretendo ME perchè non
aspiro all'impossibile ;o)).
la parte importante del codice qui sotto (un solo frm) deriva direttamente
da scott+michelle, se ricordo. mi sembra funzioni anche con 2 schede di rete
sulla stessa macchina, tipo proxy. da' pure -- se ne ha voglia, chi ne
capisce potrebbe dire esattamente cos'e' -- il numerino del ppp, se hai
anche un ras configurato. l'avevo testato su 95 e nt. l'ho appena provato su
win2000.
unica cosa: qui mi ripete il ppp 3 volte e il mac 2.
non so se e' possibile fargli dare i numeri una volta sola.
ciao, a.
ps -- sai cosa voglia dire "mac" ?
Option Explicit
Private Const NCBNAMSZ = 16
Private Const MAX_LANA = 254
Private Const NCBENUM = &H37
Private Const NCBRESET = &H32
Private Const NCBASTAT = &H33
Private Type ADAPTER_STATUS
    adapter_address(0 To 5) As Byte
    rev_major As Byte
    reserved0 As Byte
    adapter_type As Byte
    rev_minor As Byte
    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_(0 To NCBNAMSZ - 1) As Byte
    name_num As Byte
    name_flags As Byte
End Type
Private Type ASTAT
    adapt As ADAPTER_STATUS
    NameBuff(0 To 29) As NAME_BUFFER
End Type
Private Type NCB
    ncb_command As Byte
    ncb_retcode As Byte
    ncb_lsn As Byte
    ncb_num As Byte
    p_ncb_buffer As Long
    ncb_length As Integer
    ncb_callname(0 To NCBNAMSZ - 1) As Byte
    ncb_name(0 To NCBNAMSZ - 1) As Byte
    ncb_rto As Byte
    ncb_sto As Byte
    p_ncb_post As Long
    ncb_lana_num As Byte
    ncb_cmd_cplt As Byte
    ncb_reserve(0 To 10 - 1) As Byte
    ncb_event As Long
End Type
Private Type LANA_ENUM
    length As Byte
    lana(0 To MAX_LANA - 1) As Byte
End Type
Private Declare Function Netbios Lib "netapi32.dll" _
        (pncb As NCB) As Byte
Private Declare Function CopyMemory Lib "kernel32" Alias "RtlMoveMemory" _
   (dest As Any, src As Any, ByVal length As Long) As Long
Public Sub GetMacAddress(colMacAddress As Collection)
    Dim Adapter As ASTAT
    Dim SNcb As NCB
    Dim uRetCode As Byte
    Dim NetName(0 To 49) As Byte
    Dim Blank(Len(SNcb)) As Byte
    Dim Blank2(Len(Adapter)) As Byte
    Dim lenum As LANA_ENUM
    Dim i As Long
    Dim j As Long
    Dim sMac As String
    CopyMemory SNcb, Blank(0), Len(SNcb)
    With SNcb
        .ncb_command = NCBENUM
        .p_ncb_buffer = VarPtr(lenum)
        .ncb_length = Len(lenum)
    End With
    uRetCode = Netbios(SNcb)
    For i = 0 To lenum.length - 1
        CopyMemory SNcb, Blank(0), Len(SNcb)
        With SNcb
            .ncb_command = NCBRESET
            .ncb_lana_num = lenum.lana(i)
        End With
        uRetCode = Netbios(SNcb)
        CopyMemory SNcb, Blank(0), Len(SNcb)
        CopyMemory Adapter, Blank2(0), Len(Adapter)
        With SNcb
            .ncb_command = NCBASTAT
            .ncb_lana_num = lenum.lana(i)
            .p_ncb_buffer = VarPtr(Adapter)
            .ncb_length = Len(Adapter)
            .ncb_callname(0) = Asc("*")
            For j = 1 To 15
                .ncb_callname(j) = Asc(" ")
            Next
        End With
        uRetCode = Netbios(SNcb)
        If uRetCode = 0 Then
            With Adapter.adapt
                sMac = Right("00" & Hex(.adapter_address(0)), 2) & _
                       Right("00" & Hex(.adapter_address(1)), 2) & _
                       Right("00" & Hex(.adapter_address(2)), 2) & _
                       Right("00" & Hex(.adapter_address(3)), 2) & _
                       Right("00" & Hex(.adapter_address(4)), 2) & _
                       Right("00" & Hex(.adapter_address(5)), 2)
            End With
            colMacAddress.Add sMac
        End If
    Next
End Sub
Private Sub Command1_Click()
    On Error GoTo errman
    Dim col As Collection
    Dim vItem As Variant
    Set col = New Collection
    GetMacAddress col
    Text1 = ""
    For Each vItem In col
        Text1 = Text1 & vbCrLf & vItem
    Next
    Exit Sub
errman:     MsgBox Error
End Sub
Private Sub Command2_Click()
    On Error GoTo errman
    If Text1 = "" Then
        MsgBox "You should get it before..."
        Exit Sub
    End If
    Clipboard.Clear
    Clipboard.SetText Text1
    Exit Sub
errman:     MsgBox Error
End Sub
Private Sub Command3_Click()
    On Error GoTo errman
    Unload Me
    Exit Sub
errman:     MsgBox Error
End Sub
Private Sub Command4_Click()
    On Error GoTo errman
    If Text1.SelText = "" Then
        MsgBox "You should select something..."
        Exit Sub
    End If
    Clipboard.Clear
    Clipboard.SetText Text1.SelText
    Exit Sub
errman:     MsgBox Error
End Sub
Private Sub Command5_Click()
    On Error GoTo errman
    Dim r As Long
    r = Shell("clipbrd.exe", vbNormalFocus)
    Exit Sub
errman:     MsgBox Error
End Sub

 ps -- sai cosa voglia dire "mac" ?
... cut...
Media Access Control
Indirizzo univoco della scheda di rete (nic = network interface card)
Ethernet che viene assegnato alla fabbricazione.
E' composto da 6 byte. I primi due identificano il costruttore della scheda
secondo i regolamenti IEEE.
Ciao
Aldo

 wrote in message
news:8snu0n$l39j5$2...@ID-56381.news.cis.dfn.de...


Grazie, lo provo subito.
Ubi
Sent via Deja.com 
http://www.deja.com/
Before you buy.