Enum network computers

How is possible to enum network computers in code, to maybe treeview or similar control?

Karen
karen021897Asked:
Who is Participating?
 
VSFConnect With a Mentor Commented:
This unit should do it!
Hope this helps!
VSF
www.victory.hpg.com.br

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
 
karen021897Author Commented:
do you have a example of how to use it, a demo project?
if you have please send it to karen@vis.is

Thanks
0
 
DelFreakCommented:
Listening...
0
Upgrade your Question Security!

Your question, your audience. Choose who sees your identity—and your question—with question security.

 
VSFCommented:
ok!
0
 
karen021897Author Commented:
Raise the points up to 200
0
 
ginsonicCommented:
Give me your address to send you a component and demos to do this job

Regards,
Nick aka ginsonic
0
 
karen021897Author Commented:
karen@vis.is

question to VSF
---------------
Do you have this component for D6, i cannot install it into my IDE

Thankx
Karen.
0
 
VSFCommented:
It's not a component at all!
It's only a unit that can be added to your project and used to list some usefull network info!

VSF
www.victory.hpg.com.br
0
 
DelFreakCommented:
VSF can you send it to me too. Thanks!
0
 
karen021897Author Commented:
when i open the demo project's i have the message from Delphi IDE, TNeighborhood class not found
0
 
ginsonicCommented:
Install first the component :)
0
 
DelFreakCommented:
ginsonic can you sendthe project to me too. My e-mail address is delfreak@thedoghousemail.com

VSF can you send me the project. My e-mail address is delfreak@thedoghousemail.com
0
 
VSFCommented:
Sorry, but right now I'm having too much things to at my Uni!
No time to make samples on that code... maybe latter!

Sorry

VSF
0
 
DelFreakCommented:
VSF, can you send me the file? My e-mail address is stated above. Thanks!
0
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.

All Courses

From novice to tech pro — start learning today.