转换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抛出InvalidCastException
  • object p_InputValue = msexchsd[0];在运行时从System.Byte[]向SecurityDescriptor抛出InvalidCastException
  • byte[] 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提供什么?

转换msexchsecuritydescriptor属性

解决方案:

  • ResultPropertyValueCollection无法转换为SecurityDescriptor
  • PropertyValueCollection可以转换为SecurityDescriptor
  • 使用msexchmailboxsecuritydescriptor2可以将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的解决方案快得多,但这可能取决于其他用例。