Autor Thema: Auslesen der Mac-Adresse der Clients  (Gelesen 2909 mal)

Offline Kingpin

  • Frischling
  • *
  • Beiträge: 9
  • Geschlecht: Männlich
  • Ich liebe dieses Forum!
Auslesen der Mac-Adresse der Clients
« am: 02.04.08 - 20:22:35 »
Hi @ all,

habe da mal eine Frage an euch, da ich nun schon eine weile an einem Problem sitze und es einfach nicht hin bekomme.

Was ich vor habe: Nachdem der User seinen Lotus Notes 7.0.2 - Client gestartet hat soll ein Agent ein Script ausführen, welches die Mac-Adresse des PCs, an welchem er sich anmeldet ausliest und daraufhin in ein Dokument in einer DB schreibt.

Was bereits funktioniert: Da wir bereits mit einer speziellen Startdatenbank arbeiten war es kein Problem einen Agenten zu schreiben, welcher eine Funktion aus einer Script-Bibliothek ausführt, welche den Code zum auslesen der Mac-Adresse beinhaltet. Das auslesen der Mac-Adresse und das schreiben in eine Datenbank funktioniert...

Was nicht funktionert: Du ausgelesende Mac-Adresse wird nur dann richtig angezeigt, wenn diese keine "0" (Nullen) in einem "abschnitt" vorangestellt ist.

Beispiel für falsche Anzeige der Mac-Adresse: 00:0D:60:66:6A:0C --> wird so ausgelesen und angezeigt 0:D:60:66:6A:C
Man sieht, dass die erste "0" fehlt, die "0" vor dem D und die "0" vor dem C. Die erste "0" ist kein Problem. Ich stell einfach im Script eine voran, da ich weiss, dass alle Mac-Adressen unserer PCs mit einer "0" anfangen.

Beispiel für die richtige Anzeige einer Mac-Adresse: 00:17:A4:18:91:4E --> wird unter der Voraussetzung, dass ich eine "0" im Script voranstelle auch so angezeigt.

Anbei das Script....

Vielleicht könnt ihr mir sagen wo das Problem liegt oder habt vielleicht einen Vorschlag wie man es anders machen könnte

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

   Option Public

   Const NCBASTAT = &H33
   Const NCBNAMSZ = 16
   Const HEAP_ZERO_MEMORY = &H8
   Const HEAP_GENERATE_EXCEPTIONS = &H4
   Const NCBRESET = &H32

   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

   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

   Type NAME_BUFFER
        name  As String * NCBNAMSZ
        name_num As Integer
        name_flags As Integer
   End Type

   Type ASTAT
        adapt As ADAPTER_STATUS
        NameBuff(30) As NAME_BUFFER
   End Type

   Declare Function Netbios Lib "netapi32.dll" (pncb As NCB) As Byte
   'Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" ( _
           hpvDest As Any, ByVal hpvSource As Long, ByVal cbCopy As Long)

   Declare Function GetProcessHeap Lib "kernel32" () As Long
   Declare Function HeapAlloc Lib "kernel32" (ByVal hHeap As Long, ByVal dwFlags As Long, ByVal dwBytes As Long) As Long
   Declare Function HeapFree Lib "kernel32" (ByVal hHeap As Long, ByVal dwFlags As Long, lpMem As Any) As Long

Class Sysinfo

Declare Public Function GetMacAddress As String

   Public Function GetMacAddress() As String
      Dim myNcb As NCB
      Dim bRet As Byte
      Dim macaddress As String
      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
         Print "memory allcoation failed!"
         
      End If

      myNcb.ncb_buffer = pASTAT
      bRet = Netbios(myNcb)
      CopyMemory myASTAT, myNcb.ncb_buffer, Len(myASTAT)
      macaddress = Hex(myASTAT.adapt.adapter_address(0)) & "0:" & _ 'Vorangestellte 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
      GetMacAddress = macaddress
   End Function   
End Class

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

Danke schonmal im Voraus für evtl. Mühen!  ;D

Grüße

Offline m3

  • Freund des Hauses!
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 8.102
  • Geschlecht: Männlich
  • Non ex transverso sed deorsum!
    • leyrers online pamphlet
Re: Auslesen der Mac-Adresse der Clients
« Antwort #1 am: 02.04.08 - 22:00:12 »
Vorab:
Zitat
Im Falle von Ethernet-Netzen besteht die MAC-Adresse aus 48 Bit (sechs Bytes), nummeriert von 47 bis 0. Die Adressen werden in der Regel hexadezimal geschrieben. Die Ausgabe einer MAC-Adresse kann dabei aussehen wie z. B. 08-00-20-ae-fd-7e oder 08:00:20:ae:fd:7e.

Nachdem es sich also um hexadezimale Byteangaben handelt, ist klar, dass "0D" ident zu "D" ist. Du müsstest also an der Anzeige nichts ändern.


