Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 以编程方式确定当前域控制器_C#_.net_Active Directory_Domaincontroller_Domainservices - Fatal编程技术网

C# 以编程方式确定当前域控制器

C# 以编程方式确定当前域控制器,c#,.net,active-directory,domaincontroller,domainservices,C#,.net,Active Directory,Domaincontroller,Domainservices,我需要查询当前域控制器,可能主要是为了更改用户密码 PDC名称应完全限定,即DC=PDC,DC=example,DC=com如何正确命名此类符号 如何使用C完成此操作?需要System.DirectoryServices.AccountManagement.dll: using (var context = new System.DirectoryServices.AccountManagement.PrincipalContext(ContextType.Domain)) { stri

我需要查询当前域控制器,可能主要是为了更改用户密码

PDC名称应完全限定,即DC=PDC,DC=example,DC=com如何正确命名此类符号


如何使用C完成此操作?

需要System.DirectoryServices.AccountManagement.dll:

using (var context = new System.DirectoryServices.AccountManagement.PrincipalContext(ContextType.Domain))
{
    string server = context.ConnectedServer; // "pdc.examle.com"
    string[] splitted = server.Split('.'); // { "pdc", "example", "com" }
    IEnumerable<string> formatted = splitted.Select(s => String.Format("DC={0}", s));// { "DC=pdc", "DC=example", "DC=com" }
    string joined = String.Join(",", formatted); // "DC=pdc,DC=example,DC=com"

    // or just in one string

    string pdc = String.Join(",", context.ConnectedServer.Split('.').Select(s => String.Format("DC={0}", s)));
}

如果您希望与Active Directory交互,那么您不必知道角色的大部分位置。如果你想从你的程序中改变广告拓扑,我不会,看看这个类

如果要更改用户密码,可以在用户对象上调用这些操作,Active Directory将确保正确复制更改

抄袭


我们在内部应用程序中使用类似的东西

应该返回类似DC=d,DC=r,DC=ABC,DC=com的内容


若要在DomainController存在于您的计算机不属于的域中时检索信息,您需要更多信息

  DirectoryContext domainContext =  new DirectoryContext(DirectoryContextType.Domain, "targetDomainName", "validUserInDomain", "validUserPassword");

  var domain = System.DirectoryServices.ActiveDirectory.Domain.GetDomain(domainContext);
  var controller = domain.FindDomainController();

是的,你说得对。我们通常在catch语句中有一些自定义日志代码,但我在本例中将其删除。@abatishchev:该语句是错误的-调用just throw将保留堆栈跟踪;创建新的异常或执行throw-ex;会破坏调用堆栈;看:@marc_s:是的,你是对的,关于堆栈跟踪的短语我错了。无论如何,这在登录之前毫无意义,@Lareau说,你认为我如何使用自己的用户名和当前密码更改当前密码?这在跨域情况下不起作用,例如,你的机器不是域控制器所在域的一部分。请参阅我的答案以了解此类解决方案。我不想传递用户名和密码。不幸的是,如果您正在跨越域,则需要。否则将无法识别您现有的身份。即使使用新的3.5 System.DirectoryServices.AccountManagement命名空间,您也必须在外部域中包含有效的用户名/密码。这不起作用,因为您的本地计算机将无法找到该域的DC。
public static string RetrieveRootDseDefaultNamingContext()
{
    String RootDsePath = "LDAP://RootDSE";
    const string DefaultNamingContextPropertyName = "defaultNamingContext";

    DirectoryEntry rootDse = new DirectoryEntry(RootDsePath)
    {
        AuthenticationType = AuthenticationTypes.Secure;
    };
    object propertyValue = rootDse.Properties[DefaultNamingContextPropertyName].Value;

    return propertyValue != null ? propertyValue.ToString() : null;
}
  DirectoryContext domainContext =  new DirectoryContext(DirectoryContextType.Domain, "targetDomainName", "validUserInDomain", "validUserPassword");

  var domain = System.DirectoryServices.ActiveDirectory.Domain.GetDomain(domainContext);
  var controller = domain.FindDomainController();