允许使用低级功能访问

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

本主题介绍如何使用低级功能来处理允许访问对象的ACL和ACE。对于使用高级安全功能的类似示例,请参阅允许访问.

第一个例子显示了使用低级访问控制功能将NULL DACL添加到文件的安全描述符中。低级示例分配一个安全描述符缓冲区,并调用InitializeSecurityDescriptor函数来初始化它。然后它调用SetSecurityDescriptorDacl函数将NULL DACL附加到安全描述符。最后,它调用SetFileSecurity函数将安全描述符附加到一个文件。等效的高级示例可以通过单独调用SetNamedSecurityInfo函数执行相同的操作。

注意您可以编写从头构建安全描述符的代码,如示例所示。但是,编写构建或操作安全描述符的代码时,您的代码应该探索Windows NT放置在对象上的默认安全描述符。例如,对象可能具有默认DACL,其包含从其父对象继承的ACE。您的代码不应仅仅替换默认DACL,而应首先检查默认DACL以确定是否要将其ACE包含在新的DACL中。

PSECURITY_DESCRIPTOR pSD;

/ *初始化安全描述符。*/

pSD = (PSECURITY_DESCRIPTOR) LocalAlloc(LPTR,

SECURITY_DESCRIPTOR_MIN_LENGTH); /* defined in WINNT.H */

if (pSD == NULL) {

ErrorHandler("LocalAlloc");

goto Cleanup;

}

if(!InitializeSecurityDescriptor(pSD,

SECURITY_DESCRIPTOR_REVISION)){/ *在WINNT.H中定义* /

ErrorHandler("InitializeSecurityDescriptor");

goto Cleanup;

}

/ *添加一个空的光盘。ACL到安全描述符。*/

if(!SetSecurityDescriptorDacl(pSD,

TRUE,/ *指定光盘。ACL */

(PACL) NULL,

FALSE)){/ *不是默认光盘。ACL */

ErrorHandler("SetSecurityDescriptorDacl");

goto Cleanup;

}

/ *将安全描述符添加到文件中。*/

如果(!SetFileSecurity(lpszTestFile,id

DACL_SECURITY_INFORMATION,

pSD)){

ErrorHandler("SetFileSecurity");

goto Cleanup;

}

清理:

if(pSD != NULL)

LocalFree((HLOCAL) pSD);

以下示例显示了使用低级访问控制功能将具有访问允许ACE的DACL添加到文件的安全描述符。该示例分配和初始化安全描述符,分配和初始化ACL,并为指定的帐户分配和查找安全标识符(SID)。然后将ACL添加到ACL中,将ACL添加为安全描述符的DACL,最后将安全描述符附加到该文件。请注意,高级功能为您执行许多这些步骤。

PSECURITY_DESCRIPTOR pSD;

PACL pACLNew;

DWORD cbACL = 1024;

PSID pSID;

DWORD cbSID = 1024;

LPSTR lpszAccount = "UserABC";

LPSTR lpszDomain;

DWORD cchDomainName = 80;

PSID_NAME_USE psnuType;

/ *初始化新的安全描述符。*/

pSD = (PSECURITY_DESCRIPTOR) LocalAlloc(LPTR,

SECURITY_DESCRIPTOR_MIN_LENGTH); /* defined in WINNT.H */

if (pSD == NULL) {

ErrorHandler("LocalAlloc");

goto Cleanup;

}

if(!InitializeSecurityDescriptor(pSD,

SECURITY_DESCRIPTOR_REVISION)) {

ErrorHandler("InitializeSecurityDescriptor");

goto Cleanup;

}

/ *初始化一个新的ACL。*/

pACLNew = (PACL) LocalAlloc(LPTR, cbACL);

if (pACLNew == NULL) {

ErrorHandler("LocalAlloc");

goto Cleanup;

}

if(!InitializeAcl(pACLNew,cbACL,ACL_REVISION2)){

ErrorHandler("InitializeAcl");

goto Cleanup;

}

/ *检索UserABC的SID。*/

pSID = (PSID) LocalAlloc(LPTR, cbSID);

psnuType = (PSID_NAME_USE) LocalAlloc(LPTR, 1024);

lpszDomain = (LPSTR) LocalAlloc(LPTR, cchDomainName);

if (pSID == NULL || psnuType == NULL ||

lpszDomain == NULL) {

ErrorHandler("LocalAlloc");

goto Cleanup;

}

if(!LookupAccountName((LPSTR)NULL,/ * local name * /

lpszAccount,

pSID,

&cbSID,

lpszDomain,hu

&cchDomainName,

psnuType)){

ErrorHandler("LookupAccountName");

goto Cleanup;

}

if(!IsValidSid(pSID))

TextOut(hdc, 10, yIncrement += 18,

"SID is not valid.", 17);

其他

TextOut(hdc, 10, yIncrement += 18,

"SID is valid.", 13);

/ *允许读取但不写入对该文件的访问。*/

if(!AddAccessAllowedAce(pACLNew,

ACL_REVISION2,

GENERIC_READ,

pSID)){

ErrorHandler("AddAccessAllowedAce");

goto Cleanup;

}

/ *向安全描述符添加新的ACL。*/

if(!SetSecurityDescriptorDacl(pSD,

TRUE,/ * fDaclPresent标志* /

pACLNew,

FALSE)){/ *不是默认光盘。ACL */

ErrorHandler("SetSecurityDescriptorDacl");

goto Cleanup;

}

/ *将新的安全描述符应用于文件。*/

if(!SetFileSecurity(“d:\\\\ ntfs_sample_file”,

DACL_SECURITY_INFORMATION,

pSD)){

ErrorHandler("SetFileSecurity");

goto Cleanup;

}

TextOut(hdc, 10, yIncrement += 18,

"Successfully added access-allowed ACE to file's DACL.", 53);

清理:

FreeSid(pSID);

if(pSD != NULL)

LocalFree((HLOCAL) pSD);

if(pACLNew != NULL)

LocalFree((HLOCAL) pACLNew);

if(psnuType != NULL)

LocalFree((HLOCAL) psnuType);

if(lpszDomain != NULL)

LocalFree((HLOCAL) lpszDomain);