Domino 9 und frühere Versionen > ND7: Entwicklung
Auslesen der Mac-Adresse der Clients
Kingpin:
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
m3:
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.
--- Ende Zitat ---
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
--- Ende Code ---
Kadlec:
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
Kingpin:
@m3
Merci für die schnelle und ausführliche Erklärung.
Hab das gleich mal implementiert und funktioniert wunderbar!
Grüße
m3:
--- Zitat von: Kadlec am 02.04.08 - 23:15:41 ---Right("0" & Wert,2)
--- Ende Zitat ---
Nicht undumm. Kommt in die Snippetkiste. Danke!
Navigation
[0] Themen-Index
[#] Nächste Seite
Zur normalen Ansicht wechseln