/// <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); } } } } } }
/// <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); } } } } } }