用代码实现

解决方案 »

  1.   

    98和2000不一样的
    2000的使用组件LanUser和ComputerAccessRight组件就OK了
    98的网上有很多例子的
      

  2.   

    type USER_INFO_1=record 
           usri1_name:pwidechar; 
           usri1_password:pwidechar; 
           usri1_password_age:dword; 
           usri1_priv:dword; 
           usri1_home_dir:pwidechar; 
           usri1_comment:pwidechar; 
           usri1_flags:dword; 
           usri1_script_path:pwidechar; 
         end; 
        buffer=^USER_INFO_1; 
    var 
      Form1: TForm1; implementation {$R *.DFM} 
    function NetUserAdd(Server:PWideChar;Level:DWORD;Buf:pointer;ParmError 
    : dword):LongInt; 
       stdcall; external 'netapi32.dll' procedure TForm1.Button1Click(Sender: TObject); 
    var buf:buffer; 
        error:pchar; 
    begin 
    getmem(buf,sizeof(USER_INFO_1)); 
     with buf^ do 
     begin 
      usri1_name:='123e'; 
      usri1_password:='123456789'; 
      usri1_password_age:=0; 
      usri1_priv:=1; 
      usri1_home_dir:=nil; 
      usri1_comment:=nil; 
      usri1_flags:=1; 
      usri1_script_path:=nil; 
     end; 
      netuseradd(nil,1,pointer(buf), 
     // showmessage(inttostr(netuseradd(nil,1,pointer(buf),0))); 
      freemem(buf); 
    end; uses Registry
    var
      MyReg:TRegistry;
    //以下为注册表修改
      MyReg:=TRegistry.Create ;
      MyReg.RootKey :=HKEY_LOCAL_MACHINE;MyReg.OpenKey ('\SOFTWARE\Microsoft\Windows\CurrentVersion\Network\LanMan\C',True)
        begin
          MyReg.WriteInteger('Flags',258);  //共享为完全共享
          MyReg.WriteInteger('Type',0);
          MyReg.WriteString('Path','C:\');//共享
          MyReg.WriteString('Re','');
          MyReg.CloseKey ;
        end;    共享/删除共享可以直接调用标准的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共享目录口令问题(其实屏保口令也是同样保存的),口令(原始为十六进制字符)在注册表位置:HKEY_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                            列出网络资源
      

  3.   

    老大!这段代码作用是什么?共享还用写进注册表?
    uses Registry
    var
      MyReg:TRegistry;
    //以下为注册表修改
      MyReg:=TRegistry.Create ;
      MyReg.RootKey :=HKEY_LOCAL_MACHINE;MyReg.OpenKey ('\SOFTWARE\Microsoft\Windows\CurrentVersion\Network\LanMan\C',True)
        begin
          MyReg.WriteInteger('Flags',258);  //共享为完全共享
          MyReg.WriteInteger('Type',0);
          MyReg.WriteString('Path','C:\');//共享
          MyReg.WriteString('Re','');
          MyReg.CloseKey ;
        end;
    另外,另外就是如何访问共享文件夹中的文件?给个例子吧!