首页  编辑  

NT 下文件和目录的权限设置

Tags: /超级猛料/Stream.File.流、文件和目录/目录/   Date Created:

NetShareAdd可以设置目录共享,可如何设置共享权限呢?

查了以前答案发现这样一个回答--SetFilePermission,

可我哪都翻遍了(MSDN,VC,Delphi,BCB)也没找到这个Api?

从来没做过这种东西,希望最好能给段代码。

用法如下:

BOOL SetFilePermission(LPCTSTR lpFileName, // address of string for filename

SECURITY_INFORMATION SecurityInformation, // type of information to set

PSECURITY_DESCRIPTOR pSecurityDescriptor // address of security descriptor

);

SECURITY_INFORMATION用于指示下面一个参数的类型, 它可以取如下的值:

OWNER_SECURITY_INFORMATION

文件和目录的所有者信息

GROUP_SECURITY_INFORMATION

主组信息

DACL_SECURITY_INFORMATION

自由的访问控制列表(ACL)信息

SACL_SECURITY_INFORMATION

系统的访问控制列表(ACL)信息

请您参考下列API函数和数据结构以获得设置权限的进一步的信息:

ACL (DataStructure, Access Control List)

Get/SetSecurityDescriptorDacl

Get/SetSecurityDescriptorGroup

Get/SetSecurityDescriptorOwner

Get/SetSecurityDescriptorSacl

记住一个要点就可以了:

一WIN9X用SVRAPI.DLL

-NT/2000用NETAPI32.DLL

---------------------------------------

请看如下代码: 可以成功执行,但有缺陷

procedure TForm1.Button1Click(Sender: TObject);

var

 SD: SECURITY_DESCRIPTOR;

 pUserSID, pGroupSID: Pointer;

 szDomain: PChar;

 snuType: SID_NAME_USE;

 cbSID: DWORD;

 cbDomain: DWORD;

begin

 if InitializeSecurityDescriptor(@SD, SECURITY_DESCRIPTOR_REVISION) then

   ShowMessage('Initialize ok')

 else

   ShowMessage('Initialize failed');

 cbDomain := 80;

 cbSID := 1024;

 pUserSID := AllocMem(cbSID);

 szDomain := AllocMem(cbDomain);

 if LookupAccountName(nil, 'administrator', pUserSID, cbSID, szDomain, cbDomain, snuType) then

   ShowMessage('LookupAccountName:User ok')

 else

   ShowMessage('LookupAccountName:User failed');

 if SetSecurityDescriptorOwner(@SD, pUserSID, False) then

   ShowMessage('SetSecurityOwner:User ok')

 else

   ShowMessage('SetSecurityOwner:User failed');

 cbDomain := 80;

 cbSID := 1024;

 pGroupSID := AllocMem(cbSID);

 szDomain := AllocMem(cbDomain);

 if LookupAccountName(nil, 'administrators', pGroupSID, cbSID, szDomain, cbDomain, snuType) then

   ShowMessage('LookupAccountName:Group ok')

 else

   ShowMessage('LookupAccountName:Group failed');

 if SetSecurityDescriptorGroup(@SD, pGroupSID, False) then

   ShowMessage('SetSecurityGroup ok')

 else

   ShowMessage('SetSecurityGroup failed');

 if SetFileSecurity('C:\文件夹', OWNER_SECURITY_INFORMATION or GROUP_SECURITY_INFORMATION, @SD) then

   ShowMessage('SetFileSecurity ok')

 else

   ShowMessage('SetFileSecurity failed');

end;

我的问题是:但用系统管理员登录,而且对该目录拥有的权限正常的话,可以成功修改该目录的所有者,但如果对该目录的权限进行限制,连系统管理员都不能访问,即点击"安全"页,连管理员都会提示:"您无权查看或编辑目前 文件夹 的权限设置;但是,您可以取得所有权或更改审核设置"。在这样的情况下,执行上面的代码更改所有者就会失败。但是我用系统内置的"文件夹"属性功能-->"高级"却可以成功的将此目录的所有者更改,进而重新对该目录的权限重新设置。为什么系统功能可以做到,而我上面的代码就失败呢。