[C#] Comment puis-je obtenir DOMAIN \ USER à partir d'un AD DirectoryEntry?



Answers

Vous ne trouverez malheureusement pas ce que vous cherchez dans le DirectoryEntry.

Vous avez le sAMAccountName qui est typiquement quelque chose comme myuser (sans le domaine). Vous avez le distinguishedName qui est quelque chose comme LDAP://cn=joe myuser,cn=Users,dc=yourCompany,dc=com . Vous avez également un userPrincipalName mais c'est généralement un nom au format joeUser@mycompany.com .

Mais vous ne trouverez aucun attribut domain\MyUser le domain\MyUser , malheureusement. Vous devrez mettre cela ensemble à partir de vos informations sur le nom de domaine, et le sAMAccountName de l'entrée Directory.

Pour plus d'informations et quelques excellentes feuilles Excel sur toutes les propriétés LDAP et WinNT dans System.DirectoryServices, consultez le site Web Hilltop Lab par ADSI MVP Richard Mueller.

Marc

Question

Comment puis-je obtenir l'utilisateur et le domaine Windows à partir d'un objet Active Directory DirectoryEntry (SchemaClassName = "user")?

Le nom d'utilisateur est dans la propriété sAMAccountName mais où puis-je rechercher le nom de domaine?

(Je ne peux pas supposer un nom de domaine fixe parce que les utilisateurs proviennent de divers sous-domaines.)




Si vous utilisez les bibliothèques System.DirectoryServices , vous devez avoir une SearchResultsCollection à partir d'un DirectorySearcher.

Dans chaque collection Properties de SearchResult, il existe une propriété "distinguishedname". Cela contiendra toutes les parties DC qui composent le domaine auquel appartient votre entrée de répertoire.




1) Vous pouvez obtenir le userPrincipalName à partir de DirectoryEntry.

2) Ensuite, divisez l'UPN entre le nom d'utilisateur et le nom de domaine.

3) Puis appelez GetNetBIOSName () dessus.

      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;
}



J'ai trouvé un conteneur de partitions dans CN = Partitions, CN = Configuration qui contient tous les domaines.

Lorsque vous faites correspondre l'utilisateur à la partition, vous pouvez lire le nom de domaine réel à partir de la propriété nETBIOSName + "\" + sAMAccountName.




Links