VB.Net und DHCP Server Management API
Hallo,
ich versuche unter VB.Net 2012 einen DHCP-Server remote abzufragen (Windows 2008 R2 SP1). Dazu verwende ich die DHCP Server Management API
Da die API (natürlich) nur in C++ dokumentiert ist, ich mich aber nur mit VB auskenne, liegt mein Hauptproblem darin, das Ganze in VB.Net zu übersetzen. Bei einigen Sachen, z. B. Abfrage der Scopes, gelingt mir das ohne Problem, bei anderen schaffe ich es einfach nicht.
Abfrage der Leasen/Reservierungen eine Scopes
-> siehe Code
DhcpEnumSubnetClientsV4 liefert mir noch 0 (ERROR_SUCCESS)
µRead und µTotal sind dann 30, was genau der Anzahl der aktuellen Leasen dieses Scopes entspricht
Die "Umwandlung" in DHCP_CLIENT_INFO_ARRAY_V4 funktioniert auch noch. NumElements ist da auch 30.
Beim "Umwandeln" in DHCP_CLIENT_INFO_V4 fliegt mir der Code nach 2 bis 4 Elementen (je nachdem, welches Scope ich abfrage) in der Zeile mit dem "Marshal.PtrToStructure" ab. Ich kann das noch nicht mal mit Try-Catch abfangen.
FatalExecutionEngineError wurde erkannt.
Message: Die Laufzeit hat einen schwerwiegenden Fehler entdeckt. Fehleradresse: "0xf4696cfb" in Thread "0x2a10". Fehlercode: 0xc0000005. Bei diesem Fehler könnte es sich um ein Problem in der CLR oder in den unsicheren oder nicht verifizierbaren Teilen des Benutzercodes handeln. Übliche Ursachen dieses Bugs sind Marshallerfehler für COM-Interop oder PInvoke, die den Stapel beschädigen können.
Was mache ich falsch?
Emeriks
Edit: noch ein paar fehlende Structures hinzugefügt
Edit 2:
Habe das auch mal mit meinen bescheidenen Kenntnissen in C# abgebildet. Dort kommt der selbe Fehler 0xc0000005.
ich versuche unter VB.Net 2012 einen DHCP-Server remote abzufragen (Windows 2008 R2 SP1). Dazu verwende ich die DHCP Server Management API
Da die API (natürlich) nur in C++ dokumentiert ist, ich mich aber nur mit VB auskenne, liegt mein Hauptproblem darin, das Ganze in VB.Net zu übersetzen. Bei einigen Sachen, z. B. Abfrage der Scopes, gelingt mir das ohne Problem, bei anderen schaffe ich es einfach nicht.
Abfrage der Leasen/Reservierungen eine Scopes
-> siehe Code
DhcpEnumSubnetClientsV4 liefert mir noch 0 (ERROR_SUCCESS)
µRead und µTotal sind dann 30, was genau der Anzahl der aktuellen Leasen dieses Scopes entspricht
Die "Umwandlung" in DHCP_CLIENT_INFO_ARRAY_V4 funktioniert auch noch. NumElements ist da auch 30.
Beim "Umwandeln" in DHCP_CLIENT_INFO_V4 fliegt mir der Code nach 2 bis 4 Elementen (je nachdem, welches Scope ich abfrage) in der Zeile mit dem "Marshal.PtrToStructure" ab. Ich kann das noch nicht mal mit Try-Catch abfangen.
FatalExecutionEngineError wurde erkannt.
Message: Die Laufzeit hat einen schwerwiegenden Fehler entdeckt. Fehleradresse: "0xf4696cfb" in Thread "0x2a10". Fehlercode: 0xc0000005. Bei diesem Fehler könnte es sich um ein Problem in der CLR oder in den unsicheren oder nicht verifizierbaren Teilen des Benutzercodes handeln. Übliche Ursachen dieses Bugs sind Marshallerfehler für COM-Interop oder PInvoke, die den Stapel beschädigen können.
Was mache ich falsch?
Emeriks
Edit: noch ein paar fehlende Structures hinzugefügt
Edit 2:
Habe das auch mal mit meinen bescheidenen Kenntnissen in C# abgebildet. Dort kommt der selbe Fehler 0xc0000005.
<StructLayout(LayoutKind.Sequential)>
Friend Structure DHCP_BINARY_DATA
Dim DataLength As UInteger
Dim Data As IntPtr 'Byte
End Structure
<StructLayout(LayoutKind.Sequential)>
Friend Structure DATE_TIME
Dim dwLowDateTime As UInteger
Dim dwHighDateTime As UInteger
End Structure
<StructLayout(LayoutKind.Sequential)>
Friend Structure DHCP_HOST_INFO
Dim IpAddress As UInteger
<MarshalAs(UnmanagedType.LPWStr)> Dim NetBiosName As String
<MarshalAs(UnmanagedType.LPWStr)> Dim HostName As String
End Structure
<StructLayout(LayoutKind.Sequential)> _
Friend Structure DHCP_CLIENT_INFO_ARRAY_V4
Dim NumElements As UInteger
Dim Clients As IntPtr 'DHCP_CLIENT_INFO_V4()
End Structure
<StructLayout(LayoutKind.Sequential)>
Friend Structure DHCP_CLIENT_INFO_V4
Dim ClientIpAddress As UInteger
Dim SubnetMask As UInteger
Dim ClientHardwareAddress As DHCP_BINARY_DATA
<MarshalAs(UnmanagedType.LPWStr)> Dim ClientName As String
<MarshalAs(UnmanagedType.LPWStr)> Dim ClientComment As String
Dim ClientLeaseExpires As DATE_TIME
Dim OwnerHost As DHCP_HOST_INFO
Dim bClientType As Byte
End Structure
<DllImport("dhcpsapi.dll", EntryPoint:="DhcpEnumSubnetClientsV4")> _
Friend Function DhcpEnumSubnetClientsV4(<InAttribute(), MarshalAs(UnmanagedType.LPWStr)> ByVal ServerIpAddress As String, _
<InAttribute()> ByVal SubnetAddress As UInteger, _
<OutAttribute()> ByRef ResumeHandle As UInteger, _
<InAttribute()> ByVal PreferredMaximum As UInteger, _
<OutAttribute()> ByRef ClientInfoArray As IntPtr, _
<OutAttribute()> ByRef ClientsRead As UInteger, _
<OutAttribute()> ByRef ClientsTotal As UInteger) As UInteger
'DWORD DHCP_API_FUNCTION DhcpEnumSubnetClientsV4(
' _In_ DHCP_CONST WCHAR *ServerIpAddress,
' _In_ DHCP_IP_ADDRESS SubnetAddress,
' _Inout_ DHCP_RESUME_HANDLE *ResumeHandle,
' _In_ DWORD PreferredMaximum,
' _Out_ LPDHCP_CLIENT_INFO_ARRAY_V4 *ClientInfo,
' _Out_ DWORD *ClientsRead,
' _Out_ DWORD *ClientsTotal
');
End Function
Friend Function StringIPAddressToUInt32(Address As String) As UInteger
Dim µAddress As IPAddress = System.Net.IPAddress.Parse(Address)
Dim µAddressBytes As Byte() = µAddress.GetAddressBytes()
Dim µReturnValue As UInteger = CUInt(µAddressBytes(0)) << 24
µReturnValue += CUInt(µAddressBytes(1)) << 16
µReturnValue += CUInt(µAddressBytes(2)) << 8
µReturnValue += CUInt(µAddressBytes(3))
Return µReturnValue
End Function
Public Sub Main
Dim µResumeHandle As UInteger = 0
Dim µPointer As IntPtr = IntPtr.Zero
Dim µRead As UInteger = 0
Dim µTotal As UInteger = 0
Dim µDhcpServer As String = "10.31.0.10"
Dim µScopeAddress As UInteger = StringIPAddressToUInt32("10.31.0.0")
Dim µApiReturn As Integer = DhcpEnumSubnetClientsV4(µDhcpServer, µScopeAddress, µResumeHandle, UInteger.MaxValue, µPointer, µRead, µTotal)
If µApiReturn = 0 Then
'Pointer, welcher von DhcpEnumSubnetClientsV4 geliefert wurde, in DHCP_CLIENT_INFO_ARRAY_V4 "umwandeln"
Dim µCIA As DHCP_CLIENT_INFO_ARRAY_V4 = CType(Marshal.PtrToStructure(µPointer, GetType(DHCP_CLIENT_INFO_ARRAY_V4)), DHCP_CLIENT_INFO_ARRAY_V4)
'den Pointer, welcher in DHCP_CLIENT_INFO_ARRAY_V4 enthalten ist, in eine Liste von DHCP_CLIENT_INFO_V4 "umwandeln"
Dim µCIs As New List(Of DHCP_CLIENT_INFO_V4)
'die Datenlänge pro Element
Dim µDataSize As Integer = Marshal.SizeOf(New DHCP_CLIENT_INFO_V4)
'der Pointer auf das aktuielle Element
Dim µCurrentPointer As Int64 = µCIA.Clients.ToInt64
'Schleife für DHCP_CLIENT_INFO_ARRAY_V4.NumElements
For µElement As Integer = 1 To µCIA.NumElements
'aktuellen Pointer (µCurrentPointer) in DHCP_CLIENT_INFO_V4 "umwandeln"
Dim µObject As DHCP_CLIENT_INFO_V4 = CType(Marshal.PtrToStructure(New IntPtr(µCurrentPointer), GetType(DHCP_CLIENT_INFO_V4)), DHCP_CLIENT_INFO_V4)
'Element der Liste hinzufügen
µCIs.Add(µObject)
'aktuellen Pointer um die Datenlänge eines Elements versetzen
µCurrentPointer += µDataSize
Next
Else
MsgBox(µApiReturn)
End If
End Sub
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 290082
Url: https://administrator.de/forum/vb-net-und-dhcp-server-management-api-290082.html
Ausgedruckt am: 04.04.2025 um 08:04 Uhr
1 Kommentar