我遇到需要递归查找用户AD组的情况。
例如:
I have such group hierarchy -
Group1
|_
Group2
|_
Group3
|_
UserA
根据层次结构,UserA的组是Group1,Group2,Group3
为了通过代码找到它,我使用了以下方法:
Dim UserP1 As UserPrincipal = UserPrincipal.FindByIdentity(ctx, IdentityType.SamAccountName, Remote_ID)
allrecursiveUserGroups = UserP1.GetAuthorizationGroups()
这个方法会以递归方式给我所有的组,但是对于一个用户而言失败并给出异常,如下所示:
' System.DirectoryServices.AccountManagement.PrincipalOperationException' 发生在System.DirectoryServices.AccountManagement.dll
中其他信息:尝试检索授权时 组,发生错误(1358)。
这是完整的StackTrace:
System.DirectoryServices.AccountManagement.PrincipalOperationException 未处理ErrorCode = 0 HResult = -2146233087 Message = While 尝试检索授权组时,发生错误(1358)。 源= System.DirectoryServices.AccountManagement
堆栈跟踪: 在System.DirectoryServices.AccountManagement.AuthZSet..ctor(Byte [] userSid,NetCred凭据,ContextOptions contextOptions,String flatUserAuthority,StoreCtx userStoreCtx,Object userCtxBase)
at System.DirectoryServices.AccountManagement.ADStoreCtx.GetGroupsMemberOfAZ(Principal) p) 在System.DirectoryServices.AccountManagement.UserPrincipal.GetAuthorizationGroups()
我使用的另一种方法是:
Dim UserP1 As UserPrincipal = UserPrincipal.FindByIdentity(ctx, IdentityType.SamAccountName, Remote_ID)
Dim grps = UserP1.GetGroups
这并没有抛出任何异常并且对所有用户都完美地运行,但它只返回直接组,即我的情况下的Group3
我在GetAuthorisationGroups面临的问题是我在UserPrincipal获得的专有名称中存在特殊字符。
这里的问题是当UserPrincipal
的[专有名称] [2]包含特殊字符(在我的情况下是逗号)时,它会抛出异常。
在我的例子中,专有名称是:
CN = Smith \,John,DC = mydomain,DC = com
此处反向斜杠已用作转义字符,由UserPrincipal
本身添加。
如果[专有名称] [2]不包含任何特殊字符,则[GetAuthorizationGroups()] [1]函数可以正常工作。 e.g。
CN = Smith John,DC = mydomain,DC = com
问题的原因是什么?有没有可用的解决方案?
我在使用GetAuthorizationGroups()
方法的第一种方法中缺少什么?
错误代码1358的原因是什么?
除了GetAuthorisationGroups()
UserPrincipal
个{{1}}以外,是否还有其他好方法可以递归查找群组