Foros del Web » Programación para mayores de 30 ;) » .NET »

Problemas con Active Directory en Windows 2003

Estas en el tema de Problemas con Active Directory en Windows 2003 en el foro de .NET en Foros del Web. 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 ...
  #1 (permalink)  
Antiguo 16/10/2012, 07:58
 
Fecha de Ingreso: octubre-2012
Mensajes: 2
Antigüedad: 11 años, 6 meses
Puntos: 0
Problemas con Active Directory en Windows 2003

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?
  #2 (permalink)  
Antiguo 24/10/2012, 08:43
 
Fecha de Ingreso: octubre-2012
Mensajes: 2
Antigüedad: 11 años, 6 meses
Puntos: 0
Respuesta: Problemas con Active Directory en Windows 2003

Tema resuelto.

El por que del problema se especifíca en el siguiente link: http://support.microsoft.com/kb/306867/en-us

Sguir el siguiente hilo: http://social.technet.microsoft.com/Forums/es-ES/winserverDS/thread/fb78fca7-01b0-4ad9-b519-bae8c4b31952


Se debe de utilizar el namespace System.DirectoryServices desde .NET 2.0 en adelante para manejo de ActiveDirectory.

La clase en particular con la que manejar permisos es ActiveDirectorySecurity.
El siguiente ejemplo puede ayudar a dar una idea de como utilizar esta clase:

Código:
public static void  SetPermissionsADS(DirectoryEntry newUser)
{
	ActiveDirectorySecurity ads = null;
	DirectoryEntry entry = null;

	SecurityIdentifier newUserSid = ObtenerSID_DirectoryEntry(newUser);
	
	entry = new DirectoryEntry(newUser.Parent.Path); 

	ads = entry.ObjectSecurity;
	ActiveDirectoryAccessRule allowPermissions = new ActiveDirectoryAccessRule(newUserSid, ActiveDirectoryRights.GenericAll,
								   AccessControlType.Allow, ActiveDirectorySecurityInheritance.All);
	ads.SetAccessRule(allowPermissions);

	entry.CommitChanges();
	
	// Create a SecurityIdentifier object for "everyone".
	//SecurityIdentifier everyoneSid = new SecurityIdentifier(WellKnownSidType.WorldSid, null);

	// Create a SecurityIdentifier object for "self".
	//SecurityIdentifier selfSid = new SecurityIdentifier(WellKnownSidType.SelfSid, null);
}

Etiquetas: directory, net, windows, aplicaciones
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 07:16.