CSecurityDesc 类

此类是 SECURITY_DESCRIPTOR 结构的包装器。

重要

无法在 Windows 运行时中执行的应用程序中使用此类及其成员。

语法

class CSecurityDesc

成员

公共构造函数

名称 描述
CSecurityDesc::CSecurityDesc 构造函数。
CSecurityDesc::~CSecurityDesc 析构函数。

公共方法

名称 描述
CSecurityDesc::FromString 将字符串格式安全描述符转换为有效的功能安全描述符。
CSecurityDesc::GetControl 从安全描述符中检索控制信息。
CSecurityDesc::GetDacl 从安全描述符中检索自由访问控制列表 (DACL) 信息。
CSecurityDesc::GetGroup 从安全描述符中检索主要组信息。
CSecurityDesc::GetOwner 从安全描述符中检索所有者信息。
CSecurityDesc::GetPSECURITY_DESCRIPTOR 返回指向 SECURITY_DESCRIPTOR 结构的指针。
CSecurityDesc::GetSacl 从安全描述符中检索系统访问控制列表 (SACL) 信息。
CSecurityDesc::IsDaclAutoInherited 确定 DACL 是否配置为支持自动传播。
CSecurityDesc::IsDaclDefaulted 确定是否为安全描述符配置了默认 DACL。
CSecurityDesc::IsDaclPresent 确定安全描述符是否包含 DACL。
CSecurityDesc::IsDaclProtected 确定 DACL 是否配置为防修改。
CSecurityDesc::IsGroupDefaulted 确定是否默认设置了安全描述符的组安全标识符 (SID)。
CSecurityDesc::IsOwnerDefaulted 确定是否默认设置了安全描述符的所有者 SID。
CSecurityDesc::IsSaclAutoInherited 确定 SACL 是否配置为支持自动传播。
CSecurityDesc::IsSaclDefaulted 确定是否为安全描述符配置了默认 SACL。
CSecurityDesc::IsSaclPresent 确定安全描述符是否包含 SACL。
CSecurityDesc::IsSaclProtected 确定 SACL 是否配置为防修改。
CSecurityDesc::IsSelfRelative 确定安全描述符是否采用自我相对格式。
CSecurityDesc::MakeAbsolute 调用此方法可将安全描述符转换为绝对格式。
CSecurityDesc::MakeSelfRelative 调用此方法可将安全描述符转换为自我相对格式。
CSecurityDesc::SetControl 设置安全说明符的控制位。
CSecurityDesc::SetDacl 在 DACL 中设置信息。 如果安全描述符中已存在一个 DACL,则将其替换。
CSecurityDesc::SetGroup 设置绝对格式安全描述符的主要组信息,并替换已存在的任何主要组信息。
CSecurityDesc::SetOwner 设置绝对格式安全描述符的所有者信息,并替换已存在的任何所有者信息。
CSecurityDesc::SetSacl 在 SACL 中设置信息。 如果安全描述符中已存在一个 SACL,则将其替换。
CSecurityDesc::ToString 将安全描述符转换为字符串格式。

公共运算符

“属性” 描述
CSecurityDesc::operator const SECURITY_DESCRIPTOR * 返回指向 SECURITY_DESCRIPTOR 结构的指针。
CSecurityDesc::operator = 赋值运算符。

备注

SECURITY_DESCRIPTOR 结构包含与对象关联的安全信息。 应用程序使用此结构来设置和查询对象的安全状态。 另请参阅 AtlGetSecurityDescriptor

应用程序不应直接修改 SECURITY_DESCRIPTOR 结构,而应使用提供的类方法。

有关 Windows 中访问控制模型的简介,请参阅 Windows SDK 中的访问控制

要求

标头: atlsecurity.h

CSecurityDesc::CSecurityDesc

构造函数。

CSecurityDesc() throw();
CSecurityDesc(const CSecurityDesc& rhs) throw(... );
CSecurityDesc(const SECURITY_DESCRIPTOR& rhs) throw(...);

