2013-05-01 2 views
0

활성 디렉토리에서 사용자 및 그룹을 가져 오는 중 일부 테스트 후에 memberOFmember과 일치하지 않음을 알게되었습니다. example userA는 groupW의 회원이지만 groupW는 userA를 회원으로 표시하지 않습니다. 이 문제를 해결하기 위해 우리는 회원과 회원을 모두 확보해야만했습니다.2의 델타 찾기 IEnumerable <T>

Active Directory에서
public class User 
    { 
     public string UserName { get; set; } 
     public IList<string> MemberOf { get; set; } // list of group names 
    } 

public class Group 
{ 
    public string Name { get; set; } 
    public IList<string> Members { get; set; } // list of username 
} 

나는 델타를 얻을 수있는 방법

IEnumerable<Group> allGroups 
IEnumerable<User> allUsers 

를 얻을?

나는이 개 사전을 가져야한다 또는 조회 .. 등

  1. allGroups 목록 User.MemberOF 에있는 모든 그룹이 사전은 사용자의 그룹 이름과 값 목록으로 키가 있어야합니다.

예 GROUPA 사용자 {A, B, C}, GroupB가 사용자 {A, C}

  1. ALLUSERS 에서 모든 사용자가 있어야 Group.member 사전에서 발견되지 사용자 이름과 그룹의 값 목록으로 키를 입력하십시오.

예를 들어 사용자 A 그룹 {X, Y} 사용자 B 그룹 {X, Z}

편집 : 또 다른 예는 :이은 2 IEnumerable을 Active Directory에서 반환한다고 가정 해 봅시다.

`IEnumerable<Group> allGroups` contains 
- GroupA {"Mike","Jan","David"} 
- GroupB {"Kim","David","Jolan","Tim"} 

    // where Groupx is the name of the group and between {""} is the list of member 

    IEnumerable<User> allUsers contains 

- Mike {"GroupA","GroupB","GroupC"} 
- David {"GroupA","GroupB"} 
- Jolan {"GroupB","GroupC"} 

이 예에서 우리는 LDAP에 groupA의 모든 구성원을 얻으려고 요청할 때 "졸란"이 나열되지 않음을 알 수 있습니다. 그러나 "졸란"이 회원 인 모든 그룹을 얻으려고하면 "그룹 A"가 표시됩니다. "Mike"와 마찬가지로 그는 GroupB 및 GroupC의 구성원이기도합니다. GroupC가 목록에 없습니다. 이 경우 "David" 에 올바른 값이 있습니다. 그는 내가 좀 더 명확

을 희망이

Dictionary<string,IList<string>> missingUsers; 
Item 1 > key="Mike", Value={"GroupB","GroupC"} 
Item 2 > Key="Jolan" , Value= {"GroupC"} 

Dictionary<string,IList<string>> missingGroup; 
item 1 > Key="GroupB",{"Tim"} 

과 같이해야한다 allUsers

결과에 아니지만 또한

는 "팀이"GroupB가 목록에 있는지 알
+0

첫 번째 예로 groupA에 **없는 ** 사용자 목록을 찾으려고하십니까? IE. A, B 및 C는 groupA에서 ** 아니지만 ** 다른 모든 사용자는 ** groupA에서 **입니까? – Kevin

+0

좋아, 내가 게시물을 편집하고 더 명확하게하려고합니다. – Maro

+0

나는 LDAP와 같은 일관성없는 결과를 줄 것을 기대하지 않았기 때문에 그렇게 기대하지 않았다. 수정하기 쉽다 ... 나는 나의 대답을 업데이트 할 것이다. – Kevin

답변

1

내가 묻는 질문인지 아닌지 확실하지 않습니다 ... 내 의견에 대한 답변을 토대로 내일 대답을 바꿀 것입니다. :)

그 그룹에 속하지 않은 사용자 목록이있는 그룹 사전과 그룹 목록이없는 사용자 사전이 있다고 가정하면 여기에 해당 코드가 있습니다.

var groupsWithUsersNotInThem = new Dictionary<Group, List<User>>(); 
    var usersWithGroupsTheyArentIn = new Dictionary<User, List<Group>>(); 
    allUsers.ForEach(u => 
     { 
      var groupsThisUserIsntIn = groups.Where(g => !g.Members.Contains(u.UserName)).ToList(); 
      if (groupsThisUserIsntIn.Count() > 0) 
       usersWithGroupsTheyArentIn.Add(u, groupsThisUserIsntIn); 
     }); 
    allGroups.ForEach(g => 
    { 
     var usersNotInThisGroup = users.Where(u => !u.MemberOf.Contains(g.Name)).ToList(); 
     if (usersNotInThisGroup.Count() > 0) 
      groupsWithUsersNotInThem.Add(g, usersNotInThisGroup); 
    }); 

편집 : 다른 목록이 일치하지 않는 경우 경우에 위의 코드를 떠나이 여기

실제 델타 문제를 해결 새로운 코드 유용합니다 ... 만 사용자/그룹을 찾습니다 .

var missingGroups = new Dictionary<String, List<String>>(); 
    var missingUsers = new Dictionary<String, List<String>>(); 
    allUsers.ForEach(u => 
    { 
     // get the list where the group exists but this user isn't in it 
     var groupsThisUserIsntIn = allGroups 
      .Where(g => u.MemberOf.Contains(g.Name) && !g.Members.Contains(u.UserName)) 
      .Select(g => g.Name).ToList(); 
     // add in the groups this user says he belongs to but that aren't in allGroups 
     groupsThisUserIsntIn.AddRange(u.MemberOf.Where(userGroupName => allGroups.All(g => g.Name != userGroupName))); 
     if (groupsThisUserIsntIn.Count() > 0) 
      missingUsers.Add(u.UserName, groupsThisUserIsntIn); 
    }); 
    allGroups.ForEach(g => 
    { 
     // get the list where the user exists but this group isn't in it 
     var usersNotInThisGroup = allUsers 
      .Where(u => g.Members.Contains(u.UserName) && !u.MemberOf.Contains(g.Name)) 
      .Select(u => u.UserName).ToList(); 
     // add in the users this group says it has but that aren't in allUsers 
     usersNotInThisGroup.AddRange(g.Members.Where(groupUserName => allUsers.All(u => u.UserName != groupUserName))); 
     if (usersNotInThisGroup.Count() > 0) 
      missingGroups.Add(g.Name, usersNotInThisGroup); 
    }); 
+0

Kevin에게 감사드립니다. 그러나 분명히 설명하지 못했던 것 같습니다. 그러나 귀하의 솔루션 덕분에 다른 문제가되었습니다. 감사합니다. – Maro

관련 문제