2012-06-26 40 views
5

我正在使用System.DirectoryServices.AccountManagement命名空間來查找域用戶及其相應的AD安全組。這很好。查找域用戶所屬的本地組?

我還使用該名稱空間來查詢遠程服務器上的本地安全組。我能夠找到一個安全組,然後列出該組的用戶沒有問題。

什麼我遇到的問題,顯示其本地組的域用戶屬於:

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 
} 

我試圖使用GetGroups方法傳入LOCALMACHINE PrincipalContext但沒有返回組。

用戶僅存在於域AD中。 localMachine上的本地用戶沒有該用戶的條目。域用戶被添加到本地安全組。

任何想法?我希望能夠拉出該域用戶所屬的所有本地組列表,然後查看該列表中是否存在某個組。現在唯一可行的選擇是讓我搜索系統中的某些組,並查看域用戶是否屬於該組。

+0

類似的問題在這裏 - 希望的一些使用 - HTTP:/ /stackoverflow.com/questions/4809460/determine-nested-groups-of-windowsidentity-instance – dash

+0

我試過這樣做。在機器上查找用戶時,FindByIdentity方法返回null。我認爲這是因爲沒有創建實際的本地用戶。它是一個域用戶。我已經嘗試傳遞用戶名和前綴域。 –

+0

挖掘一些舊的代碼,我發現我完全按照你描述的方式來完成它;枚舉本地機器組(通過DirectorySearcher),然後枚舉這些以查看我是否可以找到該用戶所屬的組。我們也有一個相當淺的層次。抱歉不能有更多的幫助。 – dash

回答

2

下面的代碼將返回本地組的域用戶成員:

 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

我的本地機器上的這段代碼只能爲大約30個組返回一臺連接的服務器。我期望GetAuthorizationGroups()方法只返回來自UserPrincipal對象中指定的Context的組。該方法是否也查詢代碼運行的機器? –

1

我知道我的答案是晚了,但這個工作對我來說(我試過各種排列後):

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"); 
相關問題