Inicio > .NET Framework, C++/CLI, Resolución de problemas > An operations error occurred con Directorio Activo

An operations error occurred con Directorio Activo


Si me has seguido últimamente sabrás que he estado trabajando con el Directorio Activo. Primero escribí sobre cómo realizar búsquedas de usuarios en el AD. Luego, hablé sobre un problema de acceso denegado al actualizar propiedades del AD. Pues bien, ahora nos hemos topado con otro problema.

Resulta que al ejecutar el código mostrado en el artículo anterior todo funciona bien. Hasta que metimos dicho código en una página de aplicación de SharePoint. Cuál no sería nuestra sorpresa al encontrarnos con un System.DirectoryServices.DirectoryServicesCOMException con el siguiente mensaje de error: “an operations error occurred”. Sin mayor información.

La frustración fue mayor cuando vimos que el error ocurría al realizar la búsqueda de usuario, ni siquiera al actualizar algún dato.

auto searcher = gcnew DirectorySearcher();            
searcher->Filter = String::Format(L"(SAMAccountName={0})", account);            
            
auto result = searcher->FindOne(); // <-- An operations error occurred

Pues menudo lío. Comenzamos a hacer una búsqueda en Internet, con varias recomendaciones. En particular dimos con esta: Common System.DirectoryServices Issues and Solution. Intentamos seguir las recomendaciones expuestas en la tercera pregunta, con estos resultados.

1.- Usar acceso anónimo. No podemos porque todo el portal de SharePoint no usa acceso anónimo, y por reglas de seguridad del cliente no podemos emplearlo.

2.- Utilizar un componente COM+. ¿En serio? ¿Quién emplea COM+ hoy en día? Además instalar este tipo de componentes nos hubiera llevado días, por políticas del cliente.

3.- Delegación mediante <identity impersonate=”true”> en el web.config. Lo intentamos, pero no nos funcionó.

4.- Correr el proceso del IIS como usuario de dominio. El cliente casi nos corre de su oficina. Y no podemos usar al usuario que ya nos había dado porque pondría en riesgo toda la granja ya existente.

5.- Personificar programáticamente al usuario. Lo intentamos, pero ¿cómo?

Es decir, 5) parecía el camino a seguir. Intentamos correr SPSecurity.RunWithElevatedPrivileges sin suerte. El problema es que el usuario y la contraseña los ponemos después de encontrar al usuario, cuando queremos modificar. ¿Entonces?

DirectorySearcher tiene un parámetro en su constructor: un DirectoryEntry (al cual podríamos poner un usuario y una contraseña), el cual usualmente tiene la unidad organizacional de la raíz del dominio. El problema en mi caso es que mi cliente tiene un bosque con ocho dominios, y ciertamente quiere que buscásemos en cada uno de estos al usuario, porque cambian constantemente. De ahí que DirectorySearcher siempre lo iniciábamos con el constructor vacío.

Fue ahí cuando se me ocurrió: ¿y si creo un DirectoryEntry vacío, le pongo un usuario y contraseña, y lo paso al DirectorySearcher?

auto entry = gcnew DirectoryEntry();
entry->Username = "arthur.dent";
entry->Password = "42";

auto searcher = gcnew DirectorySearcher(entry);
searcher->Filter = String::Format(L"(SAMAccountName={0})", account);

auto result = searcher->FindOne();

 

Y para mi sorpresa, el código anterior funcionó. Nota que el DirectoryEntry, en lugar de pasarle el dominio o alguna OU, lo dejamos vacío y sólo le pusimos las credenciales. Luego, creamos el searcher con éstas, y buscamos al usuario. Y vaya: nos trajo todo completito. Y ahora ya está funcionando esta parte.

¡Espero que esto sirva de ayuda!

  1. Aún no hay comentarios.
  1. No trackbacks yet.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s