转换msexchsecuritydescriptor属性
本文关键字:属性 msexchsecuritydescriptor 转换 | 更新日期: 2023-09-27 18:26:29
我从这里开始:
- 了解哪些用户对邮箱具有完全访问权限
并被告知使用CCD_ 1 AD属性。我找到
- 如何在C中读取msExchMailboxSecurityDescriptor属性#
但这不起作用,因为我不知道如何提供正确的p_InputValue。我收集了一个安全描述符:
ResultPropertyValueCollection msexchsd =
searchResult.Properties["msexchmailboxsecuritydescriptor"];
然后我试图得到一个值:
ResultPropertyValueCollection p_InputValue = msexchsd;
在运行时从ResultPropertyValueCollection向SecurityDescriptor抛出InvalidCastExceptionobject p_InputValue = msexchsd[0];
在运行时从System.Byte[]向SecurityDescriptor抛出InvalidCastExceptionbyte[] p_InputValue = (byte[])(msexchsd[0]);
在编译期间从byte[]向SecurityDescriptor抛出了"不允许隐式转换"String p_InputValue = System.Text.Encoding.UTF8.GetString((byte[])(msexchsd[0]));
在编译期间引发了从字符串到SecurityDescriptor的"不允许隐式转换"
所有这些错误都发生在这一行:
SecurityDescriptor sd = (SecurityDescriptor) p_InputValue;
我下一步可以尝试什么?我标记了唯一明显的偏差:在我看来,该属性似乎是System.Byte[],但我可以向SecurityDescriptor提供什么?
解决方案:
ResultPropertyValueCollection
无法转换为SecurityDescriptor
PropertyValueCollection
可以转换为SecurityDescriptor
- 使用
msexchmailboxsecuritydescriptor
2可以将ResultPropertyValueCollection
"转换"为PropertyValueCollection
我知道这是一个很老的问题,但我最近不得不做同样的事情,并找到了另一个解决方案,我想在这里分享。
由于您想读取邮箱的完全访问权限,因此这里有一个使用SecurityDescriptor
:的替代方案
var msexchsd = searchResult.Properties["msexchmailboxsecuritydescriptor"];
var dacl = new ActiveDirectorySecurity();
dacl.SetSecurityDescriptorBinaryForm(msexchsd);
var acls = dacl.GetAccessRules(true, false, typeof(SecurityIdentifier)); // valid target types are `NTAccount` and `SecurityIdentifier`
foreach (ActiveDirectoryAccessRule acl in acls) {
var hasFullAccess =
acl.AccessControlType == AccessControlType.Allow &&
acl.ActiveDirectoryRights.HasFlag(ActiveDirectoryRights.CreateChild);
var targetSid = (SecurityIdentifier)acl.IdentityReference; // the cast is ok because we have asked for the the identity to be a SecurityIdentifier above
}
根据我在应用程序中的测量,这个解决方案也比使用SecurityDescriptor
的解决方案快得多,但这可能取决于其他用例。