Wenn Du jetzt aber "wegen der hübscheren Optik" bei einstelligen Angaben noch eine "0" davor schreiben willst, würde ich den String an den ":" in ein Array splitten und dann den String neu zusammen bauen, wobei Du dann bei den einzelnen Teilen checkst, ob sie eine oder zwei Stellen haben. Also etwa so:

Code
	Dim mac As String
	Dim teile As Variant
	Dim dispmac As String
	
	mac = "0:D:60:66:6A:C"
	teile = Split(mac, ":")
	
	Forall adr In teile
		If( Len(adr) < 2 ) Then
			adr = "0" & adr
		End If
	End Forall
	
	dispmac = Join( teile, ":")
	
	Msgbox dispmac
HTH
m³ aka. Martin -- leyrers online pamphlet | LEYON - All things Lotus (IBM Collaborations Solutions)

All programs evolve until they can send email.
Except Microsoft Exchange.
    - Memorable Quotes from Alt.Sysadmin.Recovery

"Lotus Notes ist wie ein Badezimmer, geht ohne Kacheln, aber nicht so gut." -- Peter Klett

"If there isn't at least a handful of solutions for any given problem, it isn't IBM"™ - @notessensai

Offline Kadlec

  • Senior Mitglied
  • ****
  • Beiträge: 489
  • Geschlecht: Männlich
  • Ich liebe dieses Forum!
Re: Auslesen der Mac-Adresse der Clients
« Antwort #2 am: 02.04.08 - 23:15:41 »
Gleiches Problem tritt z.B auf wenn man ein Datum mit Day, Month etc. zerlegt und die Tage aber weiter zweistellig haben will/muss.
Ich mach das dann so:
Right("0" & Wert,2)

Boris

Offline Kingpin

  • Frischling
  • *
  • Beiträge: 9
  • Geschlecht: Männlich
  • Ich liebe dieses Forum!
Re: Auslesen der Mac-Adresse der Clients
« Antwort #3 am: 03.04.08 - 00:06:37 »
@m3

Merci für die schnelle und ausführliche Erklärung.

Hab das gleich mal implementiert und funktioniert wunderbar!

Grüße

Offline m3

  • Freund des Hauses!
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 8.102
  • Geschlecht: Männlich
  • Non ex transverso sed deorsum!
    • leyrers online pamphlet
Re: Auslesen der Mac-Adresse der Clients
« Antwort #4 am: 03.04.08 - 08:54:42 »
Right("0" & Wert,2)
Nicht undumm. Kommt in die Snippetkiste. Danke!
HTH
m³ aka. Martin -- leyrers online pamphlet | LEYON - All things Lotus (IBM Collaborations Solutions)

All programs evolve until they can send email.
Except Microsoft Exchange.
    - Memorable Quotes from Alt.Sysadmin.Recovery

"Lotus Notes ist wie ein Badezimmer, geht ohne Kacheln, aber nicht so gut." -- Peter Klett

"If there isn't at least a handful of solutions for any given problem, it isn't IBM"™ - @notessensai

Offline Kadlec

  • Senior Mitglied
  • ****
  • Beiträge: 489
  • Geschlecht: Männlich
  • Ich liebe dieses Forum!
Re: Auslesen der Mac-Adresse der Clients
« Antwort #5 am: 03.04.08 - 09:31:52 »
Hatte ich hier aus dem Forum.
Evt. von Bernhard??

Boris

Offline Bastel123

  • Senior Mitglied
  • ****
  • Beiträge: 355
  • Geschlecht: Männlich
Re: Auslesen der Mac-Adresse der Clients
« Antwort #6 am: 08.04.08 - 08:36:16 »
Moin,

ich fülle immer mit der maximal möglichen Anzahl der Stellen auf, da ich ja nie genau weiß ob der Wert auch wirklich eine oder mehrere Stellen hat.

bei Datum: @Right("00" + @Text(@Month(datum)),2)

oder @Right("XXXXXX" + wert;6)

damit ist man dann in Ansichten auf der Sicheren Seite.

@Bernhard: in den Best Practices zu den Kalenderwochen könnte man das auch ergänzen

@Right("00" + @Text(KW);2) + ".KW"

Viele Grüße

Sebastian 
« Letzte Änderung: 08.04.08 - 13:42:56 von Bastel123 »
Gruß Sebastian
-----------------------------------------------------
Kaum macht man's richtig, schon funktioniert's.

Offline Kadlec

  • Senior Mitglied
  • ****
  • Beiträge: 489
  • Geschlecht: Männlich
  • Ich liebe dieses Forum!
Re: Auslesen der Mac-Adresse der Clients
« Antwort #7 am: 08.04.08 - 14:44:20 »
In Abhängigkeit des entsprechenden Formats kann es durchaus nötig sein mehrere Nullen voranzustellen. Beim Datum aber nicht, da es ja sowieso nur zwei Stellen hat.

Boris

 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz