5

System.DirectoryServices.AccountManagement名前空間を使用して、ドメインユーザーとそれに対応するADセキュリティグループを検索しています。これはうまく機能します。

また、その名前空間を使用して、リモートサーバー上のローカルセキュリティグループにクエリを実行しています。セキュリティグループを見つけて、そのグループのユーザーを問題なく一覧表示できます。

私が問題を抱えているのは、DOMAINユーザーが属する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のローカルユーザーにこのユーザーのエントリはありません。ドメインユーザーはローカルセキュリティグループに追加されます。

何か案は?このドメインユーザーが属するすべてのローカルグループのリストを取得して、特定のグループがそのリストに存在するかどうかを確認できるようにしたいと思います。現在機能している唯一のオプションは、システム上の特定のグループを検索し、ドメインユーザーがそのグループに属しているかどうかを確認することです。

4

2 に答える 2

3

次のコードは、ドメイン ユーザーがメンバーであるローカル グループを返します。

        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);
        }
于 2012-06-27T01:32:59.873 に答える
3

私の答えが遅いことは知っていますが、これは私にとってはうまくいきました(あらゆる種類の順列を試した後):

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");
于 2013-12-12T02:21:58.190 に答える