2012-06-26 25 views
5

Tôi đang sử dụng không gian tên System.DirectoryServices.AccountManagement để tìm người dùng miền và nhóm bảo mật AD tương ứng của họ. Điều này hoạt động tốt.Tìm các nhóm địa phương mà người dùng miền thuộc về?

Tôi cũng đang sử dụng không gian tên đó để truy vấn các nhóm bảo mật cục bộ trên máy chủ từ xa. Tôi có thể tìm thấy một nhóm bảo mật và sau đó liệt kê những người dùng của nhóm đó không có vấn đề gì.

Những gì tôi đang gặp vấn đề với được hiển thị mà nhóm ĐỊA PHƯƠNG người dùng DOMAIN thuộc về:

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 
} 

Tôi đang cố gắng sử dụng các phương pháp GetGroups đi qua trong LocalMachine PrincipalContext nhưng không có nhóm được trả về.

Người dùng chỉ tồn tại trong AD miền. Không có mục nhập nào cho người dùng này trong người dùng cục bộ trên localMachine. Người dùng miền được thêm vào nhóm bảo mật cục bộ.

Bất kỳ ý tưởng nào? Tôi muốn để có thể kéo một danh sách của tất cả các nhóm địa phương người dùng miền này thuộc về và sau đó xem nếu một nhóm nhất định tồn tại trong danh sách đó. Tùy chọn duy nhất hiện đang hoạt động là để tôi tìm kiếm một số nhóm nhất định trên hệ thống và xem liệu người dùng miền thuộc về nhóm đó hay không.

+0

tương tự câu hỏi ở đây - hy vọng của một số sử dụng - http://stackoverflow.com/questions/4809460/determine-nested-groups-of-windowsidentity-instance – dash

+0

Tôi đã thử làm theo cách đó. Phương thức FindByIdentity trả về null khi tìm kiếm người dùng trên máy. Tôi cho rằng điều này là do không có người dùng cục bộ thực sự được tạo ra. Nó là một người dùng miền. Tôi đã cố gắng chuyển vào tên người dùng có và không có miền được thêm vào. –

+0

Đào qua một số mã cũ, tôi thấy rằng tôi đã thực hiện nó chính xác theo cách bạn mô tả; liệt kê các nhóm máy nội bộ (thông qua DirectorySearcher), và sau đó liệt kê các nhóm máy đó để xem liệu tôi có thể tìm thấy một nhóm người dùng là thành viên hay không. Chúng tôi cũng có một hệ thống phân cấp khá nông. Xin lỗi không thể giúp đỡ nhiều hơn. – dash

Trả lời

2

Các mã sau sẽ trở lại với nhóm địa phương mà người dùng tên miền là thành viên của:

 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); 
     } 
+1

Mã này từ máy cục bộ của tôi chỉ trả về một máy chủ được kết nối cho khoảng 30 nhóm. Tôi mong đợi phương thức GetAuthorizationGroups() chỉ trả về các nhóm từ Context được chỉ định trong đối tượng UserPrincipal. Liệu phương pháp đó cũng truy vấn máy mã đang chạy? –

1

Tôi biết câu trả lời của tôi là muộn, nhưng điều này đã làm việc cho tôi (sau khi tôi đã thử tất cả các loại hoán vị):

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

cuộc gọi là một cái gì đó như thế này:

GetUserLocalGroups("samaccountname", "computerName.yourdomain", "yourdomain"); 
Các vấn đề liên quan