C# 从Windowsidentity获取SamAccountName。用户组速度较慢

C# 从Windowsidentity获取SamAccountName。用户组速度较慢,c#,asp.net-core,active-directory,ldap,C#,Asp.net Core,Active Directory,Ldap,使用以下方法为一批用户获取组的SAMAccounted列表非常缓慢: public List<ADUserDTO> GetListDomainUsers(string domain) { var myDomainUsers = new List<ADUserDTO>(); using (var ctx = new PrincipalContext(ContextType.Domain, domain)) {

使用以下方法为一批用户获取组的SAMAccounted列表非常缓慢:

    public List<ADUserDTO> GetListDomainUsers(string domain)
    {
        var myDomainUsers = new List<ADUserDTO>();
        using (var ctx = new PrincipalContext(ContextType.Domain, domain))
        {
            var userPrinciple = new UserPrincipal(ctx);
            using (var search = new PrincipalSearcher(userPrinciple))
            {
                foreach (UserPrincipal domainUser in search.FindAll().OrderBy(u => u.DisplayName))
                {
                    if (domainUser.Enabled.Value)
                    {
                        var adUser = new ADUserDTO()
                        {
                            Description = domainUser.Description,
                            DisplayName = domainUser.DisplayName,
                            DistinguishedName = domainUser.DistinguishedName,
                            EmailAddress = domainUser.EmailAddress,
                            Name = domainUser.Name,
                            EmployeeId = domainUser.EmployeeId,
                            GivenName = domainUser.GivenName,
                            MiddleName = domainUser.MiddleName,
                            Surname = domainUser.Surname,
                            SamAccountName = domainUser.SamAccountName,
                            Groups = new List<string>()
                        };
                        // groups:
                        var groups = GetGroups(adUser.SamAccountName);
                        if (groups.Count > 0)
                        {
                            foreach (var group in groups)
                            {
                                adUser.Groups.Add(group);
                            }
                        }
                        myDomainUsers.Add(adUser);
                    }
                }
            }
        }
        return myDomainUsers;
    }

        public List<string> GetGroups(string userName)
    {
        List<string> result = new List<string>();
        WindowsIdentity wi = new WindowsIdentity(userName);
        foreach (IdentityReference group in wi.Groups)
        {
            try
            {
                var directoryEntry = returnObjectBydSid(group.Value.ToString());
                var props = directoryEntry.Properties;                  
                var name = props["sAMAccountName"].Value.ToString();
                result.Add(name);
            }
            catch (Exception ex) { }
        }
        return result;
    }
公共列表GetListDomainUsers(字符串域)
{
var myDomainUsers=新列表();
使用(var ctx=new PrincipalContext(ContextType.Domain,Domain))
{
var UserPrincipal=新的UserPrincipal(ctx);
使用(var搜索=新PrincipalSearcher(userPrinciple))
{
foreach(UserPrincipal domainUser in search.FindAll().OrderBy(u=>u.DisplayName))
{
if(domainUser.Enabled.Value)
{
var adUser=new ADUserDTO()
{
Description=domainUser.Description,
DisplayName=domainUser.DisplayName,
DifferentizedName=domainUser.DifferentizedName,
EmailAddress=domainUser.EmailAddress,
Name=domainUser.Name,
EmployeeId=domainUser.EmployeeId,
GivenName=domainUser.GivenName,
MiddleName=domainUser.MiddleName,
姓氏=域名用户。姓氏,
SamAccountName=domainUser.SamAccountName,
组=新列表()
};
//小组:
var groups=GetGroups(adUser.SamAccountName);
如果(groups.Count>0)
{
foreach(组中的var组)
{
adUser.Groups.Add(组);
}
}
添加(adUser);
}
}
}
}
返回myDomainUsers;
}
公共列表GetGroups(字符串用户名)
{
列表结果=新列表();
WindowsIdentity wi=新的WindowsIdentity(用户名);
foreach(wi.Groups中的IdentityReference组)
{
尝试
{
var directoryEntry=returnObjectBydSid(group.Value.ToString());
var props=directoryEntry.Properties;
var name=props[“sAMAccountName”].Value.ToString();
结果。添加(名称);
}
捕获(例外情况除外){}
}
返回结果;
}
  • 这能做得更快吗
  • 为什么会产生一个例外 在中引发:“System.DirectoryServices.DirectoryServicesCOMException” System.DirectoryServices.dll

  • 需要说明的是,该函数是用C语言编写的。是的,netcore程序是用C语言编写的#