2

通常 AD 返回 'Objectsid' 作为byte[]. 所以我将 AD 返回的值输入到byte[]. 此程序对几个 AD 有效,但在一个案例中无效。在这个 AD 环境中,我得到以下异常。

例外:无法将“System.String”类型的对象转换为“System.Byte[]”类型。(System.InvalidCastException)

为了调试这个,我开始检查 AD 返回值的数据类型,但它system.string不是byte[]. 我打印了这个字符串,它是垃圾。然后我把这个字符串传递给SecurityIdentifier(),我又得到了异常。

例外:值无效。参数名称:sddlForm (System.ArgumentException)

代码:

//Using System.DirectoryServices.Protocols objects
object s = objSrEc[k1].Attributes[(string)obj3.Current][0];
string x = s.GetType().FullName;

if (x.ToLower() == "system.byte[]")
{
  byte[] bSID = ((byte[])s);
  if (bSID != null)
  {
    SecurityIdentifier SID = new SecurityIdentifier(bSID, 0); 
    String ObjectSID = SID.Value;
  }
}
else if (x.ToLower() == "system.string")
{
  SecurityIdentifier SID = new SecurityIdentifier((String)s); //ssdl excception
  String ObjectSID = SID.Value;
}

这是我第一次看到 AD 返回字符串数据ObjectSID。我已经针对许多 AD 服务器运行了我的代码。我打算检查ObjectSIDAD 架构中的数据类型。

有没有人遇到过这种行为?我应该调用 Win32 apiConvertByteToStringSid()吗?

谢谢拉梅什

4

2 回答 2

1

很抱歉恢复了墓地帖子,但大约一年前我遇到了同样的问题,设法找出原因,我想我至少会分享这种行为背后的原因。

使用 System.DirectoryServices.Protocols 命名空间时,所有属性值都应该是 a) 字节数组或 b) UTF-8 字符串。问题是,微软的开发人员认为,当从底层 LDAP API 返回的字节数组可以格式化为 1 时,他们应该通过返回一个字符串来帮助人们,当 UTF-8 转换失败时返回字节数组本身。但是,这仅适用于 DirectoryAttribute 类的索引而不适用于迭代器(它始终返回字节数组)或 GetValues 方法。

当您需要 SID 时,始终获取字节数组的最安全方法是,正如其他人之前提到的,GetValues 方法。

于 2016-05-13T13:17:32.957 回答
0


我也经历过。在处理 ForeignSecurityPrincipals 时发现这种行为是正常的,但是最近在从一些旧的 Win 2K3 域转换内置组的属性时发现了这种情况。
我不喜欢这样,因为不能只要求结果属性通过 GetType() 告诉我你是什么类型以及我应该对你做什么( GetValues(Attribute.GetType()) )。其中一个解决方案是从 AD 模式中读取所有属性定义,但这部分可能有点繁重(取决于您要查找的内容),尽管它只是解决方案正在执行的整个 AD 处理的一小部分。

干杯,
格雷格

于 2013-11-02T13:59:11.313 回答