允许访问

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

您可以通过向对象的安全描述符添加一个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。然后,它使用BuildExplicitAccessWithNameSetEntriesInAcl函数将新的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;

}