设置对象访问权限
使用 ADSI COM 对象 IADsSecurityDescriptor (安全描述符) 时, IADsAccessControlList (ACL 和 SCL) , IADsAccessControlEntry (ACE) ,你正在更改属性缓存中指定对象的 nTSecurityDescriptor 属性。 这意味着必须将方法放在包含新 ACE 的对象上,并且必须调用 IADs.SetInfo 方法,以便将更新后的安全描述符从属性缓存写入目录。
有关详细信息和在 Active Directory 域服务 中的对象上设置 ACE 的代码示例,请参阅在 Directory 对象上设置 ACE 的示例代码。
使用以下常规过程为访问权限创建 ACE,并在对象的 DACL 上设置该 ACE。
获取指向 对象的 IAD 接口 指针。
使用 IADs.Get 方法获取对象的安全描述符。 包含安全描述符的属性的名称为 nTSecurityDescriptor。 (vt 成员VT_DISPATCH) ,属性将作为包含 IDispatch 指针的 VARIANT 返回。 在该 IDispatch 指针上调用 QueryInterface 以获取 IADsSecurityDescriptor 接口,以使用该接口上的方法访问安全描述符的 ACL。
使用 IADsSecurityDescriptor.DiscretionaryAcl 属性获取 DACL。 方法返回 IDispatch 指针。 在该 IDispatch 指针上调用 QueryInterface 以获取 IADsAccessControlList 接口,以使用该接口上的方法访问 ACL 中的单个 ACE。
使用 CoCreateInstance 为新的 ACE 创建 ADSI COM 对象,并获取指向该对象的 IADsAccessControlEntry 接口指针。 请注意,类 ID CLSID_AccessControlEntry。
使用 IADsAccessControlEntry 方法设置 ACE 的属性:
- 使用 IADsAccessControlEntry::p ut_受托人 设置此 ACE 适用的受托人。 受信人是用户、组或其他安全主体。 应用程序应使用要向其应用 ACE 的受信者的用户或组对象的相应属性中的值。 受信人被指定为 BSTR ,可以采用以下形式:
- 域帐户 (以前版本的Windows NT) “domain>\<user account>”<中使用的登录名,其中“domain>”<是包含用户的Windows NT域的名称,“用户帐户>”<是指定用户的 sAMAccountName 属性。 例如:“fabrikam\jeffsmith”。
- 表示由Windows NT安全系统定义的特殊标识的已知安全主体,例如每个人、本地系统、主体自我、经过身份验证的用户、创建者所有者等。 表示已知安全主体的对象存储在配置容器下的已知安全主体容器中。 例如,匿名登录。
- 表示Windows NT安全系统定义的内置用户组的内置组。 其格式为“BUILTIN\<group name>”,其中“<组名称>”是内置用户组的名称。 表示内置组的对象存储在域容器下的 Builtin 容器中。 例如,“BUILTIN\Administrators”。
- SID (指定用户的字符串格式) ,这是指定用户的 objectSID 属性。 可以使用 Win32 安全性 API中的 ConvertSidToStringSid 函数转换为字符串形式。 例如:“S-1-5-32-548”。
- 使用 IADsAccessControlEntry.AccessMask 属性可设置指定访问权限的掩码。 ADS_RIGHTS_ENUM 枚举指定可以对目录对象设置的访问权限。
- 使用 IADsAccessControlEntry.AceType 属性指定是允许还是拒绝 AccessMask 设置的访问权限。 对于标准权限,可以 ADS_ACETYPE_ACCESS_ALLOWED 或 ADS_ACETYPE_ACCESS_DENIED。 对于对象特定的权限 (应用于对象的特定部分或特定类型的对象) 的权限,请使用 ADS_ACETYPE_ACCESS_ALLOWED_OBJECT 或 ADS_ACETYPE_ACCESS_DENIED_OBJECT。 ADS_ACETYPE_ENUM枚举指定可以在 ACE 上设置的访问类型。
- 使用 IADsAccessControlEntry.AceFlags 属性指定指定对象下的其他容器或对象是否可以继承 ACE。 ADS_ACEFLAG_ENUM枚举指定可以在 ACE 上设置的继承标志。
- 使用 IADsAccessControlEntry.Flags 属性指定权限是应用于对象的特定部分和/或继承的对象类型。
- 如果 Flags 设置为 ADS_FLAG_OBJECT_TYPE_PRESENT,则设置 IADsAccessControlEntry.ObjectType 属性 o 指定一个字符串,该字符串包含对象类的 GUID, (ADS_RIGHT_DS_CREATE_CHILD或ADS_RIGHT_DS_DELETE_CHILD) 、属性、属性集、验证写入或 ACE 适用的扩展权限。 必须将 GUID 指定为 COM 库中 StringFromGUID2 函数生成的格式的字符串。
- 如果将 Flags 设置为 ADS_FLAG_INHERITED_OBJECT_TYPE_PRESENT,请设置 IADsAccessControlEntry.InheritedObjectType 属性以指定包含 ACE 所应用到的继承对象类的 GUID 的字符串。 必须将 GUID 指定为 COM 库中 StringFromGUID2 函数生成的格式的字符串。
- 使用 IADsAccessControlEntry::p ut_受托人 设置此 ACE 适用的受托人。 受信人是用户、组或其他安全主体。 应用程序应使用要向其应用 ACE 的受信者的用户或组对象的相应属性中的值。 受信人被指定为 BSTR ,可以采用以下形式:
使用 IADsAccessControlEntry 对象上的 QueryInterface 方法获取 IDispatch 指针。 IADsAccessControlList.AddAce 方法需要指向 ACE 的 IDispatch 接口指针。
使用 IADsAccessControlList.AddAce 将新的 ACE 添加到 DACL。 请注意,ACL 中 ACE 的顺序可能会影响对对象的访问的评估。 若要正确访问对象,可能需要创建新的 ACL,以正确的顺序将现有 ACL 中的 ACL 添加到新 ACL,然后将安全描述符中的现有 ACL 替换为新的 ACL。 有关详细信息,请参阅 DACL 中 ACE 的顺序。
使用 IADsSecurityDescriptor.DiscretionaryAcl 属性将包含新 ACE 的 DACL 写入安全描述符。 有关 DACL 的详细信息,请参阅 Null DACL 和空 DACL。
使用 IADs.Put 方法将对象的 nTSecurityDescriptor 属性的安全描述符写入属性缓存。
使用 IADs.SetInfo 方法更新目录中对象的 属性。
反馈
提交和查看相关反馈