Obtenga nETBIOSName de un objeto UserPrincipal

Estoy usando la parte System.DirectoryServices.AccountManagement de la biblioteca .Net para interactuar con ActiveDirectory.

Habiendo llamado a GetMembers () en un objeto GroupPrincipal y filtrando los resultados, ahora tengo una colección de objetos UserPrincipal

GroupPrincipal myGroup; // population of this object omitted here foreach (UserPrincipal user in myGroup.GetMembers(false).OfType()) { Console.WriteLine(user.SamAccountName); } 

El ejemplo de código anterior imprimirá nombres de usuario como “TestUser1”. Necesito comparar esto con una lista que viene de otra aplicación en formato “DOMINIO \ TestUser1”.

¿Cómo obtengo la parte “DOMINIO” del objeto UserPrincipal?

No puedo simplemente agregar un nombre de dominio conocido ya que hay varios dominios involucrados y necesito diferenciar DOMAIN1 \ TestUser1 y DOMAIN2 \ TestUser2.

Tienes dos opciones en las que puedo pensar.

  1. Analice, o tome todo lo que está en el derecho de name@fully.qualified.domain.name ;
  2. Utilice el espacio de nombres System.DirectoryServices .

No sé sobre UserPrincipal , ni tampoco sobre GroupPrincipal . Por otro lado, conozco una forma de trabajo para lograr lo que quieres.

 [TestCase("LDAP://fully.qualified.domain.name", "TestUser1")] public void GetNetBiosName(string ldapUrl, string login) string netBiosName = null; string foundLogin = null; using (DirectoryEntry root = new DirectoryEntry(ldapUrl)) Using (DirectorySearcher searcher = new DirectorySearcher(root) { searcher.SearchScope = SearchScope.Subtree; searcher.PropertiesToLoad.Add("sAMAccountName"); searcher.Filter = string.Format("(&(objectClass=user)(sAMAccountName={0}))", login); SearchResult result = null; try { result = searcher.FindOne(); if (result == null) if (string.Equals(login, result.GetDirectoryEntry().Properties("sAMAccountName").Value)) foundLogin = result.GetDirectoryEntry().Properties("sAMAccountName").Value } finally { searcher.Dispose(); root.Dispose(); if (result != null) result = null; } } if (!string.IsNullOrEmpty(foundLogin)) using (DirectoryEntry root = new DirectoryEntry(ldapUrl.Insert(7, "CN=Partitions,CN=Configuration,DC=").Replace(".", ",DC=")) Using DirectorySearcher searcher = new DirectorySearcher(root) searcher.Filter = "nETBIOSName=*"; searcher.PropertiesToLoad.Add("cn"); SearchResultCollection results = null; try { results = searcher.FindAll(); if (results != null && results.Count > 0 && results[0] != null) { ResultPropertyValueCollection values = results[0].Properties("cn"); netBiosName = rpvc[0].ToString(); } finally { searcher.Dispose(); root.Dispose(); if (results != null) { results.Dispose(); results = null; } } } Assert.AreEqual("INTRA\TESTUSER1", string.Concat(netBiosName, "\", foundLogin).ToUpperInvariant()) } 

Otra información relacionada o enlaces disponibles en esta pregunta de SO.
C # Active Directory: ¿Obtener el nombre de dominio del usuario?
Cómo encontrar el nombre NetBIOS de un dominio

Use la biblioteca COM de ActiveDs, tiene incorporada la traducción de nombres que funciona y no hace suposiciones (como otras respuestas aquí).

 using System; using System.Collections.Generic; using System.Linq; using System.Text; using ActiveDs; namespace Foo.Repository.AdUserProfile { public class ADUserProfileValueTranslate { public static string ConvertUserPrincipalNameToNetBiosName(string userPrincipleName) { NameTranslate nameTranslate = new NameTranslate(); nameTranslate.Set((int)ADS_NAME_TYPE_ENUM.ADS_NAME_TYPE_USER_PRINCIPAL_NAME, userPrincipleName); return nameTranslate.Get((int) ADS_NAME_TYPE_ENUM.ADS_NAME_TYPE_NT4); } } } 

¿Has intentado pasar el nombre de dominio completo a esta otra aplicación? La mayoría de las API de Windows no se quejarán si lo hace fully_qualified_domain\USER .

Puede buscar los dominios posibles en la propiedad user.DistinguishedName. Un usuario en el dominio 1 debe contener la cadena “DC = DOMAIN1”. Definitivamente no debería contener la cadena “DC = DOMAIN2”.

Como se mencionó en uno de los comentarios a la pregunta, creo que esta es una buena respuesta para los tiempos más recientes:

  user.Sid.Translate(typeof(System.Security.Principal.NTAccount)).ToString()