在已经知道用户名和密码的情况下,如何共享网络中的windows 2000 计算机内的一个文件夹?急用!谢谢各位!小弟给200分!

解决方案 »

  1.   

    转贴
    //以前写的
    关于WIN98下共享文件夹问题
        经常看到有人问起如何在程序中增加和删除共享文件夹,于是就尽可能把相关信息写出来,更深入答案还请大虾共同讨论。
        共享/删除共享可以直接调用标准的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
      

  2.   

    再转这是nt的
    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      StdCtrls,AccCtrl;type
      TForm1 = class(TForm)
        Button1: TButton;
        Edit1: TEdit;
        Edit2: TEdit;
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;  TSHARE_INFO_502 = record 
        shi502_netname: PWideChar;
        shi502_type: DWORD;
        shi502_re: PWideChar;
        shi502_permissions: DWORD;
        shi502_max_uses: DWORD;
        shi502_current_uses: DWORD;
        shi502_path: PWideChar;
        shi502_passwd: PWideChar;
        shi502_reserved: DWORD;
        shi502_security_descriptor: PSECURITY_DESCRIPTOR;
      end;  PBYTE = ^BYTE;
      PDWORD = ^DWORD;
    function NetShareAdd(servername:Widestring; level: DWORD; buf: PBYTE;
                   VAR  parm_err: LPDWORD ): DWORD; stdcall;
    var
      Form1: TForm1;implementationfunction NetShareAdd; external 'netapi32.DLL' name 'NetShareAdd';{$R *.DFM}procedure TForm1.Button1Click(Sender: TObject);
    var
      ServerName:pchar;
      si: TSHARE_INFO_502;
      r: DWORD;
      parm_err:PDword;
    begin
      si.shi502_netname := 'temp4';   (共享名)
      si.shi502_type := 0;  //STYPE_DISKTREE
      si.shi502_re := nil;
      si.shi502_max_uses := $FFFFFFFF;
      si.shi502_current_uses := 10;
      si.shi502_path := 'f:\sango3';   (原路径)
      si.shi502_passwd := nil;
      si.shi502_reserved := 0;
      si.shi502_security_descriptor := nil;
      si.shi502_permissions:=TRUSTEE_ACCESS_ALL;
      ServerName:=stralloc(200);
      strpcopy(ServerName,'vodserver');   ('vodserver'是机器名)
      try
        r := NetShareAdd(ServerName, 502, @si, parm_err );
      Finally
        strdispose(ServerName);
      end;
      Edit1.Text := Format( '%d', [r] );
      Edit2.Text:=inttostr(parm_err);
    end;end.
      

  3.   

    to:blueshu(绝对是菜鸟)nt下的好象有点问题呀?
      

  4.   

    可以用SetFilePermission 来设置NTFS上的文件和目录的权限 
     
    BOOL SetFilePermission(LPCTSTR lpFileName, 
    SECURITY_INFORMATION SecurityInformation, 
    PSECURITY_DESCRIPTOR pSecurityDescriptor 
    ); 
    其他相关的还有
    GetFilePermission
    Get/SetSecurityDescriptorDacl 
    Get/SetSecurityDescriptorGroup 
    Get/SetSecurityDescriptorOwner 
    Get/SetSecurityDescriptorSacl 
    这个东西具体的怎么用呀?
      

  5.   

    =======================================
    这里找不到答案吗?来这里试试看!
    这里有问必答
    http://systemer.51.net/cgi-bin/leoboard.cgi
    希望你能在这里找到你满意的答案
    =========================================
      

  6.   

    好像在 nt 下NetShareAdd 不起作用
      

  7.   

    我的 email : [email protected] 
    我终于实现了在 nt 下的文件共享,其实我很久以前就提过这个问题,但是
    一直都没有好的解决办法,应该好好看看 MSDN 2002 版。明天我会整理完
    并以文章的形势,发送到 CSDN 上的。谢谢 blueshu 的提示