拒绝访问

【勇芳软件工作室】汉化HomePreviousNext

您可以通过向对象的安全描述符添加一个空的自由访问控制列表(DACL)来拒绝对对象的所有访问。空的DACL没有访问控制条目(ACE),这意味着DACL不授予对任何人的访问权限。请注意,这不同于没有DACL的安全描述符;在这种情况下,系统将授予每个人完全访问该对象。您还可以通过使用具有一个或多个访问被拒绝的ACE的DACL来防止指定的受托人获取对象的访问。

本主题包括使用Windows NT 4.0版新功能的高级访问控制功能的示例。有关使用较旧的低级访问控制功能的示例,请参阅拒绝访问使用低级功能.

高级示例使用SetEntriesInAcl功能创建ACL。然后他们使用SetNamedSecurityInfo函数将ACL作为对象的DACL来附加。请注意,这些示例可以与各种命名的安全对象(如文件,注册表项和同步对象)配合使用。

第一个例子显示如何向对象的安全描述符添加一个空的DACL。效果是拒绝对对象的所有访问。

DWORD SetEmptyDACL(LPTSTR lpObjectName,SE_OBJECT_TYPE ObjectType)

{

DWORD dwRes;

PACL pDacl;

if (NULL == lpObjectName)

return ERROR_INVALID_PARAMETER;

//创建没有ACE的ACL

dwRes = SetEntriesInAcl(0, NULL, NULL, &pDacl);

if (ERROR_SUCCESS != dwRes)

return dwRes;

//将emtpy ACL附加为对象的DACL

dwRes = SetNamedSecurityInfo(lpObjectName, ObjectType,

DACL_SECURITY_INFORMATION,

NULL, NULL, pDacl, NULL);

//释放SetEntriesInAcl返回的缓冲区

LocalFree(pDacl);

return dwRes;

}

您可以修改此示例以拒绝对指定的受托人的访问。以下变体使用BuildExplicitAccessWithName函数来初始化EXPLICIT_ACCESS结构,其中包含访问被拒绝的ACE的数据。然后使用SetEntriesInAclSetNamedSecurityInfo函数创建ACL并将其附加到对象。

#include < aclapi.h >

DWORD dwRes;

PACL pDacl;

EXPLICIT_ACCESS ea;

//初始化EXPLICIT_ACCESS结构以拒绝访问

ZeroMemory(&ea, sizeof(EXPLICIT_ACCESS));

BuildExplicitAccessWithName(&ea,

"ludwig", //受托人名称

GENERIC_ALL, //访问类型

DENY_ACCESS, //访问模式

NO_INHERITANCE); //继承模式

//创建一个访问被拒绝的ACE的ACL

dwRes = SetEntriesInAcl(1, &ea, NULL, &pDacl);

if (ERROR_SUCCESS != dwRes)

return dwRes;

//附加ACL作为对象的DACL

dwRes = SetNamedSecurityInfo(TEXT("myfile"), SE_FILE_OBJECT,

DACL_SECURITY_INFORMATION,

NULL, NULL, pDacl, NULL);

//释放SetEntriesInAcl返回的缓冲区

LocalFree(pDacl);