【问题标题】:From where PrincipalContext gets the connected server name?PrincipalContext 从哪里获取连接的服务器名称?
【发布时间】:2017-11-27 13:33:05
【问题描述】:

我有一个带有 Windows 身份验证的 Web 应用程序。当我调试线路时

var domainContext = new PrincipalContext(ContextType.Domain, "abc");

其中“abc”是域名。

我可以将连接的服务器视为域控制器名称。我想知道它从哪里获得 DC 名称。

实际上,问题是,即使特定 DC 被降级并添加了新 DC,我们的应用程序始终指向同一个降级 DC,并在我们尝试使用以下行获取用户组时抛出错误。

var user = UserPrincipal.FindByIdentity(domainContext, "username");
var groups = user.GetGroups();

[ActiveDirectoryServerDownException: 服务器无法运行。

名称:“DomainController.Domain.com”

]

System.DirectoryServices.ActiveDirectory.PropertyManager.GetPropertyValue(DirectoryContext context, DirectoryEntry directoryEntry, String propertyName) +510

System.DirectoryServices.ActiveDirectory.DirectoryEntryManager.ExpandWellKnownDN(WellKnownDN dn) +239

System.DirectoryServices.ActiveDirectory.DomainController.get_Domain() +71

System.DirectoryServices.AccountManagement.ADStoreCtx.GetGroupsMemberOf(Principal p) +839

System.DirectoryServices.AccountManagement.Principal.GetGroups() +32

我需要清除 IIS 缓存或其他缓存吗?我也重启了 IIS。

【问题讨论】:

    标签: c# active-directory windows-authentication iis-8


    【解决方案1】:

    如果您的服务器属于域控制器,您可以通过编程方式检索DC 名称。

        using (var context = new System.DirectoryServices.AccountManagement.PrincipalContext(ContextType.Domain))
        {
            server = context.ConnectedServer; 
            //Output : dc.example.com
            var formatted = server.Split('.').Select(s => String.Format("DC={0}", s));
            joined = String.Join(",", formatted); 
            // Output DC=dc,DC=example,DC=com
        }
    

    如果服务器不是域控制器的一部分。您可以使用这样的凭据来检索它;

            System.DirectoryServices.ActiveDirectory.DirectoryContext domainContext = new DirectoryContext(DirectoryContextType.Domain, "domainName", "domainUser", "Password");
            var domain = ActiveDirectory.Domain.GetDomain(domainContext);
            var controller = domain.FindDomainController();
    

    【讨论】:

    • 谢谢雨人。但问题是,这个应用程序很早就开始工作了,而且这是在 DC 的维护期间发生的。只是想知道 DC 名称保存在哪里以及从哪里获得。我可以添加新的 DC 名称。但是,将来,如果他们更改此设置,那么我需要再次更改配置。
    • 感谢您的代码。我想知道,线 server = context.ConnectedServer;从哪里获得 DC 名称。
    • 我不明白你到底在问什么? DC本身就是connectedserver。 DC=dc,DC=example,DC=com
    • 请检查我的问题“实际上,问题是,即使某个特定的 DC 被降级并添加了新的 DC,我们的应用程序总是指向同一个降级的 DC,并在我们尝试时抛出错误使用以下行获取用户组。”因此,行 context.ConnectedServer 仅提供旧的降级 DC 而不是添加的新 DC。所以,我想知道 DC 名称的保存位置以及它给我旧 DC 名称的形式。我应该怎么做才能获得新的 DC 名称。谢谢你的时间..
    • 它是定位器服务,它查询您的 dns 服务器,它返回最近的可用域控制器。当定位器得到一个时,它会 ping 它(有点)以检查服务器是否可用。然后它兑现域控制器。所以需要重启 dc 定位器服务或者提供 dc 给主体上下文来清除缓存(推荐)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-21
    • 2015-11-12
    • 1970-01-01
    相关资源
    最近更新 更多