2012-06-26 3 views
5

도메인 사용자와 해당 AD 보안 그룹을 찾으려면 System.DirectoryServices.AccountManagement 네임 스페이스를 사용하고 있습니다. 이것은 잘 작동합니다.도메인 사용자가 속한 로컬 그룹을 찾으십니까?

또한이 네임 스페이스를 사용하여 원격 서버의 로컬 보안 그룹을 쿼리합니다. 보안 그룹을 찾은 다음 해당 그룹의 사용자를 아무 문제없이 나열 할 수 있습니다.

은 내가 표시됩니다에 문제가 있어요 LOCAL하는 그룹 도메인 사용자가 속한 :

PrincipalContext localmachine = new PrincipalContext(ContextType.Machine, "ServerName"); 
PrincipalContext domain = new PrincipalContext(ContextType.Domain); 

// find the user using the domain context (Works fine) 
UserPrincipal user = UserPrincipal.FindByIdentity(domain, userName); 

// if found - grab its groups 
if (user != null) 
{ 
    // The get groups method is the only method that would accept a new context 
    PrincipalSearchResult<Principal> groups = user.GetGroups(localMachine); 

    // no groups are returned .... removed rest of code 
} 

나는 localMachine PrincipalContext에 통과하는 기능 getgroups 방법을 사용하려고 해요하지만 그룹이 반환되지 않습니다.

사용자는 도메인 광고에만 있습니다. 이 사용자에 대한 항목이 localMachine의 로컬 사용자에 없습니다. 도메인 사용자는 로컬 보안 그룹에 추가됩니다.

아이디어가 있으십니까? 이 도메인 사용자가 속한 모든 로컬 그룹 목록을 가져 와서 목록에 특정 그룹이 있는지 확인하고 싶습니다. 현재 작동중인 유일한 옵션은 시스템의 특정 그룹을 검색하여 해당 도메인 사용자가 해당 그룹에 속하는지 확인하는 것입니다. (나는 순열 모든 종류의 시도 후) 내 대답은 늦게 알고

 PrincipalContext domain = new PrincipalContext(ContextType.Domain); 
     UserPrincipal user = UserPrincipal.FindByIdentity(domain, userName); 
     foreach (GroupPrincipal group in user.GetAuthorizationGroups()) 
     { 
      if (group.Context.ConnectedServer == serverName) 
       Console.Out.WriteLine("{0}\\{1}", group.Context.Name, group.SamAccountName); 
     } 
+0

비슷한 질문을 여기에 HTTP ://stackoverflow.com/questions/4809460/determine-nested-groups-of-windowsidentity-instance – dash

+0

나는 그런 식으로 시도했다. FindByIdentity 메소드는 시스템에서 사용자를 찾을 때 null을 리턴합니다. 나는 실제 로컬 사용자가 생성되지 않았기 때문에 이것이라고 추정한다. 도메인 사용자입니다. 내가 prepended 도메인의 유무에 관계없이 사용자 이름을 전달하려고했습니다. –

+0

일부 오래된 코드를 파헤 치면서, 나는 당신이 묘사 한 것과 정확히 똑같이 해냈다. (DirectorySearcher를 통해) 로컬 컴퓨터 그룹을 열거하고 사용자가 속한 그룹을 찾을 수 있는지 확인하기 위해 열거합니다. 우리에게는 꽤 얕은 계층 구조도있었습니다. 죄송합니다 더 도움이 될 수 없습니다. – dash

답변

2

다음 코드는 도메인 사용자가 부재 인 로컬 그룹을 반환합니다

private static IList<string> GetUserLocalGroups(string userAccountName, string computerName, string domainName) 
{ 
    List<string> groups = new List<string>(); 

    // We have to deal with a local computer 
    DirectoryEntry root = new DirectoryEntry(String.Format("WinNT://{0},Computer", computerName), null, null, AuthenticationTypes.Secure); 


    foreach (DirectoryEntry groupDirectoryEntry in root.Children) 
    { 
    if (groupDirectoryEntry.SchemaClassName != "Group") 
     continue; 

    string groupName = groupDirectoryEntry.Name; 
    Console.WriteLine("Checking: {0}", groupName); 
    if (IsUserMemberOfGroup(groupDirectoryEntry, String.Format("WinNT://{0}/{1}", domainName, userAccountName))) 
    { 
     groups.Add(groupName); 
    } 
    } 

    return groups; 
} 

private static bool IsUserMemberOfGroup(DirectoryEntry group, string userPath) 
{ 
    return (bool)group.Invoke(
     "IsMember", 
     new object[] { userPath } 
    ); 
} 

호출이 같은 것입니다 : - 희망 일부 사용 -

GetUserLocalGroups("samaccountname", "computerName.yourdomain", "yourdomain"); 
+1

로컬 컴퓨터의이 코드는 약 30 개의 그룹에 대해 하나의 연결된 서버 만 반환합니다. GetAuthorizationGroups() 메서드가 UserPrincipal 개체에 지정된 컨텍스트에서 그룹 만 반환 할 것으로 예상했습니다. 이 메서드는 코드가 실행되는 컴퓨터에도 쿼리를 수행합니까? –

1

, 그러나 이것은 나를 위해 일한 :

관련 문제