Network Computer name or IP address

I need to obtain a list or array with the name orIP address of then computer connected to the network, with the purpose of selecting one of them to transmit a message. That control or procedure can use?
mbrlaserAsked:
Who is Participating?
I wear a lot of hats...

"The solutions and answers provided on Experts Exchange have been extremely helpful to me over the last few years. I wear a lot of hats - Developer, Database Administrator, Help Desk, etc., so I know a lot of things but not a lot about one thing. Experts Exchange gives me answers from people who do know a lot about one thing, in a easy to use platform." -Todd S.

MunimCommented:
Are you looking for the DNS Server???
If you are, then is code is for you.

--begin of code--
  uses
    WinSock, SysUtils, Windows, IpHlpApi, IpTypes;

  function GetCurrentDNSServer: string;
  var
    PFixed: PFixedInfo;
    PDnsServer: PIpAddrString;
    OutBufLen: ULONG;

    RegKey: HKEY;
    Res: Longword;
    szNameServer: array[0..80] of Char;
    dwBufLen: DWORD;
  begin
    Result := '';
    PFixed := nil;
    OutBufLen := 0;
    Res := GetNetworkParams(PFixed, OutBufLen);
    if Res=ERROR_BUFFER_OVERFLOW then begin
      GetMem(PFixed, OutBufLen);
