PrincipalSearcher.FindAll()和GroupPrincipal.FindByIdentity()之间的区别

时间:2013-05-02 00:01:07

标签: c# active-directory directoryservices

我正在尝试从远程主机获取本地组的所有成员。 我找到了一种使用System.DirectoryServices.AccountManagement命名空间的方法,但我最终会出现不一致...

  • GroupPrincipal.FindByIdentity返回仅包含的组对象 当地小组成员
  • PrincipalSearcher.FindAll返回一个组 包含组中所有成员的对象(域+本地)

使用 PrincipalSearcher.FindAll (参见下文),我获得了一个群组的所有成员(域名+本地)。

输出:

  • 会员:荷马 - S-1-5-21-4017887476-2895526723-3552248342-500
  • 成员:smithers - S-1-5-21-4017887476-2895526723-3552248342-1009
  • 成员:Domain Admins - S-1-5-21-452759756-260371901-2912106767-512
  • 会员:SomeAdminGroup - S-1-5-21-452759756-260371901-2912106767-1154
  • 成员:史密瑟斯 - S-1-5-21-452759756-260371901-2912106767-1124

代码:

 using (var machineContext = new PrincipalContext(ContextType.Machine, hostname))
 using (var gpSeach = new PrincipalSearcher(new GroupPrincipal(machineContext)))
 {
      foreach (GroupPrincipal gp in gpSeach.FindAll().Where(gp => gp.SamAccountName == "Administrators"))
      {
           foreach (var member in gp.Members)
           {
                Trace.WriteLine("Member: " + member.Name+ " - " + member.Sid);
           }
      }
  }

使用 GroupPrincipal.FindByIdentity ,我只获得一个群组的本地成员:

输出:

  • 会员:荷马 - S-1-5-21-4017887476-2895526723-3552248342-500
  • 成员:smithers - S-1-5-21-4017887476-2895526723-3552248342-1009

代码:

 using (var machineContext = new PrincipalContext(ContextType.Machine, hostname, null, ContextOptions.Negotiate, "myUsername", "myPassword"))
 using (GroupPrincipal localAdminGp = GroupPrincipal.FindByIdentity(machineContext, IdentityType.Name, "Administrators"))
 {
     foreach (var member in localAdminGp.Members)
     {
          Trace.WriteLine("Member: " + member.Name + " - " + member.Sid);
     }
 }

幕后发生了什么,以获得这两种不同的结果!?!

0 个答案:

没有答案