2010-05-25 24 views
6

Estoy intentando determinar si un usuario es miembro de un grupo determinado utilizando System.DirectoryServices.AccountManagment.DirectoryServicesCOMException cuando se trabaja con System.DirectoryServices.AccountManagement

  • Estoy haciendo esto dentro de un SharePoint WebPart en SharePoint 2007 en un sistema de 64 bits.
  • Objetivos del proyecto .NET 3.5
  • La suplantación está habilitada en web.config.
  • El sitio de IIS en cuestión utiliza un conjunto de aplicaciones de IIS con un usuario de dominio configurado como la identidad.

soy capaz de crear instancias de un PrincipalContext como tal:

PrincipalContext pc = new PrincipalContext(ContextType.Domain)

A continuación, tratar de agarrar un director:

using (PrincipalContext pc = new PrincipalContext(ContextType.Domain)) 
{ 
    GroupPrincipal group = GroupPrincipal.FindByIdentity(pc, "MYDOMAIN\somegroup"); 
    // snip: exception thrown by line above. 
} 

Tanto el arriba y UserPrincipal.FindByIdentity con un usuario SAM lanzar un DirectoryServicesCOMException: "Error de inicio de sesión: nombre de usuario desconocido o contraseña incorrecta"

He intentado pasar un nombre completo de SAMA a FindByIdentity (en forma de MYDOMAIN \ username) o solo el nombre de usuario sin ningún cambio en el comportamiento. Intenté ejecutar el código con otras credenciales usando los enfoques HostingEnvironment.Impersonate y SPSecurity.RunWithElevatedPrivileges y también experimenté el mismo resultado.

También he intentado crear instancias de mi contexto con el nombre de dominio en su lugar:

Principal Context pc = new PrincipalContext(ContextType.Domain, "MYDOMAIN");

Esto arroja una PrincipalServerDownException: "El servidor no ha podido establecer contacto con"

Estoy trabajando en un servidor razonablemente reforzado. No bloqueé el sistema, así que no estoy seguro de qué se le haya hecho. Si hay credenciales que debo asignar al usuario de la identidad de mi grupo o en la política de seguridad del dominio para que funcionen, puedo configurar el dominio en consecuencia. ¿Hay alguna configuración que impida la ejecución de mi código? ¿Me estoy perdiendo algo en el código en sí? ¿Esto simplemente no es posible en una web de SharePoint?

EDIT: Al realizar más pruebas, mi código funciona correctamente cuando se prueba en una aplicación de la consola dirigida a .NET 4.0. Apunté a un marco diferente porque no tenía AccountManagement disponible para mí en la aplicación de la consola cuando tenía como objetivo .NET 3.5 por algún motivo.

using (PrincipalContext pc = new PrincipalContext(ContextType.Domain)) 
using (UserPrincipal adUser = UserPrincipal.FindByIdentity(pc, "MYDOMAIN\joe.user")) 
using (GroupPrincipal adGroup = GroupPrincipal.FindByIdentity(pc, "MYDOMAIN\user group")) 
{ 
    if (adUser.IsMemberOf(adGroup)) 
    { 
     Console.WriteLine("User is a member!"); 
    } 
    else 
    { 
     Console.WriteLine("User is NOT a member."); 
    } 
} 

¿Qué varía en mi entorno de SharePoint que podría impedir la ejecución de esta función?

Respuesta

1

Agregué la cuenta utilizada por el grupo de aplicaciones de IIS al grupo Administradores y este problema se resolvió.

+3

Probablemente debas notar que este es el enfoque de "Iron Fist of Justice" y no una solución recomendada para un sistema de producción o de Internet. –

+2

@Burly - Buen punto. Esto funciona en mis entornos: un sistema interno en una red desconectada. No es una solución con la que estoy contento, pero es una solución, así que tendrá que funcionar por ahora.Realmente espero obtener alguna orientación sobre los privilegios que tienen los administradores que permiten que el código se ejecute sin errores. Me encantaría eliminar el privilegio de administrador de ese usuario y otorgar algo más seguro mientras continúo la operación como lo requiero. – antik

+0

@antik ¿Eventualmente eliminó el privilegio de administrador y podrá ejecutar esto sin Excepción? – FMFF

Cuestiones relacionadas