es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Error LDAP: El usuario tiene derechos de acceso insuficientes. : LdapErr: DSID-0C09099D, comentario: Error procesando el control.

Quiero obtener cambios incrementales de Active Directory utilizando C# y para eso estoy intentando construir una solución como se menciona en el siguiente artículo (usando el Control DirSync).

https://learn.microsoft.com/es-es/windows/win32/ad/polling-for-changes-using-the-dirsync-control

Sin embargo, me estoy enfrentando a los siguientes problemas:
1) Al utilizar el siguiente código, obtengo una excepción que dice El usuario tiene derechos de acceso insuficientes. El usuario forma parte del grupo de administradores.

¿Qué permisos adicionales se deben otorgar a esa cuenta? ¿Y cómo?

LdapConnection connection = new LdapConnection("adfs.fed.zzz.com");
connection.SessionOptions.ProtocolVersion = 3;
connection.Credential = new System.Net.NetworkCredential("adfsfed\username", "password");
connection.AuthType = AuthType.Basic;
connection.Bind();

var filter = “(&(objectClass=*))”;
var searchRequest = new SearchRequest(“”, filter, SearchScope.Subtree, properties);

DirSyncRequestControl dirSyncRC = new DirSyncRequestControl(null, DirectorySynchronizationOptions.None);
searchRequest.Controls.Add(dirSyncRC);

var response = connection.SendRequest(searchRequest) as SearchResponse;


2) Si utilizo el siguiente código, no obtengo ninguna excepción pero obtengo un resultado vacío en la cookie. ```csharp String[] properties = { "objectGUID", "sAMAccountName", "displayName", "mail", "member" }; String filter = "(|(objectClass=group)(objectClass=user))"; DirectorySearcher directorySearcher = new DirectorySearcher(myLdapConnection, filter, properties); var dSynch = new DirectorySynchronization(System.DirectoryServices.DirectorySynchronizationOptions.None); directorySearcher.DirectorySynchronization = dSynch; directorySearcher.SearchScope = System.DirectoryServices.SearchScope.Subtree; var results = directorySearcher.FindAll(); var cookie = dSynch.GetDirectorySynchronizationCookie();

Consideraciones:
1) Solo tengo un controlador de dominio.
2) Soy administrador del sistema. Por lo tanto, puedo asignar los permisos adecuados al usuario.

Por favor, ayuda.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para resolver el primer problema donde obtienes la excepción “El usuario tiene derechos de acceso insuficientes”, debes asegurarte de que la cuenta de usuario que estás utilizando tenga el permiso “Replicar cambios de directorio”.

    Para otorgar este permiso, sigue estos pasos:
    1. Abre el complemento Active Directory Users and Computers en tu controlador de dominio.
    2. Haz clic con el botón derecho en el nombre del dominio y selecciona “Delegar control”.
    3. Haz clic en Siguiente hasta llegar a la pantalla “Usuarios o grupos”.
    4. Haz clic en el botón “Agregar” y selecciona la cuenta de usuario que estás utilizando.
    5. Haz clic en Siguiente hasta llegar a la pantalla “Permisos”.
    6. Selecciona “Crear una tarea personalizada para delegar”.
    7. Selecciona “Solo los siguientes objetos en la carpeta”.
    8. Marca la casilla junto a “Objetos de usuario”.
    9. En “Permisos”, selecciona “Replicar cambios de directorio”.
    10. Haz clic en Siguiente y luego en Finalizar.

    Para el segundo problema, se recomienda utilizar el control DirSync en lugar del objeto DirectorySynchronization al intentar obtener cambios incrementales de Active Directory.

    Intenta modificar tu código de la siguiente manera:

    LdapConnection connection = new LdapConnection("adfs.fed.zzz.com");
    connection.SessionOptions.ProtocolVersion = 3;
    connection.Credential = new System.Net.NetworkCredential("adfsfed\\username", "password");
    connection.AuthType = AuthType.Basic;
    connection.Bind();
    
    var filter = "(&(objectClass=*))";
    var searchRequest = new SearchRequest("", filter, SearchScope.Subtree);
    
    DirSyncRequestControl dirSyncRC = new DirSyncRequestControl(null, DirectorySynchronizationOptions.None);
    searchRequest.Controls.Add(dirSyncRC);
    
    SearchResultEntryCollection result = null;
    
    while (true)
    {
        var response = (SearchResponse)connection.SendRequest(searchRequest);
    
        if (response.Controls.Length != 1 || !(response.Controls[0] is DirSyncResponseControl))
        {
            throw new InvalidOperationException("La respuesta no contiene el control de respuesta DirSync esperado.");
        }
    
        var dirSyncResponse = (DirSyncResponseControl)response.Controls[0];
    
        if (dirSyncResponse.MoreData == false)
        {
            break;
        }
    
        searchRequest.Controls.Clear();
        dirSyncRC = new DirSyncRequestControl(dirSyncResponse.Cookie, DirectorySynchronizationOptions.None);
        searchRequest.Controls.Add(dirSyncRC);
    
        if (result == null)
        {
            result = response.Entries;
        }
        else
        {
            foreach (SearchResultEntry entry in response.Entries)
            {
                result.Add(entry);
            }
        }
    }
    
    var cookie = ((DirSyncResponseControl)response.Controls[0]).Cookie;
    

    Este código envía una solicitud al directorio y recupera los objetos que han sido modificados desde la última solicitud. El objeto DirSyncResponseControl contiene una cookie que se puede utilizar en la siguiente solicitud para recuperar los objetos que han sido modificados desde la solicitud anterior.

    Ten en cuenta que si estás obteniendo la excepción “Límite de tamaño excedido”, debes aumentar la configuración MaxPageSize en tu controlador de dominio. Puedes hacerlo siguiendo estos pasos:
    1. Abre el complemento Active Directory Users and Computers en tu controlador de dominio.
    2. Haz clic con el botón derecho en el nombre del dominio y selecciona “Propiedades”.
    3. Selecciona la pestaña “Objeto”.
    4. En “Directiva de consulta predeterminada”, haz clic en el botón “Editar”.
    5. Selecciona la pestaña “Configuración de atributo”.
    6. En “Nombre de atributo”, selecciona “ms-DS-Resultant-PSO”.
    7. En “Es igual a”, selecciona “Cualquier valor”.
    8. En “Aplicar en”, selecciona “Objetos de usuario”.
    9. Haz clic en el botón “Agregar” y selecciona el objeto del equipo controlador de dominio.
    10. En “Permisos”, selecciona “Derecho extendido”.
    11. Marca la casilla junto a “Validated write to ms-DS-Resultant-PSO”.
    12. Haz clic en Aplicar y luego en Aceptar.

    Después de hacer este cambio, es posible que necesites reiniciar el servicio de Active Directory Domain Services para que los cambios surtan efecto.

Comments are closed.