使用c#连接活动目录

时间:2015-02-25 07:17:45

标签: c# active-directory

我正在尝试连接到我使用的Active Directory代码

string domain = "domain.com.pk";
string container = "DC=mycompnay,DC=com,DC=pk";
string Admin = "salman.zafar";
string Password = "password";
using (PrincipalContext pc = new PrincipalContext(ContextType.Domain, domain, container, Admin, Password))
            {
                string userPrincipalName = "dotnettest" + "@" + domain;

                // validate the credentials
                bool isValid = pc.ValidateCredentials(userPrincipalName, "Ascertia 12");                

if (isValid)             {
 UserPrincipal up = UserPrincipal.FindByIdentity(pc, IdentityType.UserPrincipalName, userPrincipalName);
                       }

代码在域中运行的代码上运行正常但是如果我尝试连接到远程的AD机器那么我得到错误 我试着用

string domain = "192.168.0.150:389/domain.com.pk";

然后它不起作用并且验证凭证方法总是返回false可以帮助我如何使用带有 PrincipalContext 的端口的IP连接到远程活动目录,或者我必须使用目录条目< / p>

任何帮助将不胜感激

1 个答案:

答案 0 :(得分:2)

首先注意:

  
    

代码在域中的机器上运行的代码

时工作正常   

在这种情况下,如果计算机是域成员(我在此假设),则不需要在PrincipalContext构造函数中提供adminuser + pw。

如果要连接到外部域和当前域之间没有信任的任何其他AD服务器(域控制器),请使用IP地址或服务器名称作为“域”名称:

string domain = "192.168.0.150";

如果您的目标只是检查凭据是否有效,您甚至可以省略admin user + pw:

string domainController = "192.168.0.150";

using (PrincipalContext pc = new PrincipalContext(ContextType.Domain, domainController))
{
    string userPrincipalName = "dotnettest" + "@" + domain;

    // validate the credentials
    bool isValid = pc.ValidateCredentials(userPrincipalName, "Ascertia 12");    
}

但是,在这种情况下,你不能拥有

UserPrincipal up = UserPrincipal.FindByIdentity(...

因为PrincipalContext本身未登录。

您还可以在类似的问题中看到我的回答:https://stackoverflow.com/a/28690682/4547223

或此SO文章Validate a username and password against Active Directory?