emeriks
Goto Top

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.

<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

Content-Key: 290082

Url: https://administrator.de/contentid/290082

Printed on: April 20, 2024 at 01:04 o'clock

Member: emeriks
emeriks Dec 05, 2015 at 20:11:42 (UTC)
Goto Top
Hat sich erledigt.