InteropServices.COMException

时间:2016-10-13 20:50:13

标签: c# asp.net-mvc active-directory

我遇到了MVC项目的问题。

堆栈如下:

System.Runtime.InteropServices.COMException(0x80005000):位于System.DirectoryServices.DirectoryEntry的System.DirectoryServices.DirectoryEntry.Bind()的System.DirectoryServices.DirectoryEntry.Bind(Boolean throwIfFail)中的未知错误(0x80005000)位于PosmanWeb2.Controllers.Helpers.SessionHelpers.GetPerfilAD(SearchResult结果)的PosmanWeb2.Controllers.Helpers.SessionHelpers.GetPerfilAD(SearchResult结果)位于PosmanWeb2.Controllers.Helpers.SessionHelpers.GetUser()位于PosmanWeb2.Controllers.Helpers的.get_Name()位于PosmanWeb2.Controllers.Helpers.SessionHelpers.GetGroup(SearchResult结果) .SessionHelpers.ConnectActiveDirectory()

SessionHelpers上的方法是proyect的一部分,最后一个似乎有问题,代码如下:

private static List<string> GetGroup(SearchResult result)
{
    List<string> nombresPerfilAD = new List<string>();

    foreach (var i in result.Properties["memberOf"])
    {
        var group = new DirectoryEntry(@"LDAP://" + i);      
        nombresPerfilAD.Add(group.Name.Split('=')[1].ToUpper().Trim());             
    }

    return nombresPerfilAD;
}  

它的基本功能是将所有Active Directory配置文件保存在列表中。

特别是一个用户没有这个问题,另外两个人有这个确切的问题。

我在其他主题上看到它可能与权限问题有关,但我不是100%确定在哪里看。

1 个答案:

答案 0 :(得分:1)

当前范围内的一个好解决方案是不绑定到Active Directory。 result.Properties [&#34; memberOf&#34;]已包含组DN。您可以从中获取名称而无需使用IADsPathName接口连接到AD(需要添加对ActiveDs com对象的引用)。您也可以使用此界面取消特殊字符。 E. g。如果您的组名是#Test,它将像\ #Test一样以转义的方式返回。因此,如果您通过以下方式重写方法,您将解决您的问题,提高性能并处理转义的字符:

    private static List<string> GetGroup(SearchResult result)
    {
        List<string> nombresPerfilAD = new List<string>();
        IADsPathname pathname = new PathnameClass();
        pathname.SetDisplayType(2);
        pathname.EscapedMode = 4;

        foreach (string groupDn in result.Properties["memberOf"])
        {
            pathname.Set(groupDn, 4);
            nombresPerfilAD.Add(pathname.GetElement(0).ToUpper());
        }

        return nombresPerfilAD;
    }

似乎绑定而不是用逗号分割是为了避免情况,当一个组在其名称中包含逗号时。但是如果组名包含&#34; =&#34;字符?旧代码不起作用

P.S。如果使用.NET 4,则需要在ActiveDs属性中将嵌入互操作类型设置为false(在项目引用中)

P.P.S。请注意,memberOf属性不包含嵌套组(userA - &gt; groupA,groupA - &gt; groupB =&gt; userA - &gt; groupB)和用户的主要组