servidor puede poner funcional dominio controlador contacto con active c# active-directory directoryservices adsi

c# - puede - Cómo obtener un error al consultar Active Directory solo en el servidor



el servidor no es funcional windows server 2012 (1)

Tengo el siguiente bloque de código que consulta Active Directory para usuarios por nombre de grupo usando System.DirectoryServices.AccountManagement :

var domainContext = new PrincipalContext(ContextType.Domain, "company.container.internal"); var groupPrincipal = GroupPrincipal.FindByIdentity(domainContext, IdentityType.Name, "Lvl1Users"); if (groupPrincipal != null) { //Read the values }

Ahora el sitio usa lo siguiente:

  • IIS7 en Win2k8
  • Autenticación de Windows
  • Suplantación = Verdadero
  • Pool de aplicaciones en .NET 4.0 usando ''NETWORK SERVICE'' como la cuenta

En mi máquina local (ya sabes cómo funciona), todo funciona muy bien. Mis compañeros que lo prueban localmente también funciona bien. Sin embargo, una vez desplegado en el servidor muestra lo siguiente:

Se produjo un error de operaciones.

Todo lo que investigo dice que es un problema de permisos. Una cosa a tener en cuenta, en mi equipo local, estoy en el dominio de MainNetwork , que es el dominio padre al company.container.internal que estoy consultando. La máquina IIS está en company.container.internal y está consultando el mismo dominio. Honestamente, creo que la situación más desafiante es leer AD en mi máquina local que está en un dominio diferente, pero funciona. En el servidor que está consultando el mismo dominio, falla.

Esto es lo que he intentado, y ninguno de estos ha funcionado:

  • Cambiar AppPool a ''LocalSystem''
  • Cambie AppPool para usar una cuenta de administrador super-duper estática
  • Se utilizó suplantación en el código para manipular el contexto de las llamadas en un bloque local con un usuario administrador en el dominio de MainNetwork .
  • Se utilizó suplantación en el código para manipular el contexto de las llamadas en un bloque local con un usuario administrador en el dominio company.container.internal .
  • Agregar en using (HostingEnvironment.Impersonate())

¿Qué da aquí? Intenté imitar a todo tipo de administrador de energía en ambos dominios y utilicé varias configuraciones de AppPool, y sigo recibiendo el mismo error. ¿Hay algo que necesite cambiar en el código con la declaración de los dominios, o hay un problema de permisos que me falta?


Me di cuenta de esto y resultó que el uso de HostingEnvironment.Impersonate() todavía estaba en la raíz para resolver el problema. Ya había intentado esto, pero había otro problema con mi código.

El problema a menudo es que el contexto para el que se realizan las llamadas de Active Directory está bajo un usuario que no tiene permisos (también puede suceder cuando identity impersonate="true" en ASP.NET, debido al hecho de que el token de los usuarios es "token secundario" que no se puede usar cuando se autentica contra otro servidor desde: http://bit.ly/1753RjA ).

El siguiente código asegurará que el bloque de código en ejecución se ejecute en el contexto de, por ejemplo, la AppPool (es decir, NETWORKSERVICE ) con la que se ejecuta el sitio ASP.NET.

using (HostingEnvironment.Impersonate()) { var domainContext = new PrincipalContext(ContextType.Domain, "myDomain.com"); var groupPrincipal = GroupPrincipal.FindByIdentity(domainContext, IdentityType.Name, "PowerUsers"); if (groupPrincipal != null) { //code to get the infomation } }

Sin embargo, un detalle súper importante es que todo el código que llama a Active Directory debe estar en ese bloque. Había usado algún código. Un miembro del equipo mío escribió que devolvía los resultados de una consulta LINQ de tipo Users (clase personalizada), pero no evaluaba la expresión (mala práctica). Por lo tanto, se devolvió el árbol de expresión en lugar de los resultados.

Lo que terminó sucediendo es que el código de llamada finalmente evaluó los resultados y aún apareció el mensaje An operations error occurred . Pensé que la corrección de código anterior no funcionaba. Cuando de hecho lo hizo, pero había un código que evaluaba los resultados fuera del bloque.

En pocas palabras, asegúrese de que todo el código para acceder a Active Directory esté dentro de ese bloque de using y la excepción se debe corregir si el servicio / aplicación se implementa en el servidor.