在WIN2000下,怎么样用程序控制文件夹的访问权限

popmailzjw 2004-09-04 05:50:04
比如我用普通用户登录,要建一个目录只能管理员访问,其它用户都不能访问
...全文
180 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
jinjazz 2004-09-06
  • 打赏
  • 举报
回复
应该在组策略那里,我看看
popmailzjw 2004-09-06
  • 打赏
  • 举报
回复
還有更好的答案嗎
fei19790920 2004-09-04
  • 打赏
  • 举报
回复
请看:
119、局域网中文件夹的共享 Windows NT/2000/XP
局域网中文件夹的共享 Windows NT/2000/XP

在局域网中通过程序实现文件夹的共享,就我知道的应该至少有两种实现方式。一是修改注册表,但是这种方法存在的问题也是很明显的,必须重起机器才能生效。二就是利用 Windows Api函数 NetShareAdd ,通过这个函数我们可以很容易的实现文件夹的共享,而且无需重起计算机。使用这个函数时我们必须注意的是在 Windows NT/2000/XP 和 Windows 95/98/Me 下用法是有很大差别的,这一点我相信大家都有体会,明明在 95 或 98 下实现好好的,可是一到 NT 下就出问题。

其实不光是各位仁兄,我早就提出过这个问题,怎奈一直都没有解决掉。现在好了,希望读完后能给大家一点点帮助。

Windows 95/98/Me 下 NetShareAdd 函数声明在 SVRAPI.DLL 动态连接库中,而在 2000/XP/NT 下声明在 NETAPI32.DLL 动态连接库中。所以我们在不同的操作系统下一定要注意调用不同的 DLL 库。这些函数详细的声明,在新版 MSDN 2002 中有介绍。由于在Delphi中没有声明这些函数和他们的参数所以我们要想实现这个函数还必须自己声明(可能delphi 有声明我不知道在那个单元中)。顺便说一句,我使用的是 delphi5.0 版,可惜他的帮助文件实在是太陈旧了,还是先看看 MSDN 2002 中关于 NetShareAdd 函数的声明巴!

Windows NT/2000/XP:

NET_API_STATUS NetShareAdd(
LPWSTR servername, //对应 Delphi 中 PWideChar
DWORD level, //对应 DELPHI 中 DWOED
LPBYTE buf, //对应 DELPHI 中 PBYTE
LPDWORD parm_err // 对应 DELPHI 中 PDWORD
);
Windows 95/98/Me: 下面的对应参数就不用说了吧!可以直接看看DELPHI帮助文件。

extern API_FUNCTION
NetShareAdd(
const char FAR * pszServer,
short sLevel,
const char FAR * pbBuffer,
unsigned short cbBuffer
);

特别强调:

我们在声明上面的函数时,函数参数一定要写对,也就是一定要正确对应到DELPHI 自己的类型上。不然函数功能无法实现,这一点我已经尝试了。之所以在NT 下实现不了主要还是,参数类型对应的不对。我们还需要声明一个记录类型,在98/95/me 和 nt/2000/xp下声明如下:
Windows NT/2000/XP: SHARE_INFO_2 和 SHARE_INFO_502 结构
Windows 95/98/Me: share_info_50 结构

对以上这个结构的声明更应该注意参数类型的正确对应。原始声明如下:

typedef struct _SHARE_INFO_502 {
LPWSTR shi502_netname; // PWideChar;
DWORD shi502_type; // DWORD;
LPWSTR shi502_remark; // PWideChar;
DWORD shi502_permissions; // DWORD;
DWORD shi502_max_uses; // DWORD;
DWORD shi502_current_uses; //DWORD;
LPWSTR shi502_path; //PWideChar;
LPWSTR shi502_passwd; // PWideChar;
DWORD shi502_reserved; // DWORD ;
// PSECURITY_DESCRIPTOR ;一般设为 Nil
PSECURITY_DESCRIPTOR shi502_security_descriptor;
} SHARE_INFO_502, *PSHARE_INFO_502, *LPSHARE_INFO_502;

对应 Delphi 纪录声明如下:一定要注意参数类型的正确对应,如果你把PWideChar 声明为 pchar 函数将无法实现此功能,我已经尝试了,你可以再试试,至于原因是什么,我也不太清楚。

type
TSHARE_INFO_502 = record
shi502_netname: PWideChar;
shi502_type: DWORD;
shi502_remark: 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;

下面是完成的程序代码,其中有两部分,主程序和单元文件。运行环境 windows 2000 Ads 开发工具 Delphi5.0 。运行通过。

