在98下可以读注册表SOFTWARE\Microsoft\Windows\CurrentVersion\Network\LanMan得到全部的网络共享。在2000下,用户共享保存在SYSTEM\CurrentControlSet\Services\lanmanserver\Shares,因此也可以通过读取这一位置得到用户自己添加的共享文件夹,但C$、D$、Admin$、IPC$等的共享并没有保存在这里,所以没法取到,请高手告知系统共享是保存在注册表的什么地方的,或者还有不通过读取注册表的方法来得到共享文件夹的列表?

解决方案 »

  1.   

    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      StdCtrls;type
      TNetResourceArray = ^TNetResource;   //网络资源类型的数组
      TfrmMain = class(TForm)
        GroupBox1: TGroupBox;
        StaticText1: TStaticText;
        Edit1: TEdit;
        GroupBox2: TGroupBox;
        Button2: TButton;
        Button1: TButton;
        GroupBox3: TGroupBox;
        memResult: TMemo;
        procedure Button1Click(Sender: TObject);
        procedure FormCreate(Sender: TObject);
        procedure Button2Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      frmMain: TfrmMain;implementation{$R *.DFM}Function GetUserResource( UserName : string ; var List : TStringList ) : Boolean;
    Var
      NetResource : TNetResource;
      Buf : Pointer;
      Count,BufSize,Res : DWord;
      Ind : Integer;
      lphEnum : THandle;
      Temp : TNetResourceArray;
    Begin
      Result := False;
      List.Clear;
      FillChar(NetResource, SizeOf(NetResource), 0);  //初始化网络层次信息
      NetResource.lpRemoteName := @UserName[1];       //指定计算机名称
      Res := WNetOpenEnum( RESOURCE_GLOBALNET, RESOURCETYPE_ANY,RESOURCEUSAGE_CONNECTABLE, @NetResource,lphEnum);
       //获取指定计算机的网络资源句柄
     If Res <> NO_ERROR Then exit;                   //执行失败
      While True Do                                  //列举指定工作组的网络资源
       Begin
        Count := $FFFFFFFF;                            //不限资源数目
        BufSize := 8192;                              //缓冲区大小设置为8K
        GetMem(Buf, BufSize);                   //申请内存,用于获取工作组信息
        Res := WNetEnumResource(lphEnum, Count, Pointer(Buf), BufSize);
                                  //获取指定计算机的网络资源名称
      If Res = ERROR_NO_MORE_ITEMS Then break;//资源列举完毕
       If (Res <> NO_ERROR) then Exit;        //执行失败
         Temp := TNetResourceArray(Buf);
        For Ind := 0 to Count - 1 do
         Begin
         List.Add(Temp^.lpRemoteName);
         Inc(Temp);
        End;
     End;
     Res := WNetCloseEnum(lphEnum);          //关闭一次列举
     If Res <> NO_ERROR Then exit;           //执行失败
       Result := True;
       FreeMem(Buf);
    End;   
    procedure TfrmMain.Button1Click(Sender: TObject);
    var
      List:TstringList;
      i:integer;
    begin
    try
      List:=TstringList.Create;
      if GetUserResource(edit1.text,List) then
        if List.count=0 then         //指定计算机下没有找到共享资源
          begin
            memResult.Lines.Add (edit1.text+'下没有找到共享资源!');
          end
       else
         memResult.Lines.Add (edit1.text+'下的所有共享资源如下:');
         for i:=0 to List.Count-1  do
          begin
            memResult.lines.Add (List.strings[i]);
          end;
    finally
       List:=TstringList.Create;     //如有异常则释放分配的资源
    end;
    end;
    procedure TfrmMain.FormCreate(Sender: TObject);
    begin
      memResult.Lines.clear;
    end;procedure TfrmMain.Button2Click(Sender: TObject);
    begin
      frmMain.Close;
    end;end.