如何在程序里访问//机器名/共享目录,而在文件管理器里不能访问//机器名/共享目录?(200分)

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

laotan

Unregistered / Unconfirmed
GUEST, unregistred user!
我在98系统下,用WNetAddConnection2实现了以“//机器名/共享目录” 的方式访问
2000server的共享资源,在程序运行结束后,我用WNetCancelConnection2去掉共享,但在
文件管理器里仍然可以用“//机器名/共享目录”访问共享资源。
请问如何在我的程序运行中保证访问共享资源,而退出时使98系统不能用//机器名/共享
目录的方式访问?
 
2000加口令,98重启一下应该解决
 
2000有口令,是guest用户的
98重起以后,确实进不了//机器名/共享目录 了,但只要运行过我的程序以后,就一直能
进“//机器名/共享目录”了,达不到我的要求
 
将你连接的网络断开就应该可以了。
 
有分就行!
抄录:

Win9X下它调用SVRAPI.DLL中的一个函数:NetShareAdd,在NT/2000下则是NETAPI32.DLL.
动态共享文件夹:
  删除一个共享:DeleteShare(nil, Pchar(共享名称));
  添加一个只读共享:
   ShareResource(nil, pchar(路径), Pchar(共享名称), Pchar(共享说明),STYPE_DISKTREE,SHI50F_RDONLY,'','');
添加一个完全共享:
ShareResource(nil, pchar(路径), Pchar(共享名称), Pchar(共享说明),STYPE_DISKTREE,SSHI50F_FULL,'','');

 
我的意思不是在服务器上新建一个共享目录,而是:服务器上已有共享目录,该目录guest
有完全权限,客户端98下连接共享,使用完成以后,客户端断开共享(不是拔网线、重起或
注销98),在地址栏输入//hostname/dir无效。
 
在你连接到服务器资源时,系统会对当前或你提供的用户名和口令进行验证,通过的话系统会创建一个访问令牌。并将该用户的SID(Security Indentifier 所有人安全标志符)分配给它。对面向用户的任何程序而言都会拥有该访问令牌的一个拷贝。然后在访问被保护的对象时,系统会把这个访问令牌中的SID通DACL(授权访问控制列表)中的SID的访问权限进行比对。
用户可以拥有两种不同的用户凭证:主登录凭证和会话登录凭证。主登录凭证在你登陆到你用的计算机使用的用户名和口令。保存在一个访问令牌中。对任何用户任何时候只能存在一套主登录凭证。所以如果用户用的主登录凭证能够通过远程计算机的验证的话不论在程序你还是在你的资源管理其中都是可以建立连接的,不会受你的控制。
windows nt和windows 2000用户可以建立会话凭证。也就是说用户在访问远程资源时只要用户可以提供一套合法的用户凭证,就可以连接。在用户同远程资源之间同时只能建立一套用户凭证。但是如果访问的相同的远程资源两个会话将公用一个会话凭证。
所以,在98的客户端是不能实现你所说的功能的。在WinNt 2000 xp下你可以在程序利用你的会话凭证访问远程资源。程序结束后销毁凭证但是在你销毁凭证前资源管理仍然是可以访问远程资源的。
因此,比较难办。有一个解决的办法就是在服务器端建立程序模拟提供文件共享。
 
>to tingjie
谢谢您的精彩评点,我一开始到是考虑过做成服务器端的文件服务的中间服务,看样子也
只好这么办了。
但我还不死心,如果纯文件操作到可以(如修改,拷贝,删除等),如果是做access文件
的操作,又要做一个数据库操作的中间服务程序,是不是太麻烦了?
希望大家能想出更好的解决方案。
 
procedure TForm1.FormCreate(Sender: TObject);
var
netresource:Tnetresource;
re:dword;
begin
winexec('net use * /delete',0);
WNetCancelConnection2(
'//servername',
CONNECT_UPDATE_PROFILE,
true);
netresource.dwScope:=RESOURCE_GLOBALNET;
netresource.dwUsage:=RESOURCEUSAGE_CONNECTABLE;
netresource.dwType:=RESOURCETYPE_DISK;
netresource.dwDisplayType:=RESOURCEDISPLAYTYPE_SERVER;
netresource.lpLocalName:='';
netresource.lpRemoteName:='//servername;
netresource.lpProvider:='';
re:=WNetAddConnection3(
application.Handle,
netresource,
'password',
'username',
CONNECT_UPDATE_PROFILE
);
if re=NO_ERROR then
begin
end
else begin
application.MessageBox('无法连接到服务器,请与系统管理员联系','系统提示',mb_ok);
application.Terminate;
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
WNetCancelConnection2(
'//servername',
CONNECT_UPDATE_PROFILE,
true);
form1.Release;
end;
[blue]最好将共享的目录名称加上$,例如:共享名 dir$[/blue]
直接操作//servername/dir$就可以了!!!!!!!!!!!!
 
加上$还是一样啊,在文件管理器里用//servername/dir$还是可以访问的。
 
加个口令,程序里每次连上操作后主动断开
net use /USER:username //xxx/d$
 
反正程序里用的是Sql server,我用sql server实现了文件的上传和下载,只要能访问
sqlserver服务器就可以了,客户端和服务器都不用再用什么共享了。谢谢各位。
 
结束了。再次感谢
 
有作弊的嫌疑!!!He!He!
 
客户端是98,98的WNetAddConnection2怎么指定密码?
 
后退
顶部