?
Solved

Network Computer name or IP address

Posted on 2003-03-25
4
Medium Priority
?
532 Views
Last Modified: 2010-04-04
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?
0
Comment
Question by:mbrlaser
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
4 Comments
 
LVL 1

Assisted Solution

by:Munim
Munim earned 210 total points
ID: 8205129
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
 

Author Comment

by:mbrlaser
ID: 8205699
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
 
LVL 21

Assisted Solution

by:ziolko
ziolko earned 210 total points
ID: 8208861
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
 
LVL 14

Accepted Solution

by:
DragonSlayer earned 330 total points
ID: 8208886
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

Featured Post

Free Tool: SSL Checker

Scans your site and returns information about your SSL implementation and certificate. Helpful for debugging and validating your SSL configuration.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

The uses clause is one of those things that just tends to grow and grow. Most of the time this is in the main form, as it's from this form that all others are called. If you have a big application (including many forms), the uses clause in the in…
Introduction I have seen many questions in this Delphi topic area where queries in threads are needed or suggested. I know bumped into a similar need. This article will address some of the concepts when dealing with a multithreaded delphi database…
In this video you will find out how to export Office 365 mailboxes using the built in eDiscovery tool. Bear in mind that although this method might be useful in some cases, using PST files as Office 365 backup is troublesome in a long run (more on t…
In this video, Percona Solution Engineer Rick Golba discuss how (and why) you implement high availability in a database environment. To discuss how Percona Consulting can help with your design and architecture needs for your database and infrastr…
Suggested Courses
Course of the Month13 days, 19 hours left to enroll

801 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question