unit Share;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls,FileCtrl,My_Share;
type
TFormShare = class(TForm)
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
BtSelect: TButton;
EditDir: TEdit;//文件共享目录
EditSharename: TEdit; //共享名称
EditInfo: TEdit;//备注
Button1: TButton;
Button2: TButton;
procedure BtSelectClick(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
FormShare: TFormShare;
implementation

{$R *.DFM}
procedure TFormShare.BtSelectClick(Sender: TObject);
var
directory: string;
begin
if SelectDirectory('选择一个目录','', directory) then
EditDir.Text := directory;
end;

procedure TFormShare.Button1Click(Sender: TObject);
begin
if EditDir.Text = '' then
begin
Application.MessageBox('请先选择一个目录!', '共享', MB_ICONINFORMATION + MB_OK);
BtSelect.Click;
Exit;
end;
if EditSharename.Text = '' then
begin
Application.MessageBox('请先输入共享名称!', '共享', MB_ICONINFORMATION + MB_OK);
EditSharename.SetFocus;
Exit;
end;
ShareResource('eengi',EditDir.Text,EditSharename.Text,EditInfo.Text);
{注意:如果在共享目录名称后面添加 $ 符号,共享后在网络邻居里看不到此文件夹但实际上已经共享了,你可以在本地看到}
end;
end.

以下是单元文件:
unit My_Share;
interface
uses
Windows,Sysutils ;
type
//纪录类型声明,注意参数类型的正确对应,最好别看 delphi 的帮助,引起误导
TSHARE_INFO_502 = record
shi502_netname: PWideChar;
shi502_type: DWORD;
shi502_remark: 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;
//添加共享
function NetShareAdd(servername:Widestring; level: DWORD; Buf: PBYTE;
var parm_err: PDWORD ): DWORD; stdcall;
//删除共享
function NetShareDel(ServerName:Widestring; NetName: Widestring;
Reserved: DWord): Integer; StdCall;
const
{共享类型}
STYPE_DISKTREE = 0 ;
STYPE_PRINTQ = 1 ;
STYPE_DEVICE = 2 ;
STYPE_IPC = 3 ;
{访问权限}
ACCESS_READ = 0 ;
ACCESS_WRITE = 1 ;
ACCESS_CREATE = 2 ;
ACCESS_EXEC = 3 ;
ACCESS_DELETE = 4 ;
ACCESS_ALL = 7 ;

//自己声明的函数,为了调用方便,参数就不用说明了吧!
function ShareResource(ServerName,FilePath,NetName, Remark : string): Integer;
//function DeleteShare(ServerName: string; NetName: string): Integer;
implementation
//注意在 windows95/98/me 下面 dll 库是 SVRAPI.DLL ,而且参数类型也要随之改变的吆!
function NetShareAdd; external 'netapi32.DLL' name 'NetShareAdd';
function NetShareDel; external 'netapi32.DLL' name 'NetShareDel';

function ShareResource(ServerName,FilePath,NetName, Remark : string): Integer;

var
ShInfo: TSHARE_INFO_502;
parm_err:PDWORD;
_FilePath,_NetName, _Remark : PWideChar ;
_ServerName : Pchar ;
begin
GetMem(_ServerName,255) ; //分配内存
GetMem(_FilePath,255);
GetMem(_NetName,255);
GetMem(_Remark,255);
StringToWideChar(FilePath,_FilePath,255); //字符串转换,一定要转换正确
StringToWideChar(NetName,_NetName,255);
StringToWideChar(Remark,_Remark,255);
strpcopy(_ServerName,ServerName);
//开始创建结构
with ShInfo do
begin
shi502_netname := _NetName;
shi502_type := STYPE_DISKTREE ;
shi502_remark := _Remark ;
shi502_max_uses := $FFFFFFFF;
shi502_current_uses := 10;
shi502_path := _FilePath;
shi502_passwd := nil;
shi502_reserved := 0;
shi502_security_descriptor := nil;
shi502_permissions := ACCESS_ALL;
end;
try
Result := NetShareAdd(_ServerName, 502, @ShInfo, parm_err);
Finally // 别忘了释放内存
FreeMem(_ServerName,255);
FreeMem(_FilePath,255);
FreeMem(_NetName,255);
FreeMem(_Remark,255);
end;
end;
end.

popmailzjw 2004-09-04
  • 打赏
  • 举报
回复
还有一个就是怎么样能不让可访问的用户不能删除指定文件
一、启用guest来宾帐户; 二、控制面板→管理工具→本地安全策略→本地策略→用户权利指派里,“从网络访问此计算机”中加入guest帐户,而“拒绝从网络访问这台计算机”中删除guest帐户; 三、我的电脑→工具→文件夹选项→查看→去掉“使用简单文件共享(推荐)”前的勾; 四、设置共享文件夹; 五、控制面板→管理工具→本地安全策略→本地策略→安全选项里,把“网络访问:本地帐户的共享和安全模式”设为“仅来宾-本地用户以来宾的身份验证”(可选,此项设置可去除访问时要求输入密码的对话框,也可视情况设为“经典-本地用户以自己的身份验证”); 六、右击“我的电脑”→“属性”→“计算机名”,该选项卡中有没有出现你的局域网工作组名称,如“work”等。然后单击“网络 ID”按钮,开始“网络标识向导”:单击“下一步”,选择“本机是商业网络的一部分,用它连接到其他工作着的计算机”;单击“下一步”,选择“公司使用没有域的网络”;单击“下一步”按钮,然后输入你的局域网的工作组名,如“work”,再次单击“下一步”按钮,最后单击“完成”按钮完成设置。 访问网上邻居时显示:" windows xp系统访问局域网时显示 "WORKGROUP无法访问.您可能没有权限使用网络资源.请与这台服务器的管理员联系以查明您是否有访问权限.此工作组的服务器的列表当前无法使用." 我用的是xp系统 我也遇到过这样的情况,当时也是着急得不轻,后来看到了以下的内容,照着一步步的做了做,真的好了。内容不少,但是仍然希望你能耐住性子,仔细的看看自己属于那种情况,应该会有所收获。 局域网互访 - [ 网络 ] 我也是类似问题。 以前一个局域网10多台机子互访问。安了蕃茄花园v2.3,感觉主题漂亮,桌面壁纸自动换,很爽。访问局域网计算机没问题。可网内其它机子在工作组内能看到我的机子,但打不开。说什么“没有权限”。所有设置都作了如下改动(网上找的),依然无效,何故?但求高手指点。 “网上邻居”无法互访问题解决方法大全 “网上邻居”无法互访的问题实在是太常见了,无论在学校,网吧还是家里多台电脑联机,都有可能遇到网上邻居无法互访的故展。“网上邻居”无法访问的故障多种多样,总结起来基本上有下面的几个: 1,没有共享资源/共享服务未启用。 症状:电脑与电脑间可以Ping通,但无法访问共享资源,在“计算机管理”中查看“本地共享”后会弹出“没有启动服务器服务”的错误对话框。 解决:在控制面板-管理工具-服务中启动Server服务。并设置“启动类型”为“自动”。 2,IP设置有误。 症状:双机之间无法互Ping,连接用的双绞线经过测试没有问题,没有安装防火墙。 解决:检查两台电脑的IP是否处在同一网段,还有子掩码是否相同。 3,WINXP默认设置不正确。 症状:从WIN98/2000/2003上无法访问另一台WINXP的机器。 解决:在“控制面板”中的“用户帐户”启用Guest帐号。然后在运行中输入secpol.msc启动“本地安全策略”。 本地策略 -> 用户权利指派,打开“从网络访问此计算机”,添加Guest帐户 本地策略 -> 安全选项,禁止"帐户:使用空白密码的本地帐户只允许进行控制台登陆"。 另外有时还会遇到另外一种情况:访问XP的时候,登录对话框中的用户名是灰的,始终是Guest用户,不能输入别的用户帐号。 解决:本地策略 -> 安全选项 -> "网络访问:本地帐户的共享和安全模式",修改为"经典-本地用户以自己的身份验证" 4,系统漏洞修补软件修改了安全策略。 症状:在“网上邻居”中可以看到对方的计算机,但是访问共享时却提示“没有权限访问网络” 解决:在开始菜单运行中输入secpol.msc启动“本地安全策略”,本地策略 -> 用户权利分配,打开“拒绝从网络访问这台计算机”,删除guest用户。 5,防火墙规则。 症状:安装了防火墙(包括WINXP系统自带的防火墙),出现无法Ping通,或者是访问共享资源的时候提示"XXX无法访问"、"您可能没有权限使用网络资源"、"请与这台服务器的管理员联系以查明您是否有访问权限"、"找不到网络路径"等类似的提示。 解决:停止防火墙或者添加局域网的访问规则。 WINXP自带的防火墙:打开控制面板 -> 网络和Internet连接 -> Windows防火墙 -> 例外,勾选“文件和打印机共享”。 6,Win2000/XP与Win98互访 症状:Ping命令可以通过,但无法在“网上邻居”中实现互访。 解决:在WIN2000/XP系统中:控制面板 -> 管理工具 -> 计算机管理 -> 本地用户和组 -> 用户,在Guest帐户上点击鼠标右键,选择属性,在常规项里取消
登录失败:未授予用户在此计算机上的请求登录类型。无法访问。您可能没有权限使用网络资源。请与这台服务器的管理员联系以查明您是否有访问权限。 如果出现“xxx计算机无法访问,您可能没有权限使用网络资源。请与这台服务器的管理员联系以查明您是否有访问权限”的报错,这可能是计算机的安全设置被改动过了,导致目标计算机无法被访问。可以采取以下步骤解决: 1. 取消简单文件共享。 打开“我的电脑”,在菜单上选择“工具”->“文件夹选项”->“查看”,清除“使用简单文件共享(推荐)”的选择。 2. 启用guest账户。 右键点击“我的电脑”,选择“管理”,选择“本地用户和组”->“用户”,右键点击Guest用户,选“属性”,清除“帐户已停用”的选择。 3. 在组策略中设置,安全策略。 开始--运行--gpedit.msc--计算机配置--windows设置--安全设置--本地策略--“用户权力指派”,双击右边的“从网络访问此计算机”,保证其中有Everyone,双击左边的“拒绝从网络访问此计算机”,保证其是空的。 4. 选择左边的“本地策略”->“安全选项”, a.确认右边的“网络访问:本地帐户的共享与安全模式”为“经典”; b.确认右边的“Microsoft网络客户:为通讯启用数字签名(总是)”为“已停用”; c.确认右边的“Microsoft网络客户:为通讯启用数字签名(如果服务器允许)”为“已启用”; d.确认右边的“Microsoft网络服务器:为通讯启用数字签名(总是)”为“已停用”; e.确认右边的“Microsoft网络服务器:为通讯启用数字签名(如果服务器允许)”为“已启用”。 5.正确配置网络防火墙 1>很多机器安装了网络防火墙,它的设置不当,同样导致用户无法访问本机的共享资源,这时就要开放本机共享资源所需的NetBIOS端口。笔者以天网防火墙为例,在“自定义IP规则”窗口中选中“允许局域网的机器使用我的共享资源”规则,最后点击“保存”按钮,这样就开放了NetBIOS端口 。 2>关闭windows自带防火墙。 6.合理设置用户访问权限 网络中很多机器使用 NTFS文件系统,它的ACL功能(访问控制列表)可以对用户的访问权限进行控制,用户要访问这些机器的共享资源,必须赋予相应的权限才行。如使用Guest账号访问该机器的CPCW共享文件夹,右键点击该共享目录,选择“属性”,切换到“安全”标签页,然后将Guest账号添加到用户列表中,接着指定Guest的访问权限,至少要赋予“读取”和“列出文件夹目录”权限。如果想让多个用户账号能访问该共享目录,只需要添加Eeryone账号,然后赋予“读取”和“列出文件夹?.. 7、网络协议配置问题, A、网络协议的安装和设置 1.在WinXP中安装NetBEUI协议 对的,你没有看错,就是要在WinXP中安装NetBEUI协议。微软在WinXP中只支持TCP/IP协议和NWLink IPX/SPX/NetBIOS兼容协议,正式宣布不再支持NetBEUI协议。但是在建立小型局域网的实际使用中,使用微软支持的两种协议并不尽如人意。比如,在解决网上邻居慢问题的过程中,笔者采用了诸多方法后网上邻居的速度虽然好一点,但还是慢如蜗牛;另外,在设置多块网卡的协议、客户和服务绑定时,这两种协议还存在BUG,多块网卡必须同时绑定所有的协议(除NWLink NetBIOS)、客户和服务,即使你取消某些绑定重启后系统又会自动加上,这显然不能很好地满足网络建设中的实际需要。而当笔者在WinXP中安装好NetBEUI协议后,以上两个问题都得到圆满的解决。 在WinXP安装光盘的“\\valueADD\\MSFT\\NET\\NETBEUI”目录下有3个文件,其中“NETBEUI.TXT”是安装说明,另外两个是安装NetBEUI协议所需的文件。安装的具体步骤如下: 复制“NBF.SYS”到“%SYSTEMROOT%\\SYSTEM32\\DRIVERS\\”目录; 复制“NETNBF.INF”到“%SYSTEMROOT%\\INF\\”目录; 在网络连接属性中单击“安装”按钮来安装NetBEUI协议。 注:%SYSTEMROOT%是WinXP的安装目录,比如笔者的WinXP安装在F:\\Windows目录下,就应该用F:\\Windows来替换%SYSTEMROOT%。 2.在WinXP中设置好其它网络协议 建议,如果你的局域网不用上Internet便只需要安装NetBEUI协议就行了。在小型局域网(拥有200台左右电脑的网络)中NetBEUI是占用内存最少、速度最快的一种协议,NWLink IPX/SPX/NetBIOS兼容协议则应当删除掉。 如果你的局域网要上Internet则必须安装T

5,392

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