C# 给定用户id、密码和子域名,如何获取用户帐户的顶级域名?

C# 给定用户id、密码和子域名,如何获取用户帐户的顶级域名?,c#,winforms,active-directory,ldap,domain-name,C#,Winforms,Active Directory,Ldap,Domain Name,我正在编写一个程序(WinForms,C#),它运行在win7客户机上。它从用户处获取凭据(用户id、密码和子域名),并使用这些凭据(通过Active Directory)对程序远程连接的其他服务器进行身份验证。其他服务器位于与Win 7客户端计算机所在的域不同的域上 使用NetworkCredential、LdapDirectoryIdentifier和LdapConnection类,我可以使用不超过用户id、密码和子域名的凭据进行测试(请参阅S.O.的答案) 例如,对于用户帐户ssmith@

我正在编写一个程序(
WinForms
C#
),它运行在
win7
客户机上。它从用户处获取凭据(用户id、密码和子域名),并使用这些凭据(通过
Active Directory
)对程序远程连接的其他服务器进行身份验证。其他服务器位于与
Win 7
客户端计算机所在的域不同的域上

使用
NetworkCredential
LdapDirectoryIdentifier
LdapConnection
类,我可以使用不超过用户id、密码和子域名的凭据进行测试(请参阅S.O.的答案)

例如,对于用户帐户
ssmith@xyz.gov
,我只需要提供
ssmith
(用户id)、
ssmith
的密码和
xyz
(子域)。我不需要提供
顶级域名
gov

现在,我想以编程方式获取此用户帐户的
顶级域名
gov
)。我已经检查了
NetworkCredential
LdapDirectoryIdentifier
LdapConnection
类的属性和方法。我已经看过了教室里的其他课程。我看不到一种通过编程获得顶级域名的方法

给定
用户id
密码
子域
名称,如何为用户帐户获取
顶级域名

这是我的密码。给定的用户帐户ssmith@xyz.gov,我的呼叫如下所示(星号表示SecureString密码)

这是我的方法代码

private const int ERROR_LOGON_FAILURE = 0x31;

private bool ValidateCredentials(string username, SecureString ssPassword, string domain)
{

    //suports secure string 
    NetworkCredential credentials = new NetworkCredential(username, ssPassword, domain);

    LdapDirectoryIdentifier id = new LdapDirectoryIdentifier(domain);

    using (LdapConnection connection = new LdapConnection(id, credentials, AuthType.Kerberos))
    {
        connection.SessionOptions.Sealing = true;
        connection.SessionOptions.Signing = true;

        try
        {
            // The only way to test credentials on a LDAP connection seems to be to attempt a 
            // Bind operation, which will throw an exception if the credentials are bad
            connection.Bind();
        }
        catch (LdapException lEx)
        {
            credentials = null;
            id = null;

            if (ERROR_LOGON_FAILURE == lEx.ErrorCode)
            {
                return false;
            }

            throw;
        }
    }

    credentials = null;
    id = null;

    return true;
}

成功绑定后,域的完整DNS名称将位于
LdapConnection
对象中:

var domain = connection.SessionOptions.DomainName;
在本例中,这将是“xyz.gov”。如果您只需要“gov”,那么您可以在最后一个点之后获取所有内容:

var tld = domain.Substring(domain.LastIndexOf('.') + 1);

如果您还不知道域,那么您对
LdapDirectoryIdentifier
对象的声明是什么样子的?@GabrielLuci:我为调用我的方法和该方法添加了代码。请看上面。用户将知道子域
xyz
,但可能不知道顶级域
gov
。而且,
LdapDirectoryIdentifier
在这种情况下显然不需要顶级域,
domain
变量是否已经包含顶级域的名称?不,只是子域名。详情见上文我的问题。您正在使用域的短名称“成功绑定后”。谢谢-成功绑定后,我没有想到要查看我的
连接
对象:-(在
.co.uk
域名等情况下,仅搜索最后一个点会严重中断。根据需要,您可以选择在第一个点上拆分。我想我可以修改方法的签名以将完全限定的域名传递回:
private bool ValidateCredentials(string用户名、SecureString ssPassword、string域、out string fqdn)
。请参见:“out关键字导致通过引用传递参数。”。或者,如果您使用的是最新的Visual Studio,则可以使用C#7的新功能:
private(bool,string)ValidateCredentials(…)
然后返回(true,domainName);
var tld = domain.Substring(domain.LastIndexOf('.') + 1);