贝贝花花包包店,精品555皮具,钱夹,皮夹

字体: | 推荐给好友 上一篇 | 下一篇

Windows2000 服务器端应用程序开发设计指南-存取控制(1)

发布: 2008-5-01 20:59 | 作者: Jeffrey Richter Jaso | 来源: 网络转载 | 查看: 270次


说明

当对象拥有当前的DACL时,所有对对象的存取皆会被暗地拒绝,除非明确地允许。有时候对象会有空的DACL,而这不该与NULL DACL混淆。一个空的对象表示任何人(除了拥有者)都无法对此对象做存取。另一方面,一个NULL DACL允许所有的存取给所有信任成员。


假如有当前的DACL,则撷取DACL中相关ACEs的资讯可能是必需的。首先,您必须经由呼叫GetAclInformation,以找出DACL包含多少ACEs:

BOOL GetAclInformation( 

PACL pACL,
PVOID pACLInformation,
DWORD dwACLInformationLength,
ACL_INFORMATION_CLASS aclInformationClass);

此函数可让您撷取经由pACL参数传递到这个函数的DACL(或是SACL)相关资讯。您应该传递结构的位址以取得ACL资讯为pACLInformation参数,而结构的长度则为dwACLInformationLength参数。AclInformationClass参数是个列举型态,它指出被传回的资讯类型,也定义您应该传递哪种结构类型为pACLInformation参数。表10-9列出AclInformationClass参数的可能值。

 表10-9 ACL_INFORMATION_CLASS列举型态
列举值 结构 定义
AclRevisionInformation ACL_REVISION_INFORMATION 传回ACL修订资讯
AclSizeInformation ACL_SIZE_INFORMATION 传回ACL大小的资讯,包括ACE总数

ACL_SIZE_INFORMATION结构最常与GetAclInformation一起使用,其定义如下:

typedef struct _ACL_SIZE_INFORMATION { 

DWORD AceCount;
DWORD AclBytesInUse;
DWORD AclBytesFree;
}ACL_SIZE_INFORMATION;

以下的程序代码片段撷取了C:\Test\Text.txt文件之DACL中的ACES数量。

PSECURITY_DESCRIPTOR pSD;  

PACL pDACL;
ULONG lErr = GetNamedSecurityInfo(TEXT("C:\\Test\\Test.txt"),
SE_FILE_OBJECT, DACL_SECURITY_INFORMATION, NULL, NULL,
&pDACL, NULL, &pSD);
if (lErr != ERROR_SUCCESS){
// 错误实例
}
ACL_SIZE_INFORMATION aclSize = {0};
if(pDACL != NULL){
if(!GetAclInformation(pDACL, &aclSize, sizeof(aclSize),
AclSizeInformation)){
// 错误实例
}
}
ULONG nAceCount = aclSize.AceCount;

说明

假如C:\Test\Test.txt文件存在FAT磁盘上,或是它没有DACL,系统会在pDACL变数中传回NULL。这就是为什么在呼叫GetAclInformation之前测试NULL是很重要的原因。传递NULL指标值到GetAclInformation中,会导致违规存取的情形。


拥有DACL中的ACEs数量后,可以使用这个资讯去撷取个别的ACEs。GetAce的呼叫方式如下。

BOOL GetAce( 

PACL pACL,
DWORD dwACEIndex,
PVOID *pACE);

这个函数简单地取得指标,指向ACL、您想要取得ACE以0为基础的索引、以及储存DACL中指向ACE的指标的指标变数位址。

请注意pace参数是PVOID类型。这是因为一些不同的ACE类型属于DACL,而每个类型都由一种不同的结构表示。GetAce被用来撷取每个类型。然而,ACLs可以包含任何数量的ACEs及任何ACE类型的组合,所以在您用GetAce撷取ACE前,不可能知道ACEs的类型。

尽管撷取ACE总数及ACE本身是简单的,研读DACL的真正工作变成去认识不同类型的ACEs。

认识ACEs
 

有些不同的ACE类型可以被分割成两个广泛的类型:标准ACEs及对象ACEs。您可以在每一组中找到允许、拒绝存取和稽核存取的ACE类型。每个ACE类型必定会分享共同的属性-即其结构第一个成员为ACE_HEADER类型,定义如下:

typedef struct _ACE_HEADER { 

BYTE AceType;
BYTE AceFlags;
USHORT AceSize;
}ACE_HEADER;

ACE标头对于读取DACL来说是重要的,因为当您从GetAce撷取指向ACE的指标时,在读取ACE的标头前,并不知道ACE的类型或是组成ACE的结构类型。

如您所猜测的,ACE标头的AceType成员指出了标头代表的ACE类型。表10-10列出了AceType可能的值。这六种ACE类型可在Windows 2000中使用。

 表10-10 ACE类型
