如何从Active Directory DirectoryEntry(SchemaClassName =“user”)对象中获取Windows用户和域?
用户名在sAMAccountName属性中,但在哪里可以查找域名?
(我不能假设一个固定的域名,因为用户来自不同的子域名。)
答案 0 :(得分:24)
这假设results
是从DirectorySearcher获取的SearchResultCollection,但您应该能够直接从DirectoryEntry获取objectsid。
SearchResult result = results[0];
var propertyValues = result.Properties["objectsid"];
var objectsid = (byte[])propertyValues[0];
var sid = new SecurityIdentifier(objectsid, 0)
var account = sid.Translate(typeof(NTAccount));
account.ToString(); // This give the DOMAIN\User format for the account
答案 1 :(得分:7)
不幸的是,你无法在DirectoryEntry中找到你想要的东西。
您拥有的sAMAccountName
通常类似于myuser
(没有域名)。您的distinguishedName
类似于LDAP://cn=joe myuser,cn=Users,dc=yourCompany,dc=com
。您还有一个userPrincipalName
,但通常是joeUser@mycompany.com
格式的名称。
但不幸的是,你找不到任何包含domain\MyUser
的属性。您必须将有关域名的信息和DirectoryEntry的sAMAccountName放在一起。
有关System.DirectoryServices中所有LDAP和WinNT属性的更多信息和一些优秀的Excel表格,请访问ADSI MVP Richard Mueller的Hilltop Lab网站。
马克
答案 2 :(得分:7)
要获取DirectoryEntry域名,您可以使用递归
directoryEntry.Parent
。
然后如果directoryEntry.SchemaClassName == "domainDNS"
你可以得到这样的域名:
directoryEntry.Properties["Name"].Value
答案 3 :(得分:3)
我在CN = Partitions中发现了一个分区容器,CN =包含所有域的配置。
当您将用户与分区匹配时,您可以从nETBIOSName +“\”+ sAMAccountName属性中读取真实域名。
答案 4 :(得分:3)
public static string GetDomainNameUserNameFromUPN(string strUPN)
{
try
{
WindowsIdentity wi = new WindowsIdentity(strUPN);
WindowsPrincipal wp = new WindowsPrincipal(wi);
return wp.Identity.Name;
}
catch (Exception ex)
{
}
return "";
}
答案 5 :(得分:2)
如果您使用System.DirectoryServices库,则应该从DirectorySearcher获取SearchResultsCollection。
在每个SearchResult的Properties集合中,都有一个“distinguishedname”属性。这将包含构成目录条目所属域的所有DC部分。
答案 6 :(得分:0)
我正在扩展@laktak之前的回答,以提供他的意思的详细信息。
CN=Partitions,CN=Configuration
中有一个分区容器,其中包含所有域,它们为您提供cn
,即Netbios域名和包含nCName
前缀的distinguishedName
属性如果用户在此域中,则会有用户。
首先,在(objectClass=*)
中搜索ldap获取CN=Partitions,CN=Configuration
,然后将每个结果的cn
,nCName
)对存储到地图中。
接下来,您使用(sAMAccountName=USERIDHERE)
查询ldap并从用户处获取distinguishedName
。现在浏览(cn
,nCName
)对,找到用户前缀为nCName
的{{1}},相应的distinguishedName
是您想要的域名名。
答案 7 :(得分:0)
我为自己使用编写了这段代码(在VB.net中,易于翻译):
<System.Runtime.CompilerServices.Extension()>
Public Function GetDomainFQDN(ByVal Entry As DirectoryServices.DirectoryEntry) As String
Try
While Entry.SchemaClassName <> "domainDNS"
Entry = Entry.Parent
End While
Dim DN As String = Entry.Properties("DistinguishedName").Value
Return DN.Replace("DC=", "").Replace(",", ".")
Catch ex As Exception
Debug.WriteLine(ex.ToString)
Return String.Empty
End Try
End Function
<System.Runtime.CompilerServices.Extension()>
Public Function GetDomainNetbiosName(ByVal Entry As DirectoryServices.DirectoryEntry) As String
Try
While Entry.SchemaClassName <> "domainDNS"
Entry = Entry.Parent
End While
Return Entry.Properties("Name").Value
Catch ex As Exception
Debug.WriteLine(ex.ToString)
Return String.Empty
End Try
End Function
答案 8 :(得分:-2)
1)您可以从DirectoryEntry获取userPrincipalName。
2)然后,在用户名和域名之间拆分UPN。
3)然后在其上调用GetNetBIOSName()。
public static DirectoryEntry GetDirectoryObject(string strPath)
{
if (strPath == "")
{
strPath = ConfigurationManager.AppSettings["LDAPPath"]; //YOUR DEFAULT LDAP PATH ie. LDAP://YourDomainServer
}
string username = ConfigurationManager.AppSettings["LDAPAccount"];
string password = ConfigurationManager.AppSettings["LDAPPassword"];
//You can encrypt and decrypt your password settings in web.config, but for the sake of simplicity, I've excluded the encryption code from this listing.
}
catch (Exception ex)
{
HttpContext.Current.Response.Write("user: " + username + ", LDAPAccount: "+ ConfigurationManager.AppSettings["LDAPAccount"] + ".<br /> "+ ex.Message +"<br />");
if (HttpContext.Current.User.Identity != null)
{
HttpContext.Current.Response.Write("HttpContext.Current.User.Identity: " + HttpContext.Current.User.Identity.Name + ", " + HttpContext.Current.User.Identity.IsAuthenticated.ToString() + "<br />");
HttpContext.Current.Response.Write("Windows Identity: " + WindowsIdentity.GetCurrent().Name + ", " + HttpContext.Current.User.Identity.IsAuthenticated.ToString());
}
else
{
HttpContext.Current.Response.Write("User.Identity is null.");
}
HttpContext.Current.Response.End();
}
DirectoryEntry oDE = new DirectoryEntry(strPath, username, password, AuthenticationTypes.Secure);
return oDE;
}
public static string GetNetBIOSName(string DomainName)
{
string netBIOSName = "";
DirectoryEntry rootDSE =GetDirectoryObject(
"LDAP://"+DomainName+"/rootDSE");
string domain = (string)rootDSE.Properties[
"defaultNamingContext"][0];
// netBIOSName += "Naming Context: " + domain + "<br />";
if (!String.IsNullOrEmpty(domain))
{
//This code assumes you have a directory entry at the /CN=Partitions, CN=Configuration
//It will not work if you do not have this entry.
DirectoryEntry parts = GetDirectoryObject(
"LDAP://"+DomainName+"/CN=Partitions, CN=Configuration," + domain);
foreach (DirectoryEntry part in parts.Children)
{
if ((string)part.Properties[
"nCName"][0] == domain)
{
netBIOSName += (string)part.Properties[
"NetBIOSName"][0];
break;
}
}
}
return netBIOSName;
}
public static string GetDomainUsernameFromUPN(string strUPN)
{
string DomainName;
string UserName;
if (strUPN.Contains("@"))
{
string[] ud = strUPN.Split('@');
strUPN= ud[0];
DomainName = ud[1];
DomainName=LDAPToolKit.GetNetBIOSName(DomainName);
UserName= DomainName + "\\" + strUPN;
}
else
{
UserName= strUPN;
}
return UserName;
}