急,NT下如何共享一个以目录名作为共享名的目录,200分(100分)

  • 主题发起人 主题发起人 ldlgyxw
  • 开始时间 开始时间
L

ldlgyxw

Unregistered / Unconfirmed
GUEST, unregistred user!
如所在目录为 c:/123/abc,现要共享目录abc,且共享名要为abc,所有权限开放,请给例程,谢谢
 
function NetShareDel; external 'NETAPI32.DLL' name 'NetShareDel';

//删除共享的过程;
procedure delshare(pcname:string);

begin

NetShareDel(nil, PWideChar(WideString(pcname)), 0);
end;

//声明得到计算机名字的函数;
function ComputerName : String;
var
CNameBuffer : PChar;
fl_loaded : Boolean;
CLen : ^DWord;
begin
GetMem(CNameBuffer,255);
New(CLen);
CLen^:= 255;
fl_loaded := GetComputerName(CNameBuffer,CLen^);
if fl_loaded then
ComputerName := StrPas(CNameBuffer)
else
ComputerName := 'Unkown';
FreeMem(CNameBuffer,255);
Dispose(CLen);
end;

//添加共享的过程;
procedure addshare(srvname:pwidechar;sharename:pwidechar;path:pwidechar);
var
ServerName:widestring;
si: TSHARE_INFO_502;
r: DWORD;
parm_err:LPDword;
begin

si.shi502_netname := sharename; // 共享名称
si.shi502_type := 0; //STYPE_DISKTREE
si.shi502_remark := nil;
si.shi502_max_uses := $FFFFFFFF;
si.shi502_current_uses := 10;
si.shi502_path :=path; //你要共享的路径
si.shi502_passwd := nil;
si.shi502_reserved := 0;
si.shi502_security_descriptor := nil;
si.shi502_permissions:=TRUSTEE_ACCESS_ALL;
ServerName:=srvname; // 你要共享的电脑名称
try
r := NetShareAdd(ServerName, 502, @si, parm_err );
Finally

end;
showmessage(Format( '%d', [r] )); // 0表示成功,53表示不成功
end;




procedure SetFlg (flag : TNetUserFlag; setIt : boolean);
var
flgs : TNetUserFlags;
begin
if setIt then
flgs := flgs + [flag]
else
flgs := flgs - [flag]
end;

//添加用户函数;
function NetUserAdd(Server:PWideChar;Level:DWORD;Buf:pointer;ParmError:dword):LongInt;
stdcall; external 'netapi32.dll';
//声明计算文件行的函数;
function countfileline(filename:string):integer;
var
sl:TStringlist;
begin
sl:=Tstringlist.Create;
try
//showmessage(filename);
sl.LoadFromFile(filename);
//
result:=sl.Count;
finally
sl.Free;
end;
end;


调用:
addshare(ss,shname,path);

如果不明白联系hebiziyu88@hotmail.com
 
来自:房客, 时间:2000-10-03 21:33:00, ID:356013
//以前写的
关于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;
remark: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( 'Remark', '' ) ;
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 列出网络资源

 
后退
顶部