InteropServices.COMException

本文关键字:COMException InteropServices | 更新日期: 2023-09-27 18:12:54

我有一个MVC项目的问题。

堆栈如下:

System.Runtime.InteropServices。COMException (0x80005000): Unknown error (0x80005000) at System.DirectoryServices.DirectoryEntry. COMException (0x80005000)。Bind(Boolean throw wiffail) at System.DirectoryServices.DirectoryEntry.Bind() at System.DirectoryServices.DirectoryEntry.get_Name() at PosmanWeb2.Controllers.Helpers.SessionHelpers。在PosmanWeb2.Controllers.Helpers.SessionHelpers. GetGroup(SearchResult结果)。GetPerfilAD(SearchResult) at PosmanWeb2.Controllers.Helpers.SessionHelpers.GetUser() at posmanweb2 . controllers . helpers . sessionhelpers . connectacvedirectory ()

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

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%确定在哪里查找

InteropServices.COMException

在当前范围内,一个好的解决方案是不绑定到Active Directory。结果。属性["memberOf"]已包含组DN。无需连接AD,通过IADsPathName接口即可获取名称(需要添加对ActiveDs . com对象的引用)。还可以使用此接口取消特殊字符的转义。例如,如果你的组名是#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;
    }

似乎绑定而不是用逗号分隔是为了避免当组的名称中包含逗号时的情况。但是如果组名包含"="字符怎么办?旧代码不能工作

注:如果你使用。net 4,你需要在actived属性中(在项目引用中)将嵌入互操作类型设置为false

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