如何从AD DirectoryEntry获取DOMAIN \ USER?

时间:2009-06-02 17:57:52

标签: c# .net active-directory

如何从Active Directory DirectoryEntry(SchemaClassName =“user”)对象中获取Windows用户和域?

用户名在sAMAccountName属性中,但在哪里可以查找域名?

(我不能假设一个固定的域名,因为用户来自不同的子域名。)

9 个答案:

答案 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,然后将每个结果的cnnCName)对存储到地图中。

接下来,您使用(sAMAccountName=USERIDHERE)查询ldap并从用户处获取distinguishedName。现在浏览(cnnCName)对,找到用户前缀为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;
}