参数

rhs
要分配到新 CSecurityDesc 对象的 CSecurityDesc 对象或 SECURITY_DESCRIPTOR 结构。

注解

可以选择使用 SECURITY_DESCRIPTOR 结构或以前定义的 CSecurityDesc 对象创建 CSecurityDesc 对象。

CSecurityDesc::~CSecurityDesc

析构函数。

virtual ~CSecurityDesc() throw();

备注

析构函数释放所有已分配的资源。

CSecurityDesc::FromString

将字符串格式安全描述符转换为有效的功能安全描述符。

bool FromString(LPCTSTR pstr) throw(...);

参数

pstr
指向以 null 结尾的字符串的指针,该字符串包含要转换的字符串格式安全描述符

返回值

成功时返回 true。 失败时引发异常。

备注

可以使用 CSecurityDesc::ToString 创建字符串。 将安全描述符转换为字符串可以更方便地存储和传输。

此方法调用 ConvertStringSecurityDescriptorToSecurityDescriptor

CSecurityDesc::GetControl

从安全描述符中检索控制信息。

bool GetControl(SECURITY_DESCRIPTOR_CONTROL* psdc) const throw();

参数

psdc
指向接收安全描述符的控制信息的 SECURITY_DESCRIPTOR_CONTROL 结构的指针。

返回值

如果该方法成功,则返回 true,如果失败则返回 false。

备注

此方法调用 GetSecurityDescriptorControl

CSecurityDesc::GetDacl

从安全描述符中检索自由访问控制列表 (DACL) 信息。

bool GetDacl(
    CDacl* pDacl,
    bool* pbPresent = NULL,
    bool* pbDefaulted = NULL) const throw(...);

参数

pDacl
指向用于存储安全描述符的 DACL 副本的 CDacl 结构的指针。 如果存在自由 ACL,则该方法会将 pDacl 设置为安全描述符的自由 ACL 的地址。 如果不存在自由 ACL,则不存储任何值。

pbPresent
指向一个值的指针,该值指示指定的安全描述符中是否存在自由 ACL。 如果安全描述符包含自由 ACL,则此参数将设置为 true。 如果安全描述符不包含自由 ACL,则此参数将设置为 false。

pbDefaulted
如果安全描述符存在自由 ACL,则为指向一个标志的指针,该标志设置为 SECURITY_DESCRIPTOR_CONTROL 结构中 SE_DACL_DEFAULTED 标志的值。 如果此标志为 true,则自由 ACL 由默认机制检索;如果为 false,则自由 ACL 由用户显式指定。

返回值

如果该方法成功,则返回 true,如果失败则返回 false。

CSecurityDesc::GetGroup

从安全描述符中检索主要组信息。

bool GetGroup(
    CSid* pSid,
    bool* pbDefaulted = NULL) const throw(...);

参数

pSid
指向接收 CDacl 中存储的组副本的 CSid(安全标识符)的指针。

pbDefaulted
方法返回时指向一个标志的指针,该标志设置为 SECURITY_DESCRIPTOR_CONTROL 结构中 SE_GROUP_DEFAULTED 标志的值。

返回值

如果该方法成功,则返回 true,如果失败则返回 false。

CSecurityDesc::GetOwner

从安全描述符中检索所有者信息。

bool GetOwner(
    CSid* pSid,
    bool* pbDefaulted = NULL) const throw(...);

参数

pSid
指向接收 CDacl 中存储的组副本的 CSid(安全标识符)的指针。

pbDefaulted
方法返回时指向一个标志的指针,该标志设置为 SECURITY_DESCRIPTOR_CONTROL 结构中 SE_OWNER_DEFAULTED 标志的值。

返回值

如果该方法成功,则返回 true,如果失败则返回 false。

CSecurityDesc::GetPSECURITY_DESCRIPTOR

返回指向 SECURITY_DESCRIPTOR 结构的指针。

