2

我有一种情况,我需要递归查找用户的 AD 组。

例如 :

I have such group hierarchy -
Group1
  |_
    Group2
      |_
        Group3
         |_
           UserA

根据层次结构,UserA 的 Groups 是 Group1, Group2, Group3

为了通过代码找到它,我使用了以下方法:

Dim UserP1 As UserPrincipal = UserPrincipal.FindByIdentity(ctx, IdentityType.SamAccountName, Remote_ID)
allrecursiveUserGroups = UserP1.GetAuthorizationGroups()

这种方法会递归地给我所有的组,但是对于一个用户来说它失败了,并且给出了如下的异常:

System.DirectoryServices.AccountManagement.dll 中发生“System.DirectoryServices.AccountManagement.PrincipalOperationException”

附加信息:尝试检索授权组时,发生错误 (1358)。

这是完整的 StackTrace :

System.DirectoryServices.AccountManagement.PrincipalOperationException 未处理 ErrorCode=0 HResult=-2146233087 消息=尝试检索授权组时,发生错误 (1358)。源=System.DirectoryServices.AccountManagement

StackTrace:在 System.DirectoryServices.AccountManagement.AuthZSet..ctor(字节 [] userSid,NetCred 凭据,ContextOptions contextOptions,字符串 flatUserAuthority,StoreCtx userStoreCtx,对象 userCtxBase)

在 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 获得的专有名称中存在特殊字符。

这里的问题是当 [Distinguished Name][2] ofUserPrincipal包含特殊字符(在我的情况下为逗号)时,它会引发异常。在我的情况下,专有名称是:

CN=史密斯\,约翰,DC=mydomain,DC=com

这里反斜杠被用作UserPrincipal自己添加的转义字符。

如果 [Distinguished Name][2] 不包含任何特殊字符,则函数 [GetAuthorizationGroups()][1] 可以正常工作。例如

CN=Smith John,DC=mydomain,DC=com

问题的原因是什么,是否有任何可用的解决方案?

我在使用GetAuthorizationGroups()方法的第一种方法中缺少什么?

错误代码 1358 的原因是什么?

GetAuthorisationGroups()除了类之外,还有其他递归查找组的好方法吗UserPrincipal

4

0 回答 0