He notado que mi aplicación se comporta de manera extraña al trabajar con Active Directory.
Tengo una aplicación distribuída en c# .NET 3.5 de la siguiente manera:
Servidor web - Servidor de aplicaciones - AD Server
El problema radica aparentemente entre el servidor de aplicaciones que es el que se comununica con el servidor de active directory.
Particularmente se produce un error cuando seteo permisos sobre un objeto usuario que crea la aplicación. Lo estraño es que éste error es aleatorio,
aveces ocurre y otras veces no. El mensaje de error es: "(0x8007202F) The directory property cannot be found in the cache" y el código que lo origina es el siguiente:
Código:
public static void SetPermissions(string containerDn, string UserName)
{
ADsSecurity objADsSec;
SecurityDescriptor objSecDes;
AccessControlList objDAcl;
AccessControlEntry objAce1;
AccessControlEntry objAce2;
Object objSIdHex;
ADsSID objSId;
objADsSec = new ADsSecurityClass();
objSecDes = (SecurityDescriptor)(objADsSec.GetSecurityDescriptor(containerDn));
objDAcl = (AccessControlList)objSecDes.DiscretionaryAcl;
objSId = new ADsSIDClass();
objSId.SetAs((int)ADSSECURITYLib.ADS_SID_FORMAT.ADS_SID_SAM, UserName);
objSIdHex = objSId.GetAs((int)ADSSECURITYLib.ADS_SID_FORMAT.ADS_SID_SDDL);
// Add a new access control entry (ACE) object (objAce) so that the user has Full Control permissions on NTFS file system files.
objAce1 = new AccessControlEntryClass();
objAce1.Trustee = (objSIdHex).ToString();
objAce1.AccessMask = (int)ActiveDs.ADS_RIGHTS_ENUM.ADS_RIGHT_GENERIC_ALL;
objAce1.AceType = (int)ActiveDs.ADS_ACETYPE_ENUM.ADS_ACETYPE_ACCESS_ALLOWED;
objAce1.AceFlags = (int)ActiveDs.ADS_ACEFLAG_ENUM.ADS_ACEFLAG_INHERIT_ACE | (int)ActiveDs.ADS_ACEFLAG_ENUM.ADS_ACEFLAG_INHERIT_ONLY_ACE | 1;
objDAcl.AddAce(objAce1);
// Add a new access control entry object (objAce) so that the user has Full Control permissions on NTFS file system folders.
objAce2 = new AccessControlEntryClass();
objAce2.Trustee = (objSIdHex).ToString();
objAce2.AccessMask = (int)ActiveDs.ADS_RIGHTS_ENUM.ADS_RIGHT_GENERIC_ALL;
objAce2.AceType = (int)ActiveDs.ADS_ACETYPE_ENUM.ADS_ACETYPE_ACCESS_ALLOWED;
objAce2.AceFlags = (int)ActiveDs.ADS_ACEFLAG_ENUM.ADS_ACEFLAG_INHERIT_ACE | 1;
objDAcl.AddAce(objAce2);
objSecDes.DiscretionaryAcl = objDAcl;
// Set permissions on the NTFS file system folder.
objADsSec.SetSecurityDescriptor(objSecDes, containerDn);
}
Es un código de lo más utilizado para setear permisos y es el que figura en el siguiente how to:[URL="http://support.microsoft.com/kb/899553/en-us"]http://support.microsoft.com/kb/899553/en-us[/URL]
Cabe aclarar que las credenciales con que se ejecuta el código tiene permisos administrativos; y cómo mencione antes, algunas veces no funciona y arroja el error (0x8007202F). Por ejemplo los usuarios se crean dentro de unidades organizativas y para otros usuarios en otras OU este error no ocurre.Tanto las OU como los usuarios se generan siempre con las mismas credenciales y ejecutan el mismo código.
Una pruba que hice fue reiniciar el servidor en un ambiente de pruebas y dejó de ocurrir el error para esa OU.
Pero en el ambiente de producción siguen ocurriendo estos problemeas, más aya de algún reinicio eventual.
Para mi es muy extraño, es como si se tratara de algún problema con el caché, ya que al reiniciar deja de ocurrir. Pero al tiempo vuelve a pasar para otra OU.
Sugerencias?