我遇到了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%确定在哪里看。
答案 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)和用户的主要组