本主题介绍如何使用低级功能来处理允许访问对象的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);