2010-12-18 10 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私の回答は役に立ちましたか?任意のコメント? –

答えて

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

もし私がそれを変更すると、それはドメインユーザーではないコンピュータ上のユーザーだけを探すようになります。 – user175084

関連する問題