我正在尝试从远程主机获取本地组的所有成员。我找到了一种使用 System.DirectoryServices.AccountManagement 命名空间的方法,但最终出现不一致...
- GroupPrincipal.FindByIdentity 返回一个仅包含组的本地成员的组对象
- PrincipalSearcher.FindAll 返回一个包含组所有成员的组对象(域 + 本地)
使用PrincipalSearcher.FindAll(见下文),我得到了一个组的所有成员(域 + 本地)。
输出:
- 会员:荷马-S-1-5-21-4017887476-2895526723-3552248342-500
- 成员:史密斯 - S-1-5-21-4017887476-2895526723-3552248342-1009
- 成员:域管理员 - 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
- 成员:史密斯 - 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);
}
}
为了得到这两种不同的结果,幕后发生了什么!?!