2009-06-02 12 views
13

Jak mogę uzyskać użytkownika i domenę Windows z obiektu DirectoryEntry Active Directory (SchemaClassName = "user")?Jak mogę uzyskać DOMAIN USER z katalogu DirectoryEntry?

Nazwa użytkownika znajduje się we właściwości sAMAccountName, ale gdzie mogę sprawdzić nazwę domeny?

(nie mogę zakładać stałą nazwę domeny, ponieważ użytkownicy z różnych subdomen.)

+0

Powiązane: http://stackoverflow.com/questions/4249139/c-sharp-active-directory-get-domain-name-of-user –

Odpowiedz

3

znalazłem pojemnik na partycji CN = Partitions, CN = Configuration, który zawiera wszystkie domeny.

Po dopasowaniu użytkownika do partii można odczytać prawdziwą nazwę domeny z właściwości nETBIOSName + "\" + sAMAccountName.

+1

nETBIOSName to nazwa komputera, prawda? jak to da nazwę domeny? – Shesha

2

Jeśli używasz biblioteki System.DirectoryServices, trzeba mieć SearchResultsCollection od A DirectorySearcher.

Wewnątrz każdej kolekcji właściwości SearchResult znajduje się właściwość "distinguishingname". To będzie zawierało wszystkie części DC tworzące domenę, do której należy twój wpis katalogowy.

+0

+1: Zrobiłem to, aby uzyskać różnego rodzaju informacje, takie jak którzy są zatrudnieni przez nich, a także wykaz wszystkich swoich grup bezpieczeństwa. – RSolberg

+5

Tak, ale jak mi to pomaga? Jak uzyskać nazwę domeny "firma-klucz" z DC = Company, DC = com? – laktak

+0

To jest właściwa droga ... ale pamiętaj, że domena często może być aliasem dla poprawnej ścieżki w AD ... np. w naszej organizacji domena SOUTH_AMERICA jest w rzeczywistości soa.company.com, EUROPA to eur.firma.com, która jest reprezentowana przez dc = eur, dc = firma, dc = com itp., więc możesz potrzebować tabeli wyszukiwania i przeprowadzić wyszukiwanie w łańcuchu nazw wyróżniających – davidsleeps

7

Niestety, nie znajdziesz tego, czego szukasz w katalogu DirectoryEntry.

Masz sAMAccountName, który zazwyczaj jest podobny do myuser (bez domeny). Masz numer distinguishedName, który jest podobny do LDAP://cn=joe myuser,cn=Users,dc=yourCompany,dc=com. Masz również userPrincipalName, ale zazwyczaj jest to nazwa w formacie [email protected].

Nie można jednak znaleźć żadnego atrybutu, który ma w sobie domain\MyUser. Będziesz musiał umieścić to razem ze swoich informacji o nazwie domeny i sAMAccountName obiektu DirectoryEntry.

Aby uzyskać więcej informacji i kilka doskonałych arkuszy Excel we wszystkich właściwościach LDAP i WinNT w System.DirectoryServices, sprawdź stronę internetową Hilltop Lab autorstwa ADSI MVP Richard Mueller.

Marc

21

Zakłada się, że results jest SearchResultCollection uzyskany z DirectorySearcher, ale powinieneś być w stanie uzyskać Objectid bezpośrednio z DirectoryEntry.

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 
+3

Niestety to nie działa dla mnie - mam Objectid, ale dostaję IdentityNotMappedException na wywołanie Translate(). Może to być spowodowane tym, że komputer, który uruchamia kod, nie jest częścią domeny, po prostu wysyłam zapytanie do AD. – laktak

+0

Czy istnieje sposób na przetłumaczenie na odwrót? Jeśli mam ciąg znaków w formacie DOMAIN \ user, czy mogę wyszukać obiekt katalogu? Biorąc pod uwagę, że mogę mieć do czynienia z wieloma zaufanymi domenami, czy jest to możliwe? – Jeremy

+0

Dzięki. Nadal działa w .NET 4.5. – Steven

7

Aby uzyskać nazwę domeny DirectoryEntry można użyć rekurencji na directoryEntry.Parent. A jeśli directoryEntry.SchemaClassName == "domainDNS" można uzyskać nazwę domeny takiego:

directoryEntry.Properties["Name"].Value 
-2

1) można uzyskać userPrincipalName z DirectoryEntry.

2) Następnie podziel UPN pomiędzy nazwę użytkownika i nazwę domeny.

3) Następnie wywołaj funkcję 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; 
} 
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 ""; 
} 
0

mam rozszerzenie poprzednią odpowiedź przez @laktak dostarczenie szczegółów co miał na myśli.

Jest pojemnik partycje w CN=Partitions,CN=Configuration który zawiera wszystkie domeny, które daje cn która jest nazwą NetBIOS domeny i właściwość nCName który zawiera distinguishedName prefiks użytkownik będzie miał, jeśli są one w tej dziedzinie.

więc zacząć od poszukiwania LDAP (objectClass=*) w CN=Partitions,CN=Configuration i przechowywania (cn, nCName) par każdego wyniku na mapie.

Następnie wyszukujesz ldap, używając (sAMAccountName=USERIDHERE) i otrzymujesz od użytkownika distinguishedName. Teraz przejdź przez pary (cn, nCName) i znajdź nCName, który przedrostkuje distinguishedName od użytkownika, a odpowiadająca cn jest Twoją pożądaną nazwą domeny.

Powiązane problemy