我对这段代码有点困难,特别是使用PrincipalSearcher。我正在尝试获取与特定OU关联的所有组的列表。
我正在尝试在所有组范围下返回“安全”组,不包括通讯组。
我遇到的问题是,除了我打算返回之外,它还会返回这些内置组。
HelpServicesGroup TelnetClients 管理员 用户 宾客 打印操作员 备份操作员 复制 远程桌面用户 网络配置运营商 性能监视器用户 性能日志用户 分布式COM用户 域计算机 域控制器 架构管理员 企业管理员 证书出版商 域管理员 域用户 域名嘉宾 组策略创建者所有者 RAS和IAS服务器 服务器运营商 账户经营者 Pre-Windows 2000兼容访问 进入森林信托建设者 Windows授权访问组 终端服务器许可服务器 DNSADMINS DnsUpdateProxy IIS_WPG
我不确定范围是否可能不正确,或者我错过了某种过滤。
相关代码段:
public static ArrayList GetAllGroups()
{
var myItems = new ArrayList();
var ctx = new PrincipalContext(ContextType.Domain,"MyOU");
// define a "query-by-example" principal - here, we search for a GroupPrincipal
var qbeGroup = new GroupPrincipal(ctx);
// create your principal searcher passing in the QBE principal
var srch = new PrincipalSearcher(qbeGroup);
// find all matches
foreach (Principal found in srch.FindAll())
{
var foundGroup = found as GroupPrincipal;
if (foundGroup != null)
{
myItems.Add(foundGroup.Name);
}
}
return myItems;
}
如何排除内置组?
对此的任何帮助将不胜感激。
谢谢!
答案 0 :(得分:9)
两件事:
没有与
如果是这样的话:你没有正确地调用PrincipalContext
的构造函数。如果您选中MSDN documentation on PrincipalContext
constructors,则会看到您使用的是ContextType
和name
代表域名您要绑定到的上下文:
var ctx = new PrincipalContext(ContextType.Domain,"MyOU");
这绑定到MyOU
域 - 它绑定在该域树的根目录下。
您可能正在寻找的是具有三个参数的构造函数 - ContextType
和两个字符串 - 第一个是上面的域名,第二个是开始搜索的位置。因此,将PrincipalContext
构造更改为:
var ctx = new PrincipalContext(ContextType.Domain, "YOURDOMAIN", "OU=MyOU");
然后再次搜索 - 现在您应该只获得OU=MyOU
容器中包含的组。
答案 1 :(得分:4)
你可以尝试:
var myItems = new ArrayList();
var ctx = new PrincipalContext(ContextType.Domain, Environment.UserDomainName, "OU=Groups,DC=Domain,DC=Com");
// define a "query-by-example" principal - here, we search for a GroupPrincipal
var qbeGroup = new GroupPrincipal(ctx);
// create your principal searcher passing in the QBE principal
var srch = new PrincipalSearcher(qbeGroup);
// find all matches
foreach (Principal found in srch.FindAll())
{
var foundGroup = found as GroupPrincipal;
if (foundGroup != null && foundGroup.IsSecurityGroup == true)
{
myItems.Add(foundGroup.Name);
}
}
PrincipalContext需要contextType,Domain和Container的DN(如果您只想搜索容器)。
foundGroup!= null&& foundGroup.IsSecurityGroup == true将返回所有安全组。这是你想要的。
如果您愿意,也可以使用GroupScope来改进:
foundGroup!= null&& foundGroup.GroupScope == GroupScope.Global将范围缩小到全局组。
希望有所帮助。