如何用編程實現把本機的所有文件共享,有讀寫權限,連接時需要密碼?(系統98)

解决方案 »

  1.   

    参考:共享/删除共享可以直接调用标准的Win32API函数 NetShareAdd()和NetShareDel()。 
                建立共享目录函数:Function NetShareAdd(servername:PChar; 
                level:SmallInt;buf:Pointer; 
                buf_len:SmallInt):SmallInt;far;stdcall;external 'svrapi.dll'; 
                撤销共享目录函数:Function NetShareDel(servername:PChar;buf:Pointer; 
                reserved:SmallInt):SmallInt;far;stdcall;external 'svrapi.dll'; 
                这里再提供两个关于连接共享目录/撤销共享目录函数WnetAddConnection和WnetCancelConnection。 
                关于映射网络驱动器的方法如下: 
                WNetAddConnection(%共享目录名%,%口令%,'X:'); //映射X盘 
                WNetCancelConnection('X:',True); //撤销X盘映射 
                关于建立/撤消共享的函数返回变量说明如下: 
                const NETNAME_LEN = 13;PASSWORD_LEN = 9;SHI50F_RDONLY = $0001; 
                SHI50F_FULL = $0002;SHI50F_DEPENDSON = $0003; 
                SHI50F_ACCESSMASK = $0003;SHI50F_PERSIST = $0100; 
                SHI50F_SYSTEM = $0200;STYPE_DISKTREE = 0; 
                STYPE_PRINTQ = 1;STYPE_DEVICE = 2; 
                STYPE_IPC = 3;NERR_Success = 0; 
                NERR_BASE = 2100; //常量说明 
                NERR_UnKnownDevDir=(NERR_BASE+16);NERR_UnknownServer=(NERR_BASE+3); 
                NERR_ServerNotStarted=(NERR_BASE+14);NERR_RedirectedPath=(NERR_BASE+17);             NERR_DuplicateShare=(NERR_BASE+18);NERR_BufTooSmalll=(NERR_BASE+23); 
                //NetShareAdd返回错误 
                NERR_NetNotStarted = (NERR_BASE+2); 
                NERR_ServerNotStarted = (NERR_BASE+14); 
                NERR_NetNameNotFound = (NERR_BASE+210); 
                NERR_ShareNotFound = (NERR_BASE+292); //NetShareDel返回错误 
                SHARE_INFO_50=Record 
                netname:array [0..NETNAME_LEN-1] of Char; 
                sharetype:ShortInt; 
                flags:SmallInt; 
                re:PChar; 
                path:PChar; 
                rw_password:array [0..PASSWORD_LEN-1] of Char; 
                ro_password:array [0..PASSWORD_LEN-1] of Char; 
                End; //以上为类型定义 
                再有就是关于Window9X共享目录口令问题(其实屏保口令也是同样保存的),口令(原始为十六进制字符)
                在注册表位置Y_LOCAL_MACHINE\SOFTWARE\micorsoft\windows\current_version\network\lanman\共
                享文件夹名\Parm1enc和Parm2enc两位置,Parm1enc为对应的是完全共享密码,Parm2enc对应的是只读共
                享密码。字符与数列(前八个数是35,9A,4D,A6,53,A9,D4,6A)作异或运算即得密码的二进制ASCII码,转换
                后可得到密码。             另外提供一个比较幼稚但可行的方案(在注册表做动作): 
                var reg : TRegistry; name : String; //s是在网上邻居里的文件夹名 
                begin 
                name := 'DirName';//建立一个只读,无密码共享目录 
                reg := TRegistry.Create; 
                reg.RootKey := HKEY_LOCAL_MACHINE; 
                reg.OpenKey('Software\Microsoft\Windows\CurrentVersion\Network\LanMan\'+name,true 
                ); 
                reg.WriteInteger( 'Flags', 401 ) ; //权限:401代表为访问,258为完全访问,259为密码访问 
                reg.WriteInteger( 'Parm1enc', 0 ) ; //参数2,放置完全访问密码,已加密 
                reg.WriteInteger( 'Parm2enc', 0 ) ; //参数2,放置只读访问密码,已加密 
                reg.WriteString( 'Path', 'C:\MYDIR' ) ; //放置要共享的目录的绝对路径 
                reg.WriteString( 'Re', '' ) ; 
                reg.WriteInteger( 'Type', 0 ) ; 
                end; 
                这样的缺点就是要重启系统,可以ExitWindowsEx( EWX_FORCE and EWX_SHUTDOWN , 0 )来重启。 
                此外你还可以使用控件File Sharing 
                95/98,该控件包含了几个方便的function:ShareResource、DeleteShare、GetShareInfo、
                SetShareInfo、GetNetErrorString等。             附:关于NetUserAdd等相关API 
                WNetCloseEnum 结束网络资源列表 
                WNetConnectionDialog 开始网络连接对话框 
                WNetDisconnectDialog 断开网络对话框 
                WNetEnumResource 继续列表网络资源 
                WNetGetConnection 获取网络资源名 
                WNetGetLastError 返回网络函数最近错误 
                WNetGetUser 获取当前网络用户名 
                WNetOpenEnum 列出网络资源 
      

  2.   

    附送:搜索共享资源代码。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 TForm1.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 
            memo1.Lines.Add (edit1.text+'下没有找到共享资源!'); 
          end 
      else 
        memo1.Lines.Add (edit1.text+'下的所有共享资源如下:'); 
        for i:=0 to List.Count-1  do 
          begin 
            Memo1.lines.Add (List.strings[i]); 
          end; 
    finally 
      List:=TstringList.Create;    //如有异常则释放分配的资源 
    end; 
    end;
      

  3.   

    WNetAddConnection(%user%,%123456%,'c:'); 
    編譯時提示:
    [Error] Unit1.pas(95): Illegal character in input file: '%' ($25)
    [Error] Unit1.pas(95): Illegal character in input file: '%' ($25)
    請問如何解決呢?
    如果我的硬盤有多個分區,c:,d:,e:.....怎樣一次過讓他們全部共享?
      

  4.   

    我試過通過編程修改註冊表[HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Network\LanMan\C]
    "Flags"=dword:00000191
    "Type"=dword:00000000
    "Path"="C:\\"
    "Parm2enc"=hex:04,ab,7f,97,62
    "Parm1enc"=hex:
    "Re"=""
    但不行,請問我還需要做什麼?