C# 以编程方式确定当前域控制器
我需要查询当前域控制器,可能主要是为了更改用户密码 PDC名称应完全限定,即DC=PDC,DC=example,DC=com如何正确命名此类符号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
如何使用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();