Want to protect your cyber security and still get fast solutions? Ask a secure question today.Go Premium

x
  • Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 565
  • Last Modified:

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?
0
mbrlaser
Asked:
mbrlaser
3 Solutions
 
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

Featured Post

Free Tool: Path Explorer

An intuitive utility to help find the CSS path to UI elements on a webpage. These paths are used frequently in a variety of front-end development and QA automation tasks.

One of a set of tools we're offering as a way of saying thank you for being a part of the community.

Tackle projects and never again get stuck behind a technical roadblock.
Join Now