The next code uses the windows library mrp.dll (mpr.dll is a module containing functions used to handle communication between the Windows operating system and the installed network providers) and call these functions :
- WNetEnumResource (continues an enumeration of network resources that was started by a call to the WNetOpenEnum function)
- WNetOpenEnum (starts an enumeration of network resources or existing connections)
- WNetCloseEnum (ends a network resource enumeration started by a call to the WNetOpenEnum function)
namespace DelphiPrismNetworkScan; //Author : Rodrigo Ruz. 2009-09-28 //Shine Your crazy Diamond. interface uses System, System.Runtime.InteropServices; type RESOURCE_SCOPE_NET= enum ( RESOURCE_CONNECTED = $00000001, RESOURCE_GLOBALNET = $00000002, RESOURCE_REMEMBERED = $00000003, RESOURCE_RECENT = $00000004, RESOURCE_CONTEXT = $00000005 ); RESOURCE_TYPE_NET = enum ( RESOURCETYPE_ANY = $00000000, RESOURCETYPE_DISK = $00000001, RESOURCETYPE_PRINT = $00000002, RESOURCETYPE_RESERVED = $00000008 ); RESOURCE_USAGE_NET = enum ( RESOURCEUSAGE_CONNECTABLE =$00000001, RESOURCEUSAGE_CONTAINER =$00000002, RESOURCEUSAGE_NOLOCALDEVICE =$00000004, RESOURCEUSAGE_SIBLING =$00000008, RESOURCEUSAGE_ATTACHED =$00000010, RESOURCEUSAGE_ALL =(RESOURCEUSAGE_CONNECTABLE OR RESOURCEUSAGE_CONTAINER OR RESOURCEUSAGE_ATTACHED) ); RESOURCE_DISPLAYTYPE_NET = enum ( RESOURCEDISPLAYTYPE_GENERIC = $00000000, RESOURCEDISPLAYTYPE_DOMAIN = $00000001, RESOURCEDISPLAYTYPE_SERVER = $00000002, RESOURCEDISPLAYTYPE_SHARE = $00000003, RESOURCEDISPLAYTYPE_FILE = $00000004, RESOURCEDISPLAYTYPE_GROUP = $00000005, RESOURCEDISPLAYTYPE_NETWORK = $00000006, RESOURCEDISPLAYTYPE_ROOT = $00000007, RESOURCEDISPLAYTYPE_SHAREADMIN = $00000008, RESOURCEDISPLAYTYPE_DIRECTORY = $00000009, RESOURCEDISPLAYTYPE_TREE = $0000000A, RESOURCEDISPLAYTYPE_NDSCONTAINER = $0000000B ); NETRESOURCE = public record var dwScope : RESOURCE_SCOPE_NET; var dwType : RESOURCE_TYPE_NET; var dwDisplayType : RESOURCE_DISPLAYTYPE_NET; var dwUsage : RESOURCE_USAGE_NET; var [MarshalAs(System.Runtime.InteropServices.UnmanagedType.LPTStr)] lpLocalName : String; var [MarshalAs(System.Runtime.InteropServices.UnmanagedType.LPTStr)] lpRemoteName: String; var [MarshalAs(System.Runtime.InteropServices.UnmanagedType.LPTStr)] lpComment : String; var [MarshalAs(System.Runtime.InteropServices.UnmanagedType.LPTStr)] lpProvider : String; end; ConsoleApp = class public [DllImport("mpr.dll", CharSet:=CharSet.Auto)] class method WNetEnumResource(hEnum: IntPtr; var lpcCount: Integer; lpBuffer: IntPtr; var lpBufferSize: Integer): Integer;external; [DllImport("mpr.dll", CharSet:=CharSet.Auto)] class method WNetOpenEnum( dwScope: RESOURCE_SCOPE_NET; dwType: RESOURCE_TYPE_NET; dwUsage: RESOURCE_USAGE_NET; [MarshalAs(UnmanagedType.AsAny)] [&In()] lpNetResource: Object; out lphEnum: IntPtr): Integer;external; [DllImport("mpr.dll", CharSet:=CharSet.Auto)] class method WNetCloseEnum(hEnum: IntPtr): Integer;external; class method InitScan(Dummy: Object); class method Main; end; implementation class method ConsoleApp.InitScan(Dummy: Object); var iRet : Integer; ptrHandle: IntPtr := new IntPtr(); entries : Integer; buffer : Integer := 16384; nr : NETRESOURCE; ptrBuffer: IntPtr:=Marshal.AllocHGlobal(buffer); begin try //Init the enumeration , you can change the paremeters to filter. iRet := WNetOpenEnum(RESOURCE_SCOPE_NET.RESOURCE_GLOBALNET, RESOURCE_TYPE_NET.RESOURCETYPE_ANY, RESOURCE_USAGE_NET.RESOURCEUSAGE_ALL, Dummy, out ptrHandle); if iRet <> 0 then begin exit; end; while true do //infinite loop Begin entries := -1; buffer := 16384; iRet := WNetEnumResource(ptrHandle, var entries, ptrBuffer, var buffer); //Load the next resource if ((iRet <> 0)) OR ((entries < 1)) then //if fails or non exist any entries then exit begin Break; end; var ptr: Int32 := ptrBuffer.ToInt32(); var i : Int32 :=0; while i< entries do Begin nr := NETRESOURCE(Marshal.PtrToStructure(new IntPtr(ptr), typeOf(NETRESOURCE))); if RESOURCE_USAGE_NET.RESOURCEUSAGE_CONTAINER = (nr.dwUsage and RESOURCE_USAGE_NET.RESOURCEUSAGE_CONTAINER) then //if is a contanier the function scan the resource again. begin InitScan(nr); //recursive call to the function end; ptr :=ptr+ Marshal.SizeOf( nr ); Console.WriteLine("{0}", nr.dwDisplayType.ToString()); Console.WriteLine(" Type ={0}", nr.dwType.ToString()); Console.WriteLine(" Usage ={0}", nr.dwUsage.ToString()); Console.WriteLine(" Scope ={0}", nr.dwScope.ToString()); Console.WriteLine(" LocalName ={0}", nr.lpLocalName); Console.WriteLine(" RemoteName ={0}", nr.lpRemoteName); Console.WriteLine(" Description={0}", nr.lpComment); Console.WriteLine(" Provider ={0}", nr.lpProvider); Console.WriteLine(); inc(i); End; End; except on e: Exception do begin Console.WriteLine('Error ** ' + e.Message + ' ** Trace ' + e.StackTrace) end; end; end; class method ConsoleApp.Main; begin Console.WriteLine('Scannig Network....Wait a moment , be patient please'); Console.WriteLine(); InitScan(nil); Console.WriteLine('Scan Network Finish'); Console.Read(); end; end.
When you run this code you’ll get something like this
Bye.