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);