为什么我们必须等待一段时间才能从UserPrincipal.GetAuthorizationGroups方法获取最新的组信息?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么我们必须等待一段时间才能从UserPrincipal.GetAuthorizationGroups方法获取最新的组信息?相关的知识,希望对你有一定的参考价值。

我们有一个AD用户,例如userA,它是GroupAGroupB的成员。

使用UserPrincipal.GetAuthorizationGroups方法提供这些组。

然后我们将userA添加到另一个组,例如GroupC

但是添加到新组并运行UserPrincipal.GetAuthorizationGroups方法之后,仍然显示GroupA,GroupB。 不显示GroupC

如果我们有时等待(大约10分钟),或者切换用户并再次登录,那么只有UserPrincipal.GetAuthorizationGroups方法显示GroupC以及GroupA,GroupB。

为什么我们必须等待或再次登录以获得最新值?

对于UserPrincipal.GetGroups方法,我们不必等待或再次登录。我们正在使用UserPrincipal.GetAuthorizationGroups方法,因为我们也需要嵌套组

答案

似乎特定的实现方式并非100%受信任。用户组将被缓存,并且该功能未将其考虑在内。

有关更多信息和解决方案,请点击此处https://milestone.topics.it/2012/12/userprincipalgetauthorizationgroupsoh-my.html

IEnumerable<String> GetGroups( String samAccountName )
{
    var userNestedMembership = new List<string>();

    var domainConnection = new DirectoryEntry();
    domainConnection.AuthenticationType = System.DirectoryServices.AuthenticationTypes.Secure;

    var samSearcher = new DirectorySearcher();

    samSearcher.SearchRoot = domainConnection;
    samSearcher.Filter = "(samAccountName=" + samAccountName + ")";
    samSearcher.PropertiesToLoad.Add( "displayName" );

    var samResult = samSearcher.FindOne();

    if ( samResult != null )
    {
        var theUser = samResult.GetDirectoryEntry();
        theUser.RefreshCache( new string[] { "tokenGroups" } );

        foreach ( byte[] resultBytes in theUser.Properties[ "tokenGroups" ] )
        {
            var SID = new SecurityIdentifier( resultBytes, 0 );
            var sidSearcher = new DirectorySearcher();

            sidSearcher.SearchRoot = domainConnection;
            sidSearcher.Filter = "(objectSid=" + SID.Value + ")";
            sidSearcher.PropertiesToLoad.Add( "name" );

            var sidResult = sidSearcher.FindOne();
            if ( sidResult != null )
            {
                userNestedMembership.Add( ( string )sidResult.Properties[ "name" ][ 0 ] );
            }
        }
    }

    return userNestedMembership;
}

以上是关于为什么我们必须等待一段时间才能从UserPrincipal.GetAuthorizationGroups方法获取最新的组信息?的主要内容,如果未能解决你的问题,请参考以下文章

前端用iframe要等待很长一段时间有啥解决方案吗?

如何让程序等待一段时间? [复制]

Android GPS 需要一段时间才能准确

c#编写的winform的时候怎么让程序等待一段时间~!

JS中实现等待一段时间之后开始定时循环执行某个方法?

等待一段时间不阻塞主线程