const SECURITY_DESCRIPTOR* GetPSECURITY_DESCRIPTOR() const throw();

返回值

返回指向 SECURITY_DESCRIPTOR 结构的指针。

CSecurityDesc::GetSacl

从安全描述符中检索系统访问控制列表 (SACL) 信息。

bool GetSacl(
    CSacl* pSacl,
    bool* pbPresent = NULL,
    bool* pbDefaulted = NULL) const throw(...);

参数

pSacl
指向用于存储安全描述符的 SACL 副本的 CSacl 结构的指针。 如果系统 ACL 存在,则该方法会将 pSacl 设置为安全描述符的系统 ACL 的地址。 如果系统 ACL 不存在,则不存储任何值。

pbPresent
指向方法设置的标志的指针,以指示指定的安全描述符中是否存在系统 ACL。 如果安全描述符包含系统 ACL,则此参数将设置为 true。 如果安全描述符不包含系统 ACL,则此参数将设置为 false。

pbDefaulted
如果安全描述符存在系统 ACL,则为指向一个标志的指针,该标志设置为 SECURITY_DESCRIPTOR_CONTROL 结构中 SE_SACL_DEFAULTED 标志的值。

返回值

如果该方法成功,则返回 true,如果失败则返回 false。

CSecurityDesc::IsDaclAutoInherited

确定自由访问控制列表 (DACL) 是否配置为支持自动传播。

bool IsDaclAutoInherited() const throw();

返回值

如果安全描述符包含设置为支持将可继承访问控制条目 (ACE) 自动传播到现有子对象的 DACL,则返回 true。 否则,返回 false。

备注

系统在执行对象及其现有子对象的自动继承算法时设置此位。

CSecurityDesc::IsDaclDefaulted

确定是否为安全描述符配置了默认的自由访问控制列表 (DACL)。

bool IsDaclDefaulted() const throw();

返回值

如果安全描述符包含默认 DACL,则返回 true,否则返回 false。

注解

此标志可能影响系统处理 DACL 的访问控制条目 (ACE) 继承方面的方式。 例如,如果某个对象的创建者未指定 DACL,则该对象会从创建者的访问令牌接收默认 DACL。 如果未设置 SE_DACL_PRESENT 标志,系统将忽略此标志。

此标志用于确定如何计算对象的最终 DACL,而不会以物理方式存储在安全对象的安全描述符控制机制中。

若要设置此标志,请使用 CSecurityDesc::SetDacl 方法。

CSecurityDesc::IsDaclPresent

确定安全描述符是否包含自由访问控制列表 (DACL)。

bool IsDaclPresent() const throw();

返回值

如果安全描述符包含 DACL,则返回 true,否则返回 false。

注解

如果未设置此标志,或者设置了此标志但 DACL 为 NULL,则安全描述符允许任何人进行全权访问。

此标志用于保存调用方指定的安全信息,直到安全描述符与安全对象相关联。 将安全描述符与安全对象关联后,始终会在安全描述符控制机制中设置 SE_DACL_PRESENT 标志。

若要设置此标志,请使用 CSecurityDesc::SetDacl 方法。

CSecurityDesc::IsDaclProtected

确定是否将自由访问控制列表 (DACL) 配置为防修改。

bool IsDaclProtected() const throw();

返回值

如果 DACL 配置为防止可继承访问控制条目 (ACE) 修改安全描述符,则返回 true。 否则,返回 false。

注解

若要设置此标志,请使用 CSecurityDesc::SetDacl 方法。

此方法支持自动传播可继承 ACE。

CSecurityDesc::IsGroupDefaulted

确定是否默认设置了安全描述符的组安全标识符 (SID)。

bool IsGroupDefaulted() const throw();

返回值

如果默认机制(而不是安全描述符的原始提供者)提供了安全描述符的组 SID,则返回 true。 否则,返回 false。

注解

若要设置此标志,请使用 CSecurityDesc::SetGroup 方法。