ACE类型 叙述
ACCESS_ALLOWED_ACE_TYPE 在DACL中使用,指出一组明确地授予给信任成员的存取权利,使用ACCESS_ ALLOWED_ACE结构。
ACCESS_DENIED_ACE_TYPE 在DACL中使用,指出一组明确地拒绝给予信任成员的存取权利,使用ACCESS_ DENIED_ACE结构。
SYSTEM_AUDIT_ACE_TYPE 在SACL(请参阅〈 稽核及SACL 〉一节)中使用,指出要求一组信任成员时,可能会产生稽核事件的存取权利,使用SYSTEM_AUDIT_ACE结构。
ACCESS_ALLOWED_OBJECT_ACE_TYPE 在目录服务对象的DACL中使用,指出一组明确授予代表Active Directory中某个对象之信任成员的存取权利,使用ACCESS_ALLOWED_OBJECT_ACE结构。
ACCESS_DENIED_OBJECT_ACE_TYPE 在目录服务对象的DACL中使用。指出一组明确拒绝给予代表Active Directory中某个对象之信任成员的存取权利,使用ACCESS_DENIED_OBJECT_ACE结构。
SYSTEM_AUDIT_OBJECT_ACE_TYPE 在目录服务对象的SACL(请参阅〈 稽核及SACL 〉一节)中使用,指出要求一组信任成员时,可能产生稽核事件的存取权利,使用SYSTEM_AUDIT_OBJECT_ ACE结构。

ACE_HEADE结构的AceFlags成员包含关于ACE的继承及稽核资讯。AceFlag成员将是表10-11中某些值的组合。

 表10-11 ACE_HEADER结构的AceFlags成员的值
说明
继承标记
INHERITED_ACE 如果这个标记是从父对象继承过来的,则在ACE中设定这个标记,这可让系统区别直接作用的ACEs及因为继承而自动作用的ACEs。
CONTAINER_INHERIT_ACE 拥有这个ACE的对象,其子系的容器对象将会继承这个ACE,以做为有效的ACE。
  这种继承为预设的,然而,如果也有设定NO_PROPAGATE_INHERIT_ACE标记的话,直系的子系可以设定为停止继承。假如这个位元没有被设定,但是有设定OBJECT_INHERIT_ACE位元,则ACE将会继承容器对象,并为容器的ACE设定INHERIT_ONLY_ACE标记。
OBJECT_INHERIT_ACE 这个ACE被继承且作用于自有对象的非容器及子对象。对于容器的子对象,除非也有设定CONTAINER_INHERIT_ACE标记,否则ACE只能如继承ACE一样被继承。
  假如设定了NO_PROPAGATE_INHERIT_ACE标记及CONTAINER_INHERIT_ACE标记,有设定OBJECT_ NHERIT_ACE位元的ACE将不会继承容器对象。
INHERIT_ONLY_ACE 这个ACE在拥有ACE的对象上无作用,不过它在子容器或非容器子对象上可能有效。
  它对于有设定INHERIT_ONLY_ACE标记的ACE是无效的,除非CONTAINER_INHERIT_ACE及OBJECT_INHERIT_ACE标记的其中一个或两个有被设定。
NO_PROPAGATE_INHERIT_ACE 在ACE中设定这个标记会使它只能被继承一次。继承的ACEs将清除它们的OBJECT_INHERIT_ ACE及CONTAINER_INHERIT_ACE标记,以至于新的ACEs不会被继承。
稽核标记
FAILED_ACCESS_ACE_FLAG 在SACL中,假如存取被要求,且结果是ACCESS_DENIED时,设定这个位元的ACE将产生稽核事件。
SUCCESSFUL_ACCESS_ACE_FLAG 与SACL中的系统稽核ACEs一起使用,为成功的存取尝试产生稽核讯息。

除了ACE类型及标记之外,ACE_HEADER结构的AceSize成员会指出讨论中的ACE大小。如您所见的,ACE_HEADER包含了关于ACE的丰富资讯数量。事实上,在呼叫GetAce时,如果您只要撷取有关ACE的继承及类型资讯时,可以不用看到太深入的ACE_HEADER结构。以下的程序代码片段显示了如何呼叫GetAce,以撷取ACE的类型:

ACE_HEADER* pACEHeader ;  

GetAce(pDACL, 0, (PVOID*)&pACEHeader);
switch(pACEHeader->AceType ){
// 根据ACE的类型作用
}

既然您在ACE中通常不只要求类型及继承式样的资讯,您必须探寻ACE_HEADER的内容。有两种主要的ACEs类型—标准及对象,标准ACEs不是对象ACEs的ACEs;对象ACEs只与Active Directory一起使用。它们被称为对象ACEs是因为它们包含了GUIDs,GUIDs使它们与目录服务可得的许多对象类型一起工作成为可能。标准ACEs无疑是最常见的,所以我们将首先讨论。

 标准ACEs 系统中大部分的安全对象专门处理标准ACEs。存在于Active Directory的对象是例外的情形,它被称为 目录服务对象 

就像所有的ACEs一般,标准ACEs由叁种结构来表示,分别是允许存取、拒绝存取及稽核。以下是每个结构的定义:

 

评分:0

我来说两句

seccode