Hallo Zusammen,
in der Vergangenheit habe ich die Infos für die Netzwerkadapter immer mittels WMI und Win32_NetworkAdapterConfiguration ausgelesen, doch bei z.B. mürben Nvidia-Treibern wurde oft bei IP, Subnetmask etc immer "" zurückgeliefert. Daher bin ich auf der Suche nach einer Alternative und bin auf da Script GetAdaptersXML.au3 von ProgAndy gestossen.
Ich hab es leicht modifiziert und als x32 und x64 compiliert und ausprobiert. Doch leider liefert das x64-Compilat immer 0 bei LeaseObtained und LeaseExpires. Der Rest sieht gut aus.
Jetzt habe ich ne Nacht darüber geschlafen, aber ich finde heute auch nicht die Ursache dafür. Die Structur sieht sauber aus, der Aufruf auch. Hat jemand ne Idee, was da faul ist?
Spoiler anzeigen
#AutoIt3Wrapper_AU3Check_Parameters=-d -w 1 -w 2 -w 3 -w 4 -w 5 -w 6
#AutoIt3Wrapper_UseX64=y
#AutoIt3Wrapper_Run_Tidy=y
#Tidy_Parameters=/sci=9
#AutoIt3Wrapper_Run_Obfuscator=y
#Obfuscator_Parameters=/cs=1 /cn=1 /cf=1 /cv=1 /sf=1 /sv=1
; Source von ProgAndy
; http://www.autoitscript.com/forum/topic/95901-get-subnetmask-gateway-dns/page__view__findpost__p__689749
; http://www.autoitscript.com/forum/index.php?app=core&module=attach§ion=attach&attach_id=26447
;
; Modifikationen:
; 11.04.2011, skyteddy: - Alle Funktionen nach unten verschoben und in eine Region gepackt
; - Locals in Main zu Global gemacht
; - Result wird in Datei geschrieben
; - Neue Funktion _GetTime
#include-once
#include <date.au3>
Opt("MustDeclareVars", 1)
Global $filename
If @AutoItX64 Then
$filename = "GetAdapterInfos_x64.xml"
Else
$filename = "GetAdapterInfos.xml"
EndIf
Global Const $tagIP_ADDRESS_STRING = "char IPAddress[16];"
Global Const $tagIP_MASK_STRING = "char IPMask[16];"
Global Const $tagIP_ADDR_STRING = "ptr Next;" & $tagIP_ADDRESS_STRING & $tagIP_MASK_STRING & "DWORD Context;"
Global Const $tagIP_ADAPTER_INFO = "ptr Next; DWORD ComboIndex; char AdapterName[260];char Description[132]; UINT AddressLength; BYTE Address[8]; dword Index; UINT Type;" & _
" UINT DhcpEnabled; ptr CurrentIpAddress; ptr IpAddressListNext; char IpAddressListADDRESS[16]; char IpAddressListMASK[16]; DWORD IpAddressListContext; " & _
"ptr GatewayListNext; char GatewayListADDRESS[16]; char GatewayListMASK[16]; DWORD GatewayListContext; " & _
"ptr DhcpServerNext; char DhcpServerADDRESS[16]; char DhcpServerMASK[16]; DWORD DhcpServerContext; " & _
"int HaveWins; " & _
"ptr PrimaryWinsServerNext; char PrimaryWinsServerADDRESS[16]; char PrimaryWinsServerMASK[16]; DWORD PrimaryWinsServerContext; " & _
"ptr SecondaryWinsServerNext; char SecondaryWinsServerADDRESS[16]; char SecondaryWinsServerMASK[16]; DWORD SecondaryWinsServerContext; " & _
"DWORD LeaseObtained; DWORD LeaseExpires;"
Global Const $NETWORK_REG_KEY = "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Network\{4D36E972-E325-11CE-BFC1-08002BE10318}\"
Global $dll = DllOpen("Iphlpapi.dll")
Global $ret = DllCall($dll, "dword", "GetAdaptersInfo", "ptr", 0, "dword*", 0)
Global $adapterBuffer = DllStructCreate("byte[" & $ret[2] & "]")
Global $adapterBuffer_pointer = DllStructGetPtr($adapterBuffer)
Global $return = DllCall($dll, "dword", "GetAdaptersInfo", "ptr", $adapterBuffer_pointer, "dword*", $ret[2])
Global $adapter = DllStructCreate($tagIP_ADAPTER_INFO, $adapterBuffer_pointer)
If Not @error Then
Global $DisplayName, $ptr, $adapterName, $MediaSubType, $PnpInstanceID
Global $XML = '<?xml version="1.0" encoding="UTF-8"?>' & @CRLF & "<ADAPTERS>" & @CRLF & @CRLF
Do
$XML &= " <ADAPTER>" & @CRLF
$XML &= @TAB & @TAB & _GetXML($adapter, "ComboIndex")
$XML &= @TAB & @TAB & _GetXML($adapter, "Description")
$XML &= @TAB & @TAB & _GetXML($adapter, "AdapterName")
$XML &= @TAB & @TAB & xml_makeNode("Address", _GetMac($adapter))
$XML &= @TAB & @TAB & _GetXML($adapter, "Index")
$XML &= @TAB & @TAB & _GetXML($adapter, "Type")
$XML &= @TAB & @TAB & _GetXML($adapter, "DhcpEnabled")
$XML &= _GetAllIPsXML(DllStructGetPtr($adapter, "IpAddressListNext"), "IP", False)
$XML &= _GetAllIPsXML(DllStructGetPtr($adapter, "GatewayListNext"), "Gateway")
$XML &= _GetFirstIPXML(DllStructGetPtr($adapter, "DhcpServerNext"), "DhcpServer")
$XML &= @TAB & @TAB & _GetXML($adapter, "HaveWins")
$XML &= _GetFirstIPXML(DllStructGetPtr($adapter, "PrimaryWinsServerNext"), "PrimaryWinsServer")
$XML &= _GetFirstIPXML(DllStructGetPtr($adapter, "SecondaryWinsServerNext"), "SecondaryWinsServer")
; $XML &= @TAB & @TAB & _GetXML($adapter, "LeaseObtained") ; liefert bei x64-Compilat immer 0
$XML &= @TAB & @TAB & _GetTime($adapter, "LeaseObtained") ; liefert bei x64-Compilat immer 0
; $XML &= @TAB & @TAB & _GetXML($adapter, "LeaseExpires") ; liefert bei x64-Compilat immer 0
$XML &= @TAB & @TAB & _GetTime($adapter, "LeaseExpires") ; liefert bei x64-Compilat immer 0
$adapterName = DllStructGetData($adapter, "AdapterName")
$DisplayName = RegRead($NETWORK_REG_KEY & $adapterName & "\Connection", "Name")
$XML &= @TAB & @TAB & xml_makeNode("DisplayName", $DisplayName)
$MediaSubType = RegRead($NETWORK_REG_KEY & $adapterName & "\Connection", "MediaSubType")
$XML &= @TAB & @TAB & xml_makeNode("MediaSubType", $MediaSubType)
ConsoleWrite("+-> Mediasubtype: ( LAN = 1 oder 10 ?why? ; Network-Bridge = 1(aber auch LAN?why) ; WLAN = 2 ; IEEE1394 = 5 ; Bluetooth = 9 ; )" & @CRLF)
$PnpInstanceID = RegRead($NETWORK_REG_KEY & $adapterName & "\Connection", "PnpInstanceID")
$XML &= @TAB & @TAB & xml_makeNode("PnpInstanceID", $PnpInstanceID)
$XML &= " </ADAPTER>" & @CRLF & @CRLF
$ptr = DllStructGetData($adapter, "Next")
$adapter = DllStructCreate($tagIP_ADAPTER_INFO, $ptr)
Until @error
$XML &= "<ADAPTER>" & @CRLF
EndIf
ConsoleWrite($XML & @CRLF)
; Altes File löschen
If FileExists($filename) And Not FileDelete($filename) Then
MsgBox(48 + 262144, "Fehler", 'Die Datei "' & $filename & '" konnte nicht gelöscht werden!')
Exit
EndIf
; Neue Datei schreiben
If FileWrite($filename, $XML) Then
MsgBox(262144, "Result", 'Das Ergenis wurde in der Datei "' & $filename & '" gespeichert!')
Else
MsgBox(48 + 262144, "Fehler", 'Das Ergbnis konnte NICHT in die Datei "' & $filename & '" gespeichert werden!')
EndIf
$adapterBuffer = ""
$adapterBuffer_pointer = ""
DllClose($dll)
Exit
; ------------------------------------------------------------- Funktionsdefinitionen -------------------------------------------------------------
#region Funktionsdefinitionen
Func _GetAllIPsXML($ptr, $Type, $MAC = True, $Indent = 2)
Local $Tab = ""
For $i = 1 To $Indent
$Tab &= @TAB
Next
Local $return = $Tab & "<" & StringUpper($Type) & "LIST>" & @CRLF
Local $IPArray = _GetAllIps($ptr)
For $i = 0 To UBound($IPArray) - 1
$return &= $Tab & " <" & StringUpper($Type) & ">" & @CRLF
$return &= $Tab & " " & xml_makeNode($Type & "_IP", $IPArray[$i][0])
$return &= $Tab & " " & xml_makeNode($Type & "_MASK", $IPArray[$i][1])
$return &= $Tab & " " & xml_makeNode($Type & "_CONTEXT", $IPArray[$i][2])
If $MAC Then $return &= $Tab & " " & xml_makeNode($Type & "_MAC", net_getMACIDFromIP($IPArray[$i][0]))
$return &= $Tab & " </" & StringUpper($Type) & ">" & @CRLF
Next
$return &= $Tab & "</" & StringUpper($Type) & "LIST>" & @CRLF
Return $return
EndFunc ;==>_GetAllIPsXML
Func _GetFirstIPXML($ptr, $Type, $MAC = True, $Indent = 2)
Local $Tab = ""
For $i = 1 To $Indent
$Tab &= @TAB
Next
Local $IPStruct = DllStructCreate($tagIP_ADDR_STRING, $ptr)
Local $return = $Tab & "<" & StringUpper($Type) & ">" & @CRLF
$return &= $Tab & @TAB & xml_makeNode($Type & "_IP", DllStructGetData($IPStruct, "IPAddress"))
$return &= $Tab & @TAB & xml_makeNode($Type & "_MASK", DllStructGetData($IPStruct, "IPMask"))
$return &= $Tab & @TAB & xml_makeNode($Type & "_CONTEXT", DllStructGetData($IPStruct, "Context"))
If $MAC Then $return &= $Tab & @TAB & xml_makeNode($Type & "_MAC", DllStructGetData($IPStruct, "IPAddress"))
$return &= $Tab & "</" & StringUpper($Type) & ">" & @CRLF
Return $return
EndFunc ;==>_GetFirstIPXML
Func _GetAllIps($ptr)
Local $IPStruct, $Index = 0
Local $IPArray[1][3]
Do
ReDim $IPArray[$Index + 1][3]
$IPStruct = DllStructCreate($tagIP_ADDR_STRING, $ptr)
$IPArray[$Index][0] = DllStructGetData($IPStruct, "IPAddress")
$IPArray[$Index][1] = DllStructGetData($IPStruct, "IPMask")
$IPArray[$Index][2] = DllStructGetData($IPStruct, "Context")
$ptr = DllStructGetData($IPStruct, "Next")
$Index += 1
Until $ptr = 0
Return $IPArray
EndFunc ;==>_GetAllIps
Func _GetMac(ByRef $tInfo)
Local $BinaryMAC = BinaryMid(DllStructGetData($tInfo, "Address"), 1, DllStructGetData($tInfo, "AddressLength"))
Return StringTrimRight(StringRegExpReplace(StringTrimLeft($BinaryMAC, 2), "([[:xdigit:]]{2})", "$1:"), 1)
EndFunc ;==>_GetMac
Func _GetTime(ByRef $Struct, $Name)
Local $val = DllStructGetData($Struct, $Name)
If @error Then Return xml_makeNode($Name, "")
Return xml_makeNode($Name, _DateAdd('s', $val, "1970/01/01 00:00:00"))
EndFunc ;==>_GetTime
Func net_getMACIDFromIP($ip_addr)
Local $MAC_struct = DllStructCreate("byte[6]")
Local $MAC_size = DllStructCreate("int")
DllStructSetData($MAC_size, 1, 6)
Local $rc = DllCall("Ws2_32.dll", "int", "inet_addr", "str", $ip_addr)
Local $in_addr = $rc[0]
$rc = DllCall("iphlpapi.dll", "int", "SendARP", "int", $in_addr, "int", 0, "ptr", DllStructGetPtr($MAC_struct), "ptr", DllStructGetPtr($MAC_size))
If $rc[0] <> 0 Then Return ""
Local $str = ""
For $i = 1 To 6
If $i > 1 Then $str = $str & ":"
$str &= Hex(DllStructGetData($MAC_struct, 1, $i), 2)
Next
Return $str
EndFunc ;==>net_getMACIDFromIP
Func xml_encode($val)
Return StringReplace(StringReplace(StringReplace($val, "&", "&"), "<", "<"), ">", ">")
EndFunc ;==>xml_encode
Func xml_makeNode($tag, $val)
If StringLen($val) = 0 Then Return "<" & StringUpper($tag) & "></" & StringUpper($tag) & ">" & @CRLF
;~ ConsoleWrite($tag & "=" & $val & @CRLF)
Return "<" & StringUpper($tag) & ">" & xml_encode($val) & "</" & StringUpper($tag) & ">" & @CRLF
EndFunc ;==>xml_makeNode
Func _GetXML(ByRef $Struct, $Name)
Local $val = DllStructGetData($Struct, $Name)
If @error Then Return xml_makeNode($Name, "")
Return xml_makeNode($Name, $val)
EndFunc ;==>_GetXML
#endregion Funktionsdefinitionen
Alles anzeigen
Besten Dank im voraus!
R@iner
PS: Ergänzung: Das x86-Compilat liefert die richtigen Werte auf einem x64-OS, z.B. Win 7 Ultimate.