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