将 samaccount 名称列表转换为专有名称
Convert list of samaccount names to distinguished names
我有一个需要添加为组成员的帐户名称列表(数千个),因此我需要查找这些帐户的可分辨名称,以便将它们添加为组成员。
有 21000 个用户帐户。查找专有名称需要几个小时,有没有更快的方法?
DirectoryEntry deDomain = new DirectoryEntry();
deDomain.Path = "LDAP://DC=my,DC=ca;
deDomain.Username = "me";
deDomain.Password = "mypassword";
DirectorySearcher dsSearch = new DirectorySearcher(deDomain);
dsSearch.CacheResults = false;
dsSearch.PropertiesToLoad.Add("distinguishedname");
foreach (string sam in lstSamAccountNames)
{
dsSearch.Filter = $"(&(objectCategory=person)(objectClass=user)(SAMAccountName={ReplaceSpecialCharacters(sSamAccountName)}))";
SearchResult srPerson = dsSearch.FindOne();
yield return srPerson.Properties["distinguishedname"][0].ToString();
}
我手边没有可以用来进行性能测试的 AD 域,但是您是否尝试过 AccountManagement 库而不是使用 DirectorySearcher
?
using System.DirectoryServices.AccountManagement;
// ...
var domainName = "MyDomainName";
using (var context = new PrincipalContext(ContextType.Domain, domainName))
{
foreach (var sam in lstSamAccountNames)
{
var userName = ReplaceSpecialCharacters(sam);
using (var user = UserPrincipal.FindByIdentity(context, IdentityType.SamAccountName, $@"{domainName}\{userName}"))
{
yield return user.DistinguishedName;
}
}
}
我有一个需要添加为组成员的帐户名称列表(数千个),因此我需要查找这些帐户的可分辨名称,以便将它们添加为组成员。
有 21000 个用户帐户。查找专有名称需要几个小时,有没有更快的方法?
DirectoryEntry deDomain = new DirectoryEntry();
deDomain.Path = "LDAP://DC=my,DC=ca;
deDomain.Username = "me";
deDomain.Password = "mypassword";
DirectorySearcher dsSearch = new DirectorySearcher(deDomain);
dsSearch.CacheResults = false;
dsSearch.PropertiesToLoad.Add("distinguishedname");
foreach (string sam in lstSamAccountNames)
{
dsSearch.Filter = $"(&(objectCategory=person)(objectClass=user)(SAMAccountName={ReplaceSpecialCharacters(sSamAccountName)}))";
SearchResult srPerson = dsSearch.FindOne();
yield return srPerson.Properties["distinguishedname"][0].ToString();
}
我手边没有可以用来进行性能测试的 AD 域,但是您是否尝试过 AccountManagement 库而不是使用 DirectorySearcher
?
using System.DirectoryServices.AccountManagement;
// ...
var domainName = "MyDomainName";
using (var context = new PrincipalContext(ContextType.Domain, domainName))
{
foreach (var sam in lstSamAccountNames)
{
var userName = ReplaceSpecialCharacters(sam);
using (var user = UserPrincipal.FindByIdentity(context, IdentityType.SamAccountName, $@"{domainName}\{userName}"))
{
yield return user.DistinguishedName;
}
}
}