2012-06-26 70 views
5

私はSystem.DirectoryServices.AccountManagement名前空間を使用して、ドメインユーザーとその対応するADセキュリティグループを検索しています。これはうまくいく。ドメインユーザーが所属するローカルグループを検索しますか?

また、この名前空間を使用してリモートサーバーのローカルセキュリティグループを照会しています。セキュリティグループを見つけて、そのグループのユーザーを問題なくリストすることができます。

は、私が表示されるとの問題を抱えていることは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メソッドを使用しようとしていますが、何のグループが返されません。

ユーザーはドメイン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オブジェクトで指定されたコンテキストからグループを返すだけであると考えました。このメソッドは、コードが実行されているマシンにもクエリを実行しますか? –

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"); 
関連する問題