CSecurityDesc::IsOwnerDefaulted

确定是否默认设置了安全描述符的所有者安全标识符 (SID)。

bool IsOwnerDefaulted() const throw();

返回值

如果默认机制(而不是安全描述符的原始提供者)提供了安全描述符的所有者 SID,则返回 true。 否则,返回 false。

备注

若要设置此标志,请使用 CSecurityDesc::SetOwner 方法。

CSecurityDesc::IsSaclAutoInherited

确定系统访问控制列表 (SACL) 是否配置为支持自动传播。

bool IsSaclAutoInherited() const throw();

返回值

如果安全描述符包含设置为支持将可继承访问控制条目 (ACE) 自动传播到现有子对象的 SACL,则返回 true。 否则,返回 false。

备注

系统在执行对象及其现有子对象的自动继承算法时设置此位。

CSecurityDesc::IsSaclDefaulted

确定是否为安全描述符配置了默认的系统访问控制列表 (SACL)。

bool IsSaclDefaulted() const throw();

返回值

如果安全描述符包含默认 SACL,则返回 true,否则返回 false。

备注

此标志可能影响系统处理 SACL 的访问控制条目 (ACE) 继承方面的方式。 如果未设置 SE_SACL_PRESENT 标志,系统将忽略此标志。

若要设置此标志,请使用 CSecurityDesc::SetSacl 方法。

CSecurityDesc::IsSaclPresent

确定安全描述符是否包含系统访问控制列表 (SACL)。

bool IsSaclPresent() const throw();

返回值

如果安全描述符包含 SACL,则返回 true,否则返回 false。

注解

若要设置此标志,请使用 CSecurityDesc::SetSacl 方法。

CSecurityDesc::IsSaclProtected

确定是否将系统访问控制列表 (SACL) 配置为防修改。

bool IsSaclProtected() const throw();

返回值

如果 SACL 配置为防止可继承访问控制条目 (ACE) 修改安全描述符,则返回 true。 否则,返回 false。

备注

若要设置此标志,请使用 CSecurityDesc::SetSacl 方法。

此方法支持自动传播可继承 ACE。

CSecurityDesc::IsSelfRelative

确定安全描述符是否采用自我相对格式。

bool IsSelfRelative() const throw();

返回值

如果安全描述符采用自我相对格式,并且所有安全信息存储在连续内存块中,则返回 true。 如果安全描述符采用绝对格式,则返回 false。 有关详细信息,请参阅绝对和自我相对安全描述符

CSecurityDesc::MakeAbsolute

调用此方法可将安全描述符转换为绝对格式。

bool MakeAbsolute() throw(...);

返回值

如果该方法成功,则返回 true,否则返回 false。

注解

采用绝对格式的安全描述符包含指向它所包含的信息的指针,而不是信息本身。 采用自我相对格式的安全描述符包含连续内存块中的信息。 在自我相对安全描述符中,SECURITY_DESCRIPTOR 结构始终是信息的开头部分,但安全描述符的其他组成部分能够以任意顺序接在该结构的后面。 自我相对安全描述符的组成部分不使用内存地址,而是由安全描述符开头的偏移来标识。 当安全描述符必须存储在磁盘上或通过通信协议传输时,这种格式很有用。 有关详细信息,请参阅绝对和自我相对安全描述符

CSecurityDesc::MakeSelfRelative

调用此方法可将安全描述符转换为自我相对格式。

bool MakeSelfRelative() throw(...);

返回值

如果该方法成功,则返回 true,否则返回 false。

备注

采用绝对格式的安全描述符包含指向它所包含的信息的指针,而不是包含信息本身。 采用自我相对格式的安全描述符包含连续内存块中的信息。 在自我相对安全描述符中,SECURITY_DESCRIPTOR 结构始终是信息的开头部分,但安全描述符的其他组成部分能够以任意顺序接在该结构的后面。 安全描述符的组成部分不使用内存地址,而是由安全描述符开头的偏移来标识。 当安全描述符必须存储在磁盘上或通过通信协议传输时,这种格式很有用。 有关详细信息,请参阅绝对和自我相对安全描述符

