Ver Mensaje Individual
  #4  
Antiguo 14-07-2011
x_aguilarf x_aguilarf is offline
Miembro
 
Registrado: abr 2006
Posts: 22
Reputación: 0
x_aguilarf Va por buen camino
Esta función te devuelve los recursos de la red :
Código Delphi [-]

type
  PNetResourceArray = ^TNetResourceArray;
  TNetResourceArray = array [0 .. 100] of TNetResource;
  TResourceType = (
    rtAny       = 0,
    rtDisk      = 1,
    rtPrint     = 2,
    rtReserved  = 8,
    rtUnknow    = DWORD($FFFFFFFF)
  );
  TResourceDisplayType = (
    rdGeneric       = $00000000,
    rdDomain        = $00000001,
    rdServer        = $00000002,
    rdShare         = $00000003,
    rdFile          = $00000004,
    rdGroup         = $00000005,
    rdNetwork       = $00000006,
    rdRoot          = $00000007,
    rdShareAdmin    = $00000008,
    rdDirectory     = $00000009,
    rdTree          = $0000000A,
    rdNdsContainer  = $0000000B
  );

function CreateNetResourceList(ResourceType: TResourceType;
  NetResource: PNetResource; out Entries: DWord;
  out List: PNetResourceArray): Boolean;
var
  EnumHandle: THandle;
  BufSize: DWord;
  Res: DWord;
begin
  Result := False;
  List := Nil;
  Entries := 0;
  if WNetOpenEnum(RESOURCE_GLOBALNET, DWord(ResourceType), 0, NetResource, EnumHandle)
    = NO_ERROR then
  begin
    try
      BufSize := $4000; // 16 kByte
      GetMem(List, BufSize);
      try
        repeat
          Entries := DWord(-1);
          FillChar(List^, BufSize, 0);
          Res := WNetEnumResource(EnumHandle, Entries, List, BufSize);
          if Res = ERROR_MORE_DATA then
          begin
            ReAllocMem(List, BufSize);
          end;
        until Res <> ERROR_MORE_DATA;

        Result := Res = NO_ERROR;
        if not Result then
        begin
          FreeMem(List);
          List := Nil;
          Entries := 0;
        end;
      except
        FreeMem(List);
        raise;
      end;
    finally
      WNetCloseEnum(EnumHandle);
    end;
  end;
end;

procedure ScanNetworkResources(ResourceType: TResourceType; DisplayType: TResourceDisplayType);

  procedure ScanLevel(NetResource: PNetResource);
  var
    Entries: DWord;
    NetResourceList: PNetResourceArray;
    i: Integer;
  begin
    if CreateNetResourceList(ResourceType, NetResource, Entries,
      NetResourceList) then
      try
        for i := 0 to Integer(Entries) - 1 do
        begin
          if (DWord(DisplayType) = RESOURCEDISPLAYTYPE_GENERIC) or
            (NetResourceList[i].dwDisplayType = DWord(DisplayType)) then
          begin


            ListBox1.Items.Add(NetResourceList^[i].lpRemoteName);


          end;
          if (NetResourceList[i].dwUsage and RESOURCEUSAGE_CONTAINER) <> 0 then
            ScanLevel(@NetResourceList[i]);
        end;
      finally
        FreeMem(NetResourceList);
      end;
  end;

begin
  ScanLevel(Nil);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  ScanNetworkResources(rtDisk, rdServer);
end;

Podrías aprovechar esta función para detectar si el PC que buscas aparece en esta enumeración.

PD: Espero no haberme olvidado de ninguna parte del código...

Saludos
Responder Con Cita