//  Caller must free this buffer when it is no longer used
      FillChar(PFixed^, OutBufLen, #00);
      Res := GetNetworkParams(PFixed, OutBufLen);
    end;
    if (PFixed <> nil) and (Res = 0) then begin
      with PFixed^ do
        if CurrentDnsServer <> nil then begin
          Result := CurrentDnsServer^.IpAddress.String0;
        end else begin
//          Result := DnsServerList.IpAddress.String0;
     Result := DnsServerList.IpAddress.String0;
     PDnsServer := DnsServerList.Next;
     while PDnsServer<>Nil do begin
       Result := PDnsServer^.IpAddress.String0;
       PDnsServer := PDnsServer.Next;
     end;
        end;
    end;

    if Result = '' then begin
      Res := RegOpenKeyEx(HKEY_LOCAL_MACHINE, ServicesTcpipParameters, 0,
KEY_READ, RegKey);
      if Res = ERROR_SUCCESS then begin
        ZeroMemory(@szNameServer, 81);
        dwBufLen := 80;
        Res := RegQueryValueEx(RegKey, 'NameServer', nil, nil, @szNameServer,
@dwBufLen);
        if (Res = ERROR_SUCCESS) and (szNameServer <> '') then begin
          Result := szNameServer;
        end else begin
          Res := RegOpenKeyEx(HKEY_LOCAL_MACHINE, ServicesTcpipParameters +
Transient, 0, KEY_READ, RegKey);
          if Res = ERROR_SUCCESS then begin
            ZeroMemory(@szNameServer, 81);
            dwBufLen := 80;
            Res := RegQueryValueEx(RegKey, 'NameServer', nil, nil,
@szNameServer, @dwBufLen);
            if (Res = ERROR_SUCCESS) and (szNameServer <> '') then begin
              Result := szNameServer;
            end;
          end;
        end;
      end;
      end;
    if Pos(' ', Result) <> 0 then Result := Copy(Result, 1, Pos(' ', Result) -
1);
    if Result = '' then Result := 'localhost';
  end;
--end of code--
0
mbrlaserAuthor Commented:
Not exactly, I Have a small office network (microsoft) and I want from any connected computer to the net to be able to see a list from the connected computers (address or computername).
0
ziolkoCommented:
this is part of my WinPing utility:
_HostName: string;
_Address: DWORD;
_HostIP: string;
_Phe: PHostEnt

    _Address := inet_addr(PChar(_HostName));
    if (_Address = INADDR_NONE) then
      begin
        _Phe := GetHostByName(PChar(_HostName));
        _Address := longint(plongint(_Phe^.h_addr_list^)^);
        _HostName := _Phe^.h_name;
        _HostIP := StrPas(inet_ntoa(TInAddr(_Address)));
      end;
    else
      begin
        _Phe := GetHostByAddr(@_Address, 4, AF_INET);
        if _Phe = Nil then
          _HostName := 'Name unavailable'
        else
          _HostName := _Phe^.h_name;
      end;
      _HostIP := StrPas(inet_ntoa(TInAddr(_Address)));
    end;
  end;

ziolko.
0
DragonSlayerCommented:
something like this?

unit Unit2;

interface

uses
 classes,sysutils,windows,Forms,Dialogs,FileCtrl;

type
 TenEnumKind  = (ekNetwork,ekDomain,ekServer,ekShare);
const
 kasEnumKind  : array[TenEnumKind] of string[20] =
                         (
                           'Network',
                           'Domain',
                           'Server',
                           'Share'
                           );

procedure EnumNetRes(aScope,aType,aUsage : integer; prNetRes :
PNetResource; sl : TStringList; ek : TenEnumKind);
procedure GetDomainList(const sNetwork : string; sl : TStringList);
procedure GetNetworkList(sl : TStringList);
procedure GetExtendedError(iWinErr : integer);
procedure GetServerList(const sDomain,sNetwork : string; sl :
TStringList);

function GetItAll(Target:String):String;

implementation

function GetItAll(Target:String):String;
  function TakeOutSemiAndAddSlash(InVal:String):String;
  var F:Integer;
  begin
       Result:='';
       For F:= 1 to Length(InVal) do
           begin
               if InVal[F]<>':' then
                  Result:=Result+(InVal[F]);
           end;
       Result:='\'+Result;
  end;
Var
 AllNetwork,
 AllDomains,
 AllServers:TStringList;
 I,J,K:Integer;
 NetworkName,DomainName,Servername:String;
begin
 Result:='';
 AllNetwork:=TStringList.Create;
 GetNetworkList(AllNetwork);
 For I:=0 to AllNetwork.Count-1 do
     begin
          NetworkName:=(AllNetwork[i]);
          {ShowMessage('Looking into the ['+NetworkName+'] Network'); }
          AllDomains:=TStringList.Create;
          Application.Processmessages;
          GetDomainList(NetworkName,AllDomains);
          For J:=0 to AllDomains.Count-1 do
              begin
                   DomainName:=(AllDomains[i]);
                   {ShowMessage('Looking at the '+DomainName+' domain');
}
                   AllServers:=TStringList.Create;
                   GetServerList(DomainName,NetworkName,AllServers);
                   For K:=0 to AllServers.Count-1 do
                       begin
                            Servername:=(AllServers[k]);
                            {ShowMessage('Looking at the '+Servername+'
server');}
                            if DirectoryExists
                               (
                               Servername+TakeOutSemiAndAddSlash
                               (
                               ExtractFilePath(Application.ExeName)
                               )
                               ) then
                                 begin
                                      Result:=Servername+Target;
                                      {ShowMessage('Found: '+Result); }
                                      AllServers.Free;
                                      AllDomains.Free;
                                      AllNetwork.Free;
                                      Exit;
                                 end;
                       end;
                   AllServers.Free;
              end;
          AllDomains.Free;
     end;
 AllNetwork.Free;
end;

procedure GetNetworkList(sl : TStringList);
begin
 if sl = nil then exit;
 sl.BeginUpdate;
 try
   sl.Clear;

EnumNetRes(RESOURCE_GLOBALNET,RESOURCETYPE_ANY,RESOURCEUSAGE_CONTAINER,nil,sl,ekNetwork);   finally
   sl.EndUpdate;
 end;
end;


procedure GetDomainList(const sNetwork : string; sl : TStringList);
var
 rNetRes          : PNetResource;
begin
 if sl = nil then exit;
 sl.BeginUpdate;
   sl.Clear;
   New(rNetRes);
   { Start here }
   with rNetRes^ do begin
     dwScope := RESOURCE_GLOBALNET;
     dwType := RESOURCETYPE_ANY ;
     dwDisplayType := RESOURCEDISPLAYTYPE_GENERIC;
     dwUsage := RESOURCEUSAGE_CONNECTABLE;
     lpLocalName := nil;
     lpRemoteName := 0;
     lpComment := nil;
     lpProvider := pChar(sNetwork);
   end;

EnumNetRes(RESOURCE_GLOBALNET,RESOURCETYPE_ANY,RESOURCEDISPLAYTYPE_GENERIC,rNetRes,sl,ekDomain);
   sl.EndUpdate;
   Dispose(rNetRes);
end;



procedure GetServerList(const sDomain,sNetwork : string; sl :
TStringList);
var
 rNetRes          : PNetResource;
begin
 if sl = nil then exit;
 sl.BeginUpdate;
   sl.Clear;
   New(rNetRes);
   with rNetRes^ do begin
     dwScope := RESOURCE_GLOBALNET;
     dwType := RESOURCETYPE_ANY;
     dwDisplayType := RESOURCEDISPLAYTYPE_SERVER;
     dwUsage := RESOURCEUSAGE_CONNECTABLE;
     lpLocalName := nil;
     lpRemoteName := pChar(sDomain);
     lpComment := nil;
     lpProvider := pChar(sNetwork);
   end;


EnumNetRes(RESOURCE_GLOBALNET,RESOURCETYPE_ANY,RESOURCEDISPLAYTYPE_SERVER,rNetRes,sl,ekServer);
   Dispose(rNetRes);
   sl.EndUpdate;
end;



procedure EnumNetRes(aScope,aType,aUsage : integer; prNetRes :
PNetResource; sl : TStringList; ek : TenEnumKind);
const
 kiNetResCount = 1024;
type
 TarNetRes  = array[0..pred(kiNetResCount)] of TNetResource;

 procedure FillEntries(arNetRes : TarNetRes; iCount : integer);   var
   i      : integer;
   Thething:String;
 begin
   for i := 0 to pred(iCount) do begin
     TheThing:=arNetRes[i].lpRemoteName;
     if sl<>Nil then
        begin
             Try
             sl.Add(TheThing);
             Except
             End;
        end;
   end;  // for  i
 end;
 procedure DoEnum(hEnum : THandle);
 var
   iWinErr           :  integer;
   arNetRes          :  TarNetRes;
   iCount            :  DWORD;
   dwBufSize         :  DWord;
 begin
   iCount := 20;
   fillchar(arNetRes,sizeof(arNetRes),0);
   dwBufSize := SizeOf(arNetRes);
   iWinErr := WNetEnumResource( hEnum,
                               iCount,
                               @arNetRes[0],
                               dwBufSize);
   case iWinErr of
     No_Error                  : FillEntries(arNetRes,iCount);
     ERROR_NO_MORE_ITEMS,
     ERROR_INVALID_PARAMETER  : ;
     ERROR_ACCESS_DENIED      : sl.Add('Access denied');
     else GetExtendedError(iWinErr);
   end; // case
 end;

var
 iWinErr          : Integer;
 hEnum            : THandle;
begin
 iWinErr := WNetOpenEnum(aScope,aType,aUsage,prNetRes,hEnum);
 try
   case iWinErr of
     NO_ERROR                  : DoEnum(hEnum);
     ERROR_NO_MORE_ITEMS,
     ERROR_INVALID_PARAMETER  : ;
     ERROR_ACCESS_DENIED      : sl.Add('Access denied');
   end;  // case
   if iWinErr=ERROR_EXTENDED_ERROR then GetExtendedError(iWinErr);
 finally
   WNetCloseEnum(hEnum);
 end;
end;

procedure GetExtendedError(iWinErr : integer);
const
 kiDesc      = 255;
 kiProvider  = 255;
var
 iNetErr      : DWORD;
 zDesc        : array[0..255] of char;
 zProvider    : array[0..255] of char;
 sDesc        : String;
 sProvider    : string;
begin
 setLength(sDesc,kiDesc);
 SetLength(sProvider,kiProvider);
 WNetGetLastError(iNetErr,zDesc,kiDesc,zProvider,kiProvider);
 sDesc := StrPas(zDesc);
 sProvider := StrPas(zProvider);
 Showmessage(sDesc);
end;

end.
0

Experts Exchange Solution brought to you by

Your issues matter to us.

Facing a tech roadblock? Get the help and guidance you need from experienced professionals who care. Ask your question anytime, anywhere, with no hassle.

Start your 7-day free trial
It's more than this solution.Get answers and train to solve all your tech problems - anytime, anywhere.Try it for free Edge Out The Competitionfor your dream job with proven skills and certifications.Get started today Stand Outas the employee with proven skills.Start learning today for free Move Your Career Forwardwith certification training in the latest technologies.Start your trial today
Delphi

From novice to tech pro — start learning today.

Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.