您可以通过向对象的安全描述符添加一个NULL自由访问控制列表(DACL)来允许对对象的所有访问。与拒绝所有访问的空DACL不同,空DACL授予每个人完全访问该对象。您还可以通过使用具有一个或多个访问允许的ACE的DACL来授予对指定受托人的访问权限。
本主题包括使用Windows NT 4.0版提供的高级访问控制功能的示例。有关使用较旧的低级访问控制功能的示例,请参阅允许访问使用低级功能.
第一个示例使用SetNamedSecurityInfo函数将NULL DACL附加到文件。SetNamedSecurityInfo调用指定DACL_SECURITY_INFORMATION标志以指示它正在设置文件的DACL;并为【pDacl】参数传递NULL指针。
//授予对具有NULL DACL的所有人的完全访问权限
dwRes = SetNamedSecurityInfo(TEXT("myfile"), SE_FILE_OBJECT,
DACL_SECURITY_INFORMATION,
NULL, NULL, NULL, NULL);
第二个示例将访问允许的ACE添加到对象的DACL。该示例使用GetNamedSecurityInfo函数获取现有的DACL。然后,它使用BuildExplicitAccessWithName和SetEntriesInAcl函数将新的ACE与DACL中的任何现有ACE合并。最后,该示例调用SetNamedSecurityInfo函数将新的DACL附加到对象的安全描述符。
DWORD AddAceToAcl(LPTSTR lpObjectName,SE_OBJECT_TYPE ObjectType)
{
DWORD dwRes;
PACL pOldDACL, pNewDACL;
PSECURITY_DESCRIPTOR pSD;
EXPLICIT_ACCESS ea;
if (NULL == lpObjectName)
return ERROR_INVALID_PARAMETER;
//获取指向现有DACL的指针
dwRes = GetNamedSecurityInfo(lpObjectName, ObjectType,
DACL_SECURITY_INFORMATION,
NULL, NULL, &pOldDACL, NULL, &pSD);
if (ERROR_SUCCESS != dwRes)
return dwRes;
//初始化EXPLICIT_ACCESS结构以允许访问
ZeroMemory(&ea, sizeof(EXPLICIT_ACCESS));
BuildExplicitAccessWithName(& ea,“duke”,GENERIC_READ,
SET_ACCESS, NO_INHERITANCE);
//通过合并EXPLICIT_ACCESS结构创建一个新的ACL
//与现有的DACLen
dwRes = SetEntriesInAcl(1, &ea, pOldDACL, &pNewDACL);
if (ERROR_SUCCESS != dwRes)
goto Cleanup;
//附加新的ACL作为对象的DACL
dwRes = SetNamedSecurityInfo(lpObjectName, ObjectType,
DACL_SECURITY_INFORMATION,
NULL, NULL, pNewDACL, NULL);
//释放SetEntriesInAcl返回的缓冲区
//和GetNamedSecurityInfo
清理:
if(pSD != NULL)
LocalFree((HLOCAL) pSD);
if(pNewDACL != NULL)
LocalFree((HLOCAL) pNewDACL);
return dwRes;
}