CSecurityDesc::operator =

赋值运算符。

CSecurityDesc& operator= (const SECURITY_DESCRIPTOR& rhs) throw(...);
CSecurityDesc& operator= (const CSecurityDesc& rhs) throw(...);

参数

rhs
要分配到 CSecurityDesc 对象的 SECURITY_DESCRIPTOR 结构或 CSecurityDesc 对象。

返回值

返回更新的 CSecurityDesc 对象。

CSecurityDesc::operator const SECURITY_DESCRIPTOR *

将值强制转换为指向 SECURITY_DESCRIPTOR 结构的指针。

operator const SECURITY_DESCRIPTOR *() const throw();

CSecurityDesc::SetControl

设置安全说明符的控制位。

bool SetControl(
    SECURITY_DESCRIPTOR_CONTROL ControlBitsOfInterest,
    SECURITY_DESCRIPTOR_CONTROL ControlBitsToSet) throw();

参数

ControlBitsOfInterest
指示要设置的控制位的 SECURITY_DESCRIPTOR_CONTROL 掩码。 有关可设置的标志的列表,请参阅 SetSecurityDescriptorControl

ControlBitsToSet
一个 SECURITY_DESCRIPTOR_CONTROL 掩码,指示 ControlBitsOfInterest 掩码指定的控制位的新值。 此参数可以是为 ControlBitsOfInterest 参数列出的标志的组合

返回值

如果成功,则返回 true;如果失败,则返回 false。

备注

此方法调用 SetSecurityDescriptorControl

CSecurityDesc::SetDacl

在自由访问控制列表 (DACL) 中设置信息。 如果安全描述符中已存在一个 DACL,则将其替换。

inline void SetDacl(
    bool bPresent = true,
    bool bDefaulted = false) throw(...);

inline void SetDacl(
    const CDacl& Dacl,
    bool bDefaulted = false) throw(...);

参数

Dacl
CDacl 对象的引用,该对象指定安全描述符的 DACL。 此参数不能为 NULL。 若要在安全描述符中设置 NULL DACL,应使用该方法的第一种形式并将 bPresent 设置为 false

bPresent
指定一个标志用于指示安全描述符中是否存在 DACL。 如果此参数为 true,则该方法会在 SECURITY_DESCRIPTOR_CONTROL 结构中设置 SE_DACL_PRESENT 标志,并使用 Dacl 和 bDefaulted 参数中的值。 如果为 false,则该方法会清除 SE_DACL_PRESENT 标志,并忽略 bDefaulted

bDefaulted
指定一个标志用于指示 DACL 的源。 如果此标志为 true,则已通过某种默认机制检索 DACL。 如果为 false,则 DACL 已由用户显式指定。 该方法将此值存储在 SECURITY_DESCRIPTOR_CONTROL 结构的 SE_DACL_DEFAULTED 标志中。 如果未指定此参数,则会清除 SE_DACL_DEFAULTED 标志。

返回值

如果成功,则返回 true;如果失败,则返回 false。

备注

空的和不存在的 DACL 之间存在一个重要差别。 当 DACL 为空时,它不包含访问控制条目,且未为它显式授予访问权限。 因此会隐式拒绝访问对象。 另一方面,当某个对象没有 DACL 时,将不会为该对象分配保护,并且会授予任何访问请求。

CSecurityDesc::SetGroup

设置绝对格式安全描述符的主要组信息,并替换已存在的任何主要组信息。

bool SetGroup(const CSid& Sid, bool bDefaulted = false) throw(...);

参数

Sid
对安全描述符的新主要组的 CSid 对象的引用。 此参数不能为 NULL。 安全描述符可以标记为没有 DACL 或 SACL,但它必须有一个组和一个所有者,即使它的 SID(具有特殊含义的内置 SID)为 NULL。

bDefaulted
指示主要组信息是否派生自默认机制。 如果此值为 true,则主要组信息是默认信息,该方法会将此值作为 SE_GROUP_DEFAULTED 标志存储在 SECURITY_DESCRIPTOR_CONTROL 结构中。 如果此参数为零,则会清除 SE_GROUP_DEFAULTED 标志。

返回值

如果成功,则返回 true;如果失败,则返回 false。

CSecurityDesc::SetOwner

设置绝对格式安全描述符的所有者信息。 它会替换已存在的任何所有者信息。

bool SetOwner(const CSid& Sid, bool bDefaulted = false) throw(...);

参数

Sid
安全描述符的新主要所有者的 CSid 对象。 此参数不能为 NULL。

bDefaulted
指示所有者信息是否派生自默认机制。 如果此值为 true,则所有者信息为默认信息。 该方法将此值作为 SE_OWNER_DEFAULTED 标志存储在 SECURITY_DESCRIPTOR_CONTROL 结构中。 如果此参数为零,则会清除 SE_OWNER_DEFAULTED 标志。

返回值

如果成功,则返回 true;如果失败,则返回 false。

CSecurityDesc::SetSacl

在系统访问控制列表 (SACL) 中设置信息。 如果安全描述符中已存在一个 SACL,则将其替换。

bool SetSacl(const CSacl& Sacl, bool bDefaulted = false) throw(...);

参数

Sacl
指向用于为安全描述符指定 SACL 的 CSacl 对象的指针。 此参数不能为 NULL,并且必须是 CSacl 对象。 与 DACL 不同,NULL 和空 SACL 之间没有差别,因为 SACL 对象不指定访问权限,而只指定审核信息。

bDefaulted
指定一个标志用于指示 SACL 的源。 如果此标志为 true,则已通过某种默认机制检索 SACL。 如果为 false,则 SACL 已由用户显式指定。 该方法将此值存储在 SECURITY_DESCRIPTOR_CONTROL 结构的 SE_SACL_DEFAULTED 标志中。 如果未指定此参数,则会清除 SE_SACL_DEFAULTED 标志。

返回值

如果成功,则返回 true;如果失败,则返回 false。

CSecurityDesc::ToString

将安全描述符转换为字符串格式。

bool ToString(
    CString* pstr, SECURITY_INFORMATION si = OWNER_SECURITY_INFORMATION |
    GROUP_SECURITY_INFORMATION | DACL_SECURITY_INFORMATION |
    SACL_SECURITY_INFORMATION) const throw(...);

参数

pstr
指向以 null 结尾的字符串的指针,该字符串将接收字符串格式安全描述符

si
指定 SECURITY_INFORMATION 位标志的组合,指示要包含在输出字符串中的安全描述符的组成部分。

返回值

如果成功,则返回 true;如果失败,则返回 false。

备注

安全描述符采用字符串格式后,可以更方便地存储或传输它。 使用 CSecurityDesc::FromString 方法将字符串转换回安全描述符。

si 参数可包含以下 SECURITY_INFORMATION 标志

含义
OWNER_SECURITY_INFORMATION 包括所有者。
GROUP_SECURITY_INFORMATION 包括主要组。
DACL_SECURITY_INFORMATION 包括 DACL。
SACL_SECURITY_INFORMATION 包括 SACL。

如果 DACL 为 NULL 并且在输入安全描述符中设置了 SE_DACL_PRESENT 控制位,则该方法将会失败。

如果 DACL 为 NULL 并且未在输入安全描述符中设置 SE_DACL_PRESENT 控制位,则生成的安全描述符字符串没有 D: 组成部分。 有关更多详细信息,请参阅安全描述符字符串格式

此方法调用 ConvertStringSecurityDescriptorToSecurityDescriptor

另请参阅

安全示例
SECURITY_DESCRIPTOR
类概述
安全全局函数