Beispiel #1
0
		/// <summary>
		/// Синхронизация данных пользователей AD.
		/// </summary>
		private void ADSynchUsers()
		{
			if (m_distinguishedNameGroup == null)
			{
				users.Clear();
				OnReset(-1);
			}
			else
			{
				m_NextUSN = 0; // vf: временное решение, не обновляется при удалении/добавлении пользователей из/в группу без этого

				var remove = new List<string>();

				// обработка недействительных пользователей
				// заблокированные или отключенные пользователи, пользователи вне группы
				using (var result = ADSearch(
					@"LDAP://" + m_defaultNamingContext,
					@"(&(objectCategory=person)(|(userAccountControl:" + LDAP_MATCHING_RULE_BIT_OR + @":=18)" + (m_distinguishedNameGroup != String.Empty ? @"(!memberOf=" + m_distinguishedNameGroup + @")" : @"") + @")(uSNChanged>=" + m_NextUSN.ToString() + @"))",
					new string[] { @"sAMAccountName", },
					false))
				{
					remove.AddRange(result.Property(@"sAMAccountName"));
				}

				// удаленные пользователи
				using (var result = ADSearch(
					GetWellKnownObjectsPath(WKO_GUID_DELETED_OBJECTS_CONTAINER),
					@"(&(objectClass=user)(isDeleted=TRUE)(uSNChanged>=" + m_NextUSN.ToString() + @"))",
					new string[] { @"sAMAccountName" },
					true))
				{
					remove.AddRange(result.Property(@"sAMAccountName"));
				}

				remove.ForEach(i =>
				{
					AdUser removed;
					users.TryGetValue(i.ToLower(), out removed);
					if (users.Remove(i.ToLower()) == true)
						OnRemoved(-1, removed);
				});

				// обработка действительных пользователей
				using (var result = ADSearch(
					@"LDAP://" + m_defaultNamingContext,
					@"(&(objectCategory=person)(!userAccountControl:" + LDAP_MATCHING_RULE_BIT_OR + @":=18)" + (m_distinguishedNameGroup != String.Empty ? @"(memberOf=" + m_distinguishedNameGroup + @")" : @"") + @"(uSNChanged>=" + m_NextUSN.ToString() + @"))",
					AdUser.Properties,
					false))
				{
					foreach (SearchResult searchResult in result)
					{
						AdUser oldUser, newUser = new AdUser(searchResult);

						if (users.TryGetValue(newUser.Name, out oldUser) == false)
						{
							users.Add(newUser.Name, newUser);
							OnAdded(-1, newUser);
						}
						else
						{
							if (oldUser.Equals(newUser))
							{
								oldUser.CopyFrom(newUser);
								OnUpdated(-1, newUser);
							}
						}
					}
				}
			}
		}
Beispiel #2
0
        /// <summary>
        /// Синхронизация данных пользователей AD.
        /// </summary>
        private void ADSynchUsers()
        {
            if (m_distinguishedNameGroup == null)
            {
                users.Clear();
                OnReset(-1);
            }
            else
            {
                m_NextUSN = 0;                 // vf: временное решение, не обновляется при удалении/добавлении пользователей из/в группу без этого

                var remove = new List <string>();

                // обработка недействительных пользователей
                // заблокированные или отключенные пользователи, пользователи вне группы
                using (var result = ADSearch(
                           @"LDAP://" + m_defaultNamingContext,
                           @"(&(objectCategory=person)(|(userAccountControl:" + LDAP_MATCHING_RULE_BIT_OR + @":=18)" + (m_distinguishedNameGroup != String.Empty ? @"(!memberOf=" + m_distinguishedNameGroup + @")" : @"") + @")(uSNChanged>=" + m_NextUSN.ToString() + @"))",
                           new string[] { @"sAMAccountName", },
                           false))
                {
                    remove.AddRange(result.Property(@"sAMAccountName"));
                }

                // удаленные пользователи
                using (var result = ADSearch(
                           GetWellKnownObjectsPath(WKO_GUID_DELETED_OBJECTS_CONTAINER),
                           @"(&(objectClass=user)(isDeleted=TRUE)(uSNChanged>=" + m_NextUSN.ToString() + @"))",
                           new string[] { @"sAMAccountName" },
                           true))
                {
                    remove.AddRange(result.Property(@"sAMAccountName"));
                }

                remove.ForEach(i =>
                {
                    AdUser removed;
                    users.TryGetValue(i.ToLower(), out removed);
                    if (users.Remove(i.ToLower()) == true)
                    {
                        OnRemoved(-1, removed);
                    }
                });

                // обработка действительных пользователей
                using (var result = ADSearch(
                           @"LDAP://" + m_defaultNamingContext,
                           @"(&(objectCategory=person)(!userAccountControl:" + LDAP_MATCHING_RULE_BIT_OR + @":=18)" + (m_distinguishedNameGroup != String.Empty ? @"(memberOf=" + m_distinguishedNameGroup + @")" : @"") + @"(uSNChanged>=" + m_NextUSN.ToString() + @"))",
                           AdUser.Properties,
                           false))
                {
                    foreach (SearchResult searchResult in result)
                    {
                        AdUser oldUser, newUser = new AdUser(searchResult);

                        if (users.TryGetValue(newUser.Name, out oldUser) == false)
                        {
                            users.Add(newUser.Name, newUser);
                            OnAdded(-1, newUser);
                        }
                        else
                        {
                            if (oldUser.Equals(newUser))
                            {
                                oldUser.CopyFrom(newUser);
                                OnUpdated(-1, newUser);
                            }
                        }
                    }
                }
            }
        }