gpt4 book ai didi

c# - 网络利用率 - AccountManagement 与 DirectoryServices

转载 作者:行者123 更新时间:2023-11-30 12:35:30 25 4
gpt4 key购买 nike

我花了一天多的时间才发现 Principal 对象使用的带宽比使用 DirectoryServices 多得多。场景是这样的。我有一个包含约 3000 个计算机对象的组。为了检查计算机是否在此组中,我检索了 GroupPrincipal 并搜索了 ComputerPrincipal。

        Boolean _retVal = false;
PrincipalContext _principalContext = null;
using (_principalContext = new PrincipalContext(ContextType.Domain, domainController, srv_user, srv_password)) {
ComputerPrincipal _computer = ComputerPrincipal.FindByIdentity(_principalContext, accountName);

GroupPrincipal _grp = GroupPrincipal.FindByIdentity(_principalContext, groupName);
if (_computer != null && _grp != null) {
// get the members
PrincipalSearchResult<Principal> _allGrps = _grp.GetMembers(false);
if (_allGrps.Contains(_computer)) {
_retVal = true;
}
else {
_retVal = false;
}
}
}
return _retVal;

实际上界面非常好,但是每个请求会产生大约 12MB 的流量。如果您的域 Controller 在 LAN 中,则没有问题。如果您使用 WAN 访问域 Controller ,它会终止您的连接/应用程序。

在我注意到这一点后,我使用 DirectoryServices 重新实现了相同的功能

Boolean _retVal = false;
DirectoryContext _ctx = null;
try {
_ctx = new DirectoryContext(DirectoryContextType.DirectoryServer, domainController, srv_user, srv_password);
} catch (Exception ex) {
// do something useful
}
if (_ctx != null) {
try {
using (DomainController _dc = DomainController.GetDomainController(_ctx)) {
using (DirectorySearcher _search = _dc.GetDirectorySearcher()) {
String _groupToSearchFor = String.Format("CN={0},", groupName);
_search.PropertiesToLoad.Clear();
_search.PropertiesToLoad.Add("memberOf");
_search.Filter = String.Format("(&(objectCategory=computer)(name={0}))", accountName); ;
SearchResult _one = null;
_one = _search.FindOne();
if (_one != null) {
int _count = _one.Properties["memberOf"].Count;
for (int i = 0; i < _count; i++) {
string _m = (_one.Properties["memberOf"][i] as string);
if (_m.Contains(groupName)) { _retVal = true; }
}
}
}
}
} catch (Exception ex) {
// do something useful
}
}
return _retVal;

此实现将使用大约 12K 的网络流量。这可能不是很好,但可以节省大量带宽。

我现在的问题是,是否有人知道 AccountManagement 对象在做什么,以至于它使用了如此多的带宽?

谢谢!

最佳答案

我猜包括以下几行将大大节省带宽:

_search.PropertiesToLoad.Clear();
_search.PropertiesToLoad.Add("memberOf");
_search.Filter = String.Format("(&(objectCategory=computer)(name={0}))", accountName);

前两个告诉 DirectorySearcher 只加载一个属性,而不是谁知道有多少,任意大小。

第二个是将过滤器传递到 DirectorySearcher,我猜这可能是在服务器端处理的,进一步限制了结果集的大小。

关于c# - 网络利用率 - AccountManagement 与 DirectoryServices,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5376620/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com