2010-12-18 44 views
3

我有一個代碼來獲取用戶所屬的組。獲取本地組而不是域用戶的主組

try 
     { 
      DirectoryEntry adRoot = new DirectoryEntry(string.Format("WinNT://{0}", Environment.UserDomainName)); 

      DirectoryEntry user = adRoot.Children.Find(completeUserName, "User");     
      object obGroups = user.Invoke("Groups"); 
      foreach (object ob in (IEnumerable)obGroups) 
      { 
       // Create object for each group. 
       DirectoryEntry obGpEntry = new DirectoryEntry(ob); 
       listOfMyWindowsGroups.Add(obGpEntry.Name); 
      } 
     return true; 
     } 
     catch (Exception ex) 
     { 
      new GUIUtility().LogMessageToFile("Error in getting User MachineGroups = " + ex); 
      return false; 
     } 

上面的代碼工作正常時,我必須找到一個本地用戶,但

它返回一個值「域用戶」,這是一種奇怪的域用戶的組,因爲它是一個組成部分的2個地方團體。

請幫助解決這個謎題。感謝

研究

我做了一些調查,並得到了我被返回的域用戶

稱爲「域用戶」組

的主組,但我實際上想要的是本地機器的域組用戶是一部分......我不明白..任何建議

另一個代碼中使用LDAP

 string domain = Environment.UserDomainName; 
     DirectoryEntry DE = new DirectoryEntry("LDAP://" + domain, null, null, AuthenticationTypes.Secure); 
     DirectorySearcher search = new DirectorySearcher(); 

     search.SearchRoot = DE;   
     search.Filter = "(SAMAccountName=" + completeUserName + ")"; //Searches active directory for the login name 

     search.PropertiesToLoad.Add("displayName"); // Once found, get a list of Groups 

     try 
     { 
      SearchResult result = search.FindOne(); // Grab the records and assign them to result 
      if (result != null) 
      { 
       DirectoryEntry theUser = result.GetDirectoryEntry(); 
       theUser.RefreshCache(new string[] { "tokenGroups" }); 
       foreach (byte[] resultBytes in theUser.Properties["tokenGroups"]) 
       { 
        System.Security.Principal.SecurityIdentifier mySID = new System.Security.Principal.SecurityIdentifier(resultBytes, 0); 

        DirectorySearcher sidSearcher = new DirectorySearcher(); 

        sidSearcher.SearchRoot = DE; 
        sidSearcher.Filter = "(objectSid=" + mySID.Value + ")"; 
        sidSearcher.PropertiesToLoad.Add("distinguishedName"); 

        SearchResult sidResult = sidSearcher.FindOne(); 

        if (sidResult != null) 
        { 
         listOfMyWindowsGroups.Add((string)sidResult.Properties["distinguishedName"][0]); 
        } 
       } 
      } 
      else 
      { 
       new GUIUtility().LogMessageToFile("no user found"); 

      } 
      return true; 
     } 

     catch (Exception ex) 
     { 

      new GUIUtility().LogMessageToFile("Error obtaining group names: " + ex.Message + " Please contact your administrator."); // If an error occurs report it to the user. 
      return false; 
     } 

這個作品太多,但我得到同樣的結果「域用戶」。請大家告訴我如何獲得本地機器組......?

+0

@ user175084我的回答對您有幫助嗎?任何意見? – 2011-01-07 02:51:12

回答

2

如果您使用的是.NET 3.5,你可以使用System.DirectoryService.AccountManagement做所有的用戶和組管理。特別是,UserPrincipal.GetAuthorizationGroups正是你正在尋找的。它爲特定用戶檢索本地​​組和機器組。如果該組是本地組,則GroupPrincipal.Context.Name將顯示該組來自的計算機名稱。如果該組是域組,則GroupPrincipal.Context.Domain顯示該組來自的域名。

PrincipalContext context = new PrincipalContext(ContextType.Domain, "yourdomain.com"); 
UserPrincipal userPrincipal = UserPrincipal.FindByIdentity(context, IdentityType.SamAccountName, "youruser"); 

foreach (GroupPrincipal group in userPrincipal.GetAuthorizationGroups()) 
{ 
    Console.Out.WriteLine("{0}\\{1}", group.Context.Name, group.SamAccountName); 
} 
0

我想說的問題是,你的搜索是從域中開始的。您想要將搜索的位置更改爲本地計算機。

這樣的事情會做到這一點;

DirectoryEntry AD = new DirectoryEntry("WinNT://" + Environment.MachineName + ",computer"); 
+0

如果我改變它,它只會在計算機上查找用戶而不是域用戶..已triede這..謝謝雖然 – user175084 2010-12-20 15:39:09

相關問題