2010-11-30 17 views
7

Estoy teniendo problemas para conseguir los grupos de Active Directory a través de System.DirectoryServiceslograr que los grupos de Active Directory mediante C#

Originalmente empecé mi aplicación en un equipo que se registró en el dominio, pero como era un dominio en vivo que hice No quiero escribir nada en AD, así que configuré una máquina con Windows XP como sistema operativo host e instalé Windows Server 2003 en una máquina virtual.

He agregado otro puerto Ethernet en la máquina y configurado un interruptor, el 1 puerto Ethernet está dedicado a la VM y el otro puerto se usa para el host.

Después de configurar las direcciones IP para que se comunicaran, transferí mi aplicación a la máquina host y la encendí, pero recibí un DirectoryServicesCOMException.

Con el mensaje de que el nombre de usuario y la contraseña no eran válidos :(solo para comprobar que no estaba activo, creé una tercera máquina virtual e instalé Windows XP, que agregué al dominio con las credenciales probadas en la APLICACIÓN , trabaja un convite

Así que pensamos que debe ser porque la máquina donde se ejecuta la aplicación no es parte del dominio

Aquí está el bloque de código que estaba causando el problema:..

public CredentialValidation(String Domain, String Username, String Password, Boolean Secure) 
{ 
    //Validate the Domain! 
    try 
    { 
     PrincipalContext Context = new PrincipalContext(ContextType.Domain, Domain); //Throws Exception 
     _IsValidDomain = true; 

     //Test the user login 
     _IsValidLogin = Context.ValidateCredentials(Username, Password); 

     //Check the Group Admin is within this user 
     //******HERE 
     var Results = UserPrincipal.FindByIdentity(Context, Username).GetGroups(Context); 

     foreach(Principal Result in Results) 
     { 
      if (Result.SamAccountName == "Domain Admins") 
      { 
       _IsAdminGroup = true; 
       break; 
      } 
     } 
     Results.Dispose(); 
     Context.Dispose(); 
    } 
    catch (PrincipalServerDownException) 
    { 
     _IsValidDomain = false; 
    } 
} 

La información La información en el diálogo de inicio de sesión se ingresa así:

Domain: test.internal 
Username: testaccount 
Password: Password01 

Espero que alguien pueda arrojar algo de luz en este error.


Actualización:

Después de comprobar los registros de seguridad en el servidor puedo ver que mi registro en los intentos tuvo éxito, pero esto se debe a:

_IsValidLogin = Context.ValidateCredentials(Username, Password); 

la línea después de donde Estoy comprobando que los grupos están causando el error, por lo que el problema principal es que las líneas de código a continuación no funcionan correctamente desde una máquina que no está unida a la red:

var Results = UserPrincipal.FindByIdentity(Context, Username).GetGroups(Context); 
+0

¿Está seguro de que las credenciales de usuario tomadas como entrada por el método son correctas para el dominio dado que está intentando autenticar contra el usuario dado? ¿Este usuario realmente existe? ¿Has probado el método antiguo utilizando las clases 'DirectoryEntry' y' DirectorySearcher' del espacio de nombres 'System.DirectoryServices'? Solo sugerencias, realmente no sé acerca de los objetos principales. –

+0

usuario existe ya que he colocado otra máquina VM XP en la red con las mismas credenciales, puedo ver al usuario en AD y ejecutando el comando 'start \\ server1' en cmd obtengo el diálogo de credenciales y puedo auth a través de eso, esto funciona al 100% en máquinas que son parte de la red. – RobertPitt

Respuesta

2

De acuerdo con su fragmento de código, está fallando cuando intenta crear el PrincipalContext, antes de llamar a ValidateCredentials. En ese punto, el hilo que ejecuta su código aún funciona bajo una identidad local (si está en un proceso web) o la identidad con la que inició sesión en su máquina (para un proceso de Windows). Cualquiera de estos no existirá en el dominio test.internal.

Es posible que desee probar la sobrecarga de PrincipalContext que incluye el nombre de usuario y la contraseña en el constructor. Ver http://msdn.microsoft.com/en-us/library/bb341016.aspx

+0

Ok Entiendo eso, pero si el PrincipleContext está fallando, ¿cómo puedo ver en mis registros de seguridad en los registros del servidor un inicio de sesión exitoso con el nombre de usuario proveniente de la PC del cliente, tuve la sensación de que sería algo relacionado con el local windows identity pero he intentado hacer: 'TEST/testaccount' y' testaccount @ test' y también 'testaccount @ test.internal' y todos fallan de la misma manera. También estoy seguro de que probé las sobrecargas para el método de Contexto Principal, intentaré de nuevo y actualización. – RobertPitt

+0

Wahhh, estoy seguro de que probó esto: /, La línea 'PrincipalContext (ContextType.Domain, Domain);' ha sido actualizado para contener el nombre de usuario y la contraseña, y parece estar funcionando bien ahora. – RobertPitt

2

Solía ​​hacer un poco de administración de usuarios a través de C# .NET. Acabo de desenterrar algunos métodos que puedes probar.

Los dos métodos siguientes obtendrán un objeto DirectoryEntry para un nombre de cuenta SAM dado. Se necesita una entrada de directorio que sea la raíz de la unidad organizativa en la que desea comenzar la búsqueda de la cuenta.

La otra le dará una lista de nombres completos de los grupos de los que el usuario es miembro. Luego puede usar esos DN para buscar AD y obtener un objeto DirectoryEntry.

public List<string> GetMemberOf(DirectoryEntry de) 
{ 
    List<string> memberof = new List<string>(); 

    foreach (object oMember in de.Properties["memberOf"]) 
    { 
    memberof.Add(oMember.ToString()); 
    } 

    return memberof; 
} 

public DirectoryEntry GetObjectBySAM(string sam, DirectoryEntry root) 
{ 
    using (DirectorySearcher searcher = new DirectorySearcher(root, string.Format("(sAMAccountName={0})", sam))) 
    { 
    SearchResult sr = searcher.FindOne(); 

    if (!(sr == null)) return sr.GetDirectoryEntry(); 
    else 
     return null; 
    } 
} 
+0

Esto está usando la Entrada de directorio que no quiero usar para el proceso de autenticación, 'DirectoryServices' tiene un espacio de nombres integrado para manejar llamado' AccountManagement' – RobertPitt

+0

Sí, solo estaba hablando de obtener una lista de los grupos de los que un usuario es miembro basado en el título de tu pregunta. –

Cuestiones relacionadas