/// <summary> /// Busca un usuario con autenticacion /// Returna como parametro el resultado de loging /// </summary> /// <param name="userName">nombre de loging de usuario</param> /// <param name="password">password</param> /// <param name="loginResult">resultado de loging</param> /// <returns>DirectoryEntry</returns> DirectoryEntry User_Get(string userName, string password, out LoginResult loginResult) { DirectoryEntry userDirectoryEntry = null; loginResult = LoginResult.LOGIN_OK; SearchResult result = User_Get_Result(userName, _directoryEntrySearchRoot); //Si esl resultado de busqueda en nodes es nulo el usuario no exisate en el dominio if (result == null) { loginResult = LoginResult.LOGIN_USER_DOESNT_EXIST; return(null); } //PasswordExpired if (ADWrapper.GetProperty(result, ADProperties.PWDLASTSET) == "0") { loginResult = LoginResult.ERROR_PASSWORD_MUST_CHANGE; return(null); } //string str = EnlistValue(results); //si result no es nulo se puede crear una DirectoryEntry if (result != null) { userDirectoryEntry = new DirectoryEntry(result.Path, userName, password); } //Intenta obtener una propiedad para determinar si el usuario se logueo con clave correcta o no.- try { int userAccountControl = Convert.ToInt32(ADWrapper.GetProperty(userDirectoryEntry, ADProperties.USERACCOUNTCONTROL)); } catch (TechnicalException te) { if (te.ErrorId == "4101") { loginResult = LoginResult.LOGIN_USER_OR_PASSWORD_INCORRECT; return(userDirectoryEntry); } } if (User_IsAccountActive(userDirectoryEntry) == false) { loginResult = LoginResult.LOGIN_USER_ACCOUNT_INACTIVE; return(userDirectoryEntry); } if (User_IsAccountLockout(userDirectoryEntry)) { loginResult = LoginResult.LOGIN_USER_ACCOUNT_LOCKOUT; return(userDirectoryEntry); } return(userDirectoryEntry); }
/// <summary> /// Este metodo realiza una aperacion logica con el valor userAccountControl para deternçminar si la cuenta de usuario /// esta abilitada o no.- /// La bandera para determinar si la cuenta está activa es un valor binario (decimal = 2) /// Los valores predeterminados de UserAccountControl para Usuario normal: 0x200 (512) /// </summary> /// <param name="de"></param> /// <returns></returns> public static bool User_IsAccountActive(DirectoryEntry de) { //Convierte UserAccountControl a la operacion logica int userAccountControl = Convert.ToInt32(ADWrapper.GetProperty(de, ADProperties.USERACCOUNTCONTROL)); int userAccountControl_Disabled = Convert.ToInt32(ADAccountOptions.UF_ACCOUNTDISABLE); int flagExists = userAccountControl & userAccountControl_Disabled; return(flagExists == 0); //Si es = a 2 es por que esta DESHABILITADO (512 - 2) }
///// <summary> ///// Obtiene un usuario sin pasar clave.- ///// </summary> ///// <param name="userName"></param> ///// <returns></returns> internal static SearchResult User_Get_Result(string userName, DirectoryEntry root) { DirectorySearcher deSearch = new DirectorySearcher(root); deSearch.Filter = "(&(objectClass=user)(sAMAccountName=" + ADWrapper.FilterOutDomain(userName) + "))"; deSearch.SearchScope = System.DirectoryServices.SearchScope.Subtree; SearchResult rs = deSearch.FindOne(); deSearch.Dispose(); return(rs); }
//public ADGroup(LdapEntry wLdapEntry) //{ // if (wLdapEntry.ContainsKey(ADProperties.NAME)) // _Name = wLdapEntry[ADProperties.NAME][0]; // if (wLdapEntry.ContainsKey(ADProperties.DISTINGUISHEDNAME)) // _Name = wLdapEntry[ADProperties.DISTINGUISHEDNAME][0]; // if (wLdapEntry.ContainsKey(ADProperties.DESCRIPTION)) // _Name = wLdapEntry[ADProperties.DESCRIPTION][0]; // if (wLdapEntry.ContainsKey(ADProperties.LOGINNAME)) // _Name = wLdapEntry[ADProperties.LOGINNAME][0]; // if (wLdapEntry.ContainsKey(ADProperties.OBJECTCATEGORY)) // _Name = wLdapEntry[ADProperties.OBJECTCATEGORY][0]; // if (wLdapEntry.ContainsKey(ADProperties.USERPRINCIPALNAME)) // _Domain = wLdapEntry[ADProperties.USERPRINCIPALNAME][0].Split('.').First(); // if (!String.IsNullOrEmpty(_DistinguishedName)) // { // SetNameInfo(_DistinguishedName); // } //} /// <summary> /// /// </summary> /// <param name="directoryGroup"></param> public ADGroup(DirectoryEntry directoryGroup) { String domainAddress; String userPrincipalName = ADWrapper.GetProperty(directoryGroup, ADProperties.USERPRINCIPALNAME); _Name = ADWrapper.GetProperty(directoryGroup, ADProperties.NAME); _DistinguishedName = ADWrapper.GetProperty(directoryGroup, ADProperties.DISTINGUISHEDNAME); _Description = ADWrapper.GetProperty(directoryGroup, ADProperties.DESCRIPTION); _FirstName = ADWrapper.GetProperty(directoryGroup, ADProperties.LOGINNAME); _Category = ADWrapper.GetProperty(directoryGroup, ADProperties.OBJECTCATEGORY); _CN = ADWrapper.GetProperty(directoryGroup, ADProperties.CONTAINERNAME); if (!string.IsNullOrEmpty(userPrincipalName)) { domainAddress = userPrincipalName.Split('@')[1]; } else { domainAddress = String.Empty; } if (!string.IsNullOrEmpty(domainAddress)) { _Domain = domainAddress.Split('.').First(); } //if (pDirectoryEntry.Properties.Contains("sAMAccountName")) //{ // base.Name = pDirectoryEntry.Properties["sAMAccountName"][0].ToString(); //Nombre usuario como aaguirre // _CN = base.Name; //} //if (pDirectoryEntry.Properties.Contains("userPrincipalName")) // _UserPrincipalName = pDirectoryEntry.Properties["userPrincipalName"][0].ToString();//Nombre usuario como [email protected] //if (pDirectoryEntry.Properties.Contains("name")) // base.FullName = pDirectoryEntry.Properties["name"][0].ToString(); //Nombre completo //if (pDirectoryEntry.Properties.Contains("sAMAccountType")) // _FirstName = pDirectoryEntry.Properties["sAMAccountType"][0].ToString(); //if (pDirectoryEntry.Properties.Contains("objectCategory")) // base.Category = pDirectoryEntry.Properties["objectCategory"][0].ToString(); //ej:CN=GS_Comite_comunicacion_RW,OU=Seguridad,DC=Datacom,DC=org if (!String.IsNullOrEmpty(_DistinguishedName)) { SetNameInfo(_DistinguishedName); } }
/// <summary> /// Busca un objeto <see cref="ADWrapper"/> si no lo encuentra intenta crearlo e insertarlo al diccionario.- /// La creacion del diccionario se hace para no instanciar cientos de veses la clase ADWrapper. ya que esta tarea requiere ,mas uso de CPU que el costo de mantener en memoria /// un diccionario con porcos ADWrapper. /// En el mundo reali no existiran gran cantidad de clases ADWrapper, pero si muchas quisa cientos de ejecuciones del metodos de autenticacio, q son los que /// crearian instancias de ADWrapper.- /// </summary> /// <param name="domainName">Nombre del dominio</param> /// <returns></returns> internal static ADWrapper Find_ADWrapper(string domainName) { // Si ADWrapper no esta en el diccionario lo intenta agregar if (_ADWrapperDictionary.ContainsKey(domainName) == false) { DomainUrlInfo di = StaticsValues.Find_DomainUrlInfo(domainName); ADWrapper ad = new Fwk.Security.ActiveDirectory.ADWrapper(di.LDAPPath, di.Usr, di.Pwd); _ADWrapperDictionary.Add(domainName, ad); return(ad); } //Si el codigo pasa por aqui es por que existe return(_ADWrapperDictionary[domainName]); }
/// <summary> /// /// </summary> /// <returns></returns> DirectoryEntry GetImpersonate_SearchRoot_DE() { try { return(new DirectoryEntry(_DomainUrlInfo.LDAPPath, _DomainUrlInfo.Usr, _DomainUrlInfo.Pwd, AuthenticationTypes.Secure)); } catch (Exception e)// Cuando el usuario no existe o clave erronea { Exception te1 = ADWrapper.ProcessActiveDirectoryException(e); TechnicalException te = new TechnicalException(string.Format(Resource.AD_Impersonation_Error, te1.Message), te1.InnerException); ExceptionHelper.SetTechnicalException <ADWrapper>(te); te.ErrorId = "4103"; throw te; } }
/// <summary> /// Busca un objeto <see cref="ADWrapper"/> si no lo encuentra intenta crearlo e insertarlo al diccionario.- /// La creacion del diccionario se hace para no instanciar cientos de veses la clase ADHelper. ya que esta tarea requiere ,mas uso de CPU que el costo de mantener en memoria /// un diccionario con porcos ADHelper. /// En el mundo reali no existiran gran cantidad de clases ADHelper, pero si muchas quisa cientos de ejecuciones del metodos de autenticacio, q son los que /// crearian instancias de ADHelper.- /// </summary> /// <param name="domainName">Nombre del dominio</param> /// <returns></returns> internal static ADWrapper Find_ADHelper(string domainName) { // Si ADHelper no esta en el diccionario lo intenta agregar if(_ADHelperDictionary.ContainsKey(domainName) == false) { DomainUrlInfo di = StaticsValues.Find_DomainUrlInfo(domainName); ADWrapper ad = new Fwk.Security.ActiveDirectory.ADWrapper(di.LDAPPath,di.Usr,di.Pwd); _ADHelperDictionary.Add(domainName,ad); return ad; } //Si el codigo pasa por aqui es por que existe return _ADHelperDictionary[domainName]; }
/// <summary> /// Este metodo realiza una aperacion logica con el valor userAccountControl para deternçminar si la cuenta de usuario /// esta habilitada o no.- /// La bandera para determinar si la cuenta está bloqueada es un valor binario (decimal = 16) /// Los valores predeterminados de UserAccountControl para Usuario normal: 0x200 (512) /// En un dominio basado en Windows Server 2003, LOCK_OUT y /// PASSWORD_EXPIRED han sido reemplazados con un nuevo atributo denominado ms-DS-User-Account-Control-Computed /// </summary> /// <param name="de"></param> /// <returns></returns> public static bool User_IsAccountLockout(DirectoryEntry de) { //Convierte UserAccountControl a la operacion logica int userAccountControl = Convert.ToInt32(ADWrapper.GetProperty(de, ADProperties.USERACCOUNTCONTROL)); int flag = userAccountControl & Convert.ToInt32(ADAccountOptions.UF_LOCKOUT); //int flag2 = 528 & Convert.ToInt32(ADAccountOptions.UF_LOCKOUT); -- solo para test //if (flag == 0) // return false; //else // return true; // UF_LOCKOUT = 16 en Decimal return(!(flag == 0)); // No estoy seguro de utilizar la return (flag == 16); sentencia q apareentenmete seria = () }
/// <summary> /// Constructor /// </summary> /// <param name="resultUserUser"></param> public ADUser(SearchResult resultUser) { String domainAddress; String userPrincipalName = ADWrapper.GetProperty(resultUser, ADProperties.USERPRINCIPALNAME); String domainName; _UserAccountControl = ADWrapper.GetProperty(resultUser, ADProperties.USERACCOUNTCONTROL); _firstName = ADWrapper.GetProperty(resultUser, ADProperties.FIRSTNAME); _middleName = ADWrapper.GetProperty(resultUser, ADProperties.MIDDLENAME); _lastName = ADWrapper.GetProperty(resultUser, ADProperties.LASTNAME); _loginName = ADWrapper.GetProperty(resultUser, ADProperties.LOGINNAME); if (!string.IsNullOrEmpty(userPrincipalName)) { domainAddress = userPrincipalName.Split('@')[1]; } else { domainAddress = String.Empty; } if (!string.IsNullOrEmpty(domainAddress)) { domainName = domainAddress.Split('.').First(); } else { domainName = String.Empty; } _loginNameWithDomain = String.Format(@"{0}\{1}", domainName, _loginName); _streetAddress = ADWrapper.GetProperty(resultUser, ADProperties.STREETADDRESS); _city = ADWrapper.GetProperty(resultUser, ADProperties.CITY); _state = ADWrapper.GetProperty(resultUser, ADProperties.STATE); _postalCode = ADWrapper.GetProperty(resultUser, ADProperties.POSTALCODE); _country = ADWrapper.GetProperty(resultUser, ADProperties.COUNTRY); _company = ADWrapper.GetProperty(resultUser, ADProperties.COMPANY); _department = ADWrapper.GetProperty(resultUser, ADProperties.DEPARTMENT); _homePhone = ADWrapper.GetProperty(resultUser, ADProperties.HOMEPHONE); _extension = ADWrapper.GetProperty(resultUser, ADProperties.EXTENSION); _mobile = ADWrapper.GetProperty(resultUser, ADProperties.MOBILE); _fax = ADWrapper.GetProperty(resultUser, ADProperties.FAX); _emailAddress = ADWrapper.GetProperty(resultUser, ADProperties.EMAILADDRESS); _title = ADWrapper.GetProperty(resultUser, ADProperties.TITLE); _manager = ADWrapper.GetProperty(resultUser, ADProperties.MANAGER); if (!String.IsNullOrEmpty(_manager)) { String[] managerArray = _manager.Split(','); _managerName = managerArray[0].Replace("CN=", ""); } //_LockedOut = Convert.ToBoolean(resultUser.GetDirectoryEntry().InvokeGet("IsAccountLocked")); //_LoginResult = ADWrapper.User_Get_LoginResult(resultUser); }