public static ArrayList GetNetworkComputers() { ArrayList networkComputers = new ArrayList(); const int MAX_PREFERRED_LENGTH = -1; int SV_TYPE_WORKSTATION = 1; int SV_TYPE_SERVER = 2; IntPtr buffer = IntPtr.Zero; IntPtr tmpBuffer = IntPtr.Zero; int entriesRead; int totalEntries; int resHandle; int sizeofInfo = Marshal.SizeOf(typeof(ServerInfo100)); try { int ret = NetServerEnum(null, 100, ref buffer, MAX_PREFERRED_LENGTH, out entriesRead, out totalEntries, SV_TYPE_WORKSTATION | SV_TYPE_SERVER, null, out resHandle); if (ret == 0) { for (int i = 0; i < totalEntries; i++) { tmpBuffer = new IntPtr((long)buffer + (i * sizeofInfo)); ServerInfo100 svrInfo = (ServerInfo100) Marshal.PtrToStructure(tmpBuffer, typeof(ServerInfo100)); networkComputers.Add(svrInfo.sv100_name); } } } catch (Exception ex) { return(null); } finally { NetApiBufferFree(buffer); } return(networkComputers); }
/// <summary> /// Uses the DllImport : NetServerEnum with all its required parameters /// (see http://msdn.microsoft.com/library/default.asp?url=/library/en-us/netmgmt/netmgmt/netserverenum.asp /// for full details or method signature) to retrieve a list of domain SV_TYPE_WORKSTATION /// and SV_TYPE_SERVER PC's /// </summary> /// <returns>Arraylist that represents all the SV_TYPE_WORKSTATION and SV_TYPE_SERVER /// PC's in the Domain</returns> public ArrayList GetNetworkComputers() { //local fields ArrayList networkComputers = new ArrayList(); const int MaxPreferredLength = -1; int sVTypeWorkstation = 1; int sVTypeServer = 2; IntPtr buffer = IntPtr.Zero; IntPtr tmpBuffer = IntPtr.Zero; int entriesRead = 0; int totalEntries = 0; int resHandle = 0; int sizeofInfo = Marshal.SizeOf(typeof(ServerInfo100)); try { //call the DllImport : NetServerEnum with all its required parameters //see http://msdn.microsoft.com/library/default.asp?url=/library/en-us/netmgmt/netmgmt/netserverenum.asp //for full details of method signature int ret = NetServerEnum(null, 100, ref buffer, MaxPreferredLength, out entriesRead, out totalEntries, sVTypeWorkstation | sVTypeServer, null, out resHandle); //if the returned with a NERR_Success (C++ term), =0 for C# if (ret == 0) { //loop through all SV_TYPE_WORKSTATION and SV_TYPE_SERVER PC's for (int i = 0; i < totalEntries; i++) { //get pointer to, Pointer to the buffer that received the data from //the call to NetServerEnum. Must ensure to use correct size of //STRUCTURE to ensure correct location in memory is pointed to tmpBuffer = new IntPtr((int)buffer + (i * sizeofInfo)); //Have now got a pointer to the list of SV_TYPE_WORKSTATION and //SV_TYPE_SERVER PC's, which is unmanaged memory //Needs to Marshal data from an unmanaged block of memory to a //managed object, again using STRUCTURE to ensure the correct data //is marshalled ServerInfo100 svrInfo = (ServerInfo100) Marshal.PtrToStructure(tmpBuffer, typeof(ServerInfo100)); //add the PC names to the ArrayList networkComputers.Add(svrInfo.Sv100Name); } } } catch (Exception ex) { MessageBox.Show("Problem with acessing network computers in NetworkBrowser " + "\r\n\r\n\r\n" + ex.Message, "Error", MessageBoxButton.OK, MessageBoxImage.Error); return(null); } finally { //The NetApiBufferFree function frees //the memory that the NetApiBufferAllocate function allocates NetApiBufferFree(buffer); } //return entries found return(networkComputers); }