.net UserPrincipal对象中的域名在哪里?
我正在使用.net UserPrincipal对象中的域名在哪里?,.net,active-directory,directoryservices,.net,Active Directory,Directoryservices,我正在使用System.DirectoryServices.ActiveDirectory类查找所有Active Directory用户。代码非常简单: var context = new PrincipalContext(ContextType.Domain); var searcher = new PrincipalSearcher(new UserPrincipal(context)); var results = searcher.FindAll(); 我想以“friendly”(又名
System.DirectoryServices.ActiveDirectory
类查找所有Active Directory用户。代码非常简单:
var context = new PrincipalContext(ContextType.Domain);
var searcher = new PrincipalSearcher(new UserPrincipal(context));
var results = searcher.FindAll();
我想以“friendly”(又名“pre-Windows 2000”格式)获取域限定用户名,例如“CONTOSO\SmithJ”
UserPrincipal.SamAccountName
提供了用户名部分,但如何获取域部分?我不能假设域将与计算机或当前用户的域相同。对于AD DS,msDS PrincipalName
的值是NetBIOS域名,后跟反斜杠(\)
您可以通过以下方式找到它:
/* Retreiving the root domain attributes
*/
sFromWhere = "LDAP://DC_DNS_NAME:389/dc=dom,dc=fr";
DirectoryEntry deBase = new DirectoryEntry(sFromWhere, "AdminLogin", "PWD");
DirectorySearcher dsLookForDomain = new DirectorySearcher(deBase);
dsLookForDomain.Filter = "(objectClass=*)";
dsLookForDomain.SearchScope = SearchScope.base;
dsLookForDomain.PropertiesToLoad.Add("msDS-PrincipalName");
SearchResult srcDomains = dsLookForDomain.FindOne();
好的,这里是我使用JPBlanc的答案和。它显示每个用户的SID、显示名称和域\用户名
var ldapUrl = "LDAP://" + defaultNamingContext;
using (var rootDe = new DirectoryEntry(ldapUrl))
using (var searcher = new DirectorySearcher(rootDe))
{
searcher.SearchScope = SearchScope.Subtree;
searcher.PropertiesToLoad.Add("objectSid");
searcher.PropertiesToLoad.Add("displayName");
searcher.PropertiesToLoad.Add("msDS-PrincipalName");
searcher.Filter = "(&(objectClass=user)(objectCategory=person))";
var results = searcher.FindAll();
foreach (SearchResult result in results)
{
var qualifiedUsername = GetSinglePropertyValue(result, "msDS-PrincipalName");
var displayName = GetSinglePropertyValue(result, "displayName");
var sid = new SecurityIdentifier((byte[])GetSinglePropertyValue(result,"objectSid"), 0);
Console.WriteLine("User: {0}\r\n\tDisplay name: {1}\r\n\tSID: {2}",
qualifiedUsername, displayName, sid);
}
}
private static object GetSinglePropertyValue(SearchResult result, string propertyName)
{
var value = result.Properties[propertyName];
if (value.Count == 0)
return null;
if (value.Count == 1)
return value[0];
throw new ApplicationException(string.Format("Property '{0}' has {1} values for {2}",
propertyName, value.Count, result.Path));
}
以及获取计算机域(as)的默认命名上下文:
可能重复:注意:根据MSDN,它可能是域\用户名或用户的SID:
private static string GetDefaultNamingContext()
{
// This check is fast
try
{
Domain.GetComputerDomain();
}
catch (ActiveDirectoryObjectNotFoundException)
{
return null;
}
// This takes 5 seconds if the computer is not on a domain
using (var rootDe = new DirectoryEntry("LDAP://RootDSE"))
{
try
{
return (string)rootDe.Properties["defaultNamingContext"][0];
}
catch (COMException ex)
{
if (ex.ErrorCode == -2147023541)
return null;
throw;
}
}
}