Я новичок в stackoverflow как член, хотя я многому следую за ним :) Мой код, который подключается к активной директории для получения членов функциональной группы, дает мне всего 1490 нечетных членов из 1680 нечетных членов, фактически входящих в список. Я много искал в Stackoverflow и в Интернете, но я не нашел ответа на вопрос, почему код приведет к неполному списку. Может, кто-нибудь, пожалуйста, дайте мне какие-нибудь указания на это. Спасибо :)Извлечение данных из активного каталога дает неполный список
Вот код, который подключается к Active Directory для извлечения данных:
public static DataTable GetAdUsers(string configSection)
{
DataRow dr;
Hashtable ADGroups = (Hashtable)ConfigurationManager.GetSection(configSection);
string adGroup;
string adGroupDesc;
string sApplication;
string sLast_Login;
string sAccount_owner;
string sPath;
DataTable dt = new DataTable();
sApplication = "Application";
dt.Columns.Add(sApplication);
dt.Columns.Add("Profile", Type.GetType("System.String"));
dt.Columns.Add("Account Name", Type.GetType("System.String"));
sLast_Login = "Last Login";
dt.Columns.Add(sLast_Login);
sAccount_owner = "Account Owner";
dt.Columns.Add(sAccount_owner);
sPath = "Path";
dt.Columns.Add(sPath);
string domainName = "myDomain";
PrincipalContext pcRoot = new PrincipalContext(ContextType.Domain, domainName);
IDictionaryEnumerator adGroupEnumerator = ADGroups.GetEnumerator();
while (adGroupEnumerator.MoveNext())
{
adGroup = adGroupEnumerator.Key.ToString();
adGroupDesc = adGroupEnumerator.Value.ToString();
GroupPrincipal grp = GroupPrincipal.FindByIdentity(pcRoot, IdentityType.SamAccountName, adGroup);
System.DirectoryServices.DirectoryEntry de = (System.DirectoryServices.DirectoryEntry)grp.GetUnderlyingObject();
foreach (string sDN in de.Properties["member"])
{
System.DirectoryServices.DirectoryEntry deMember = new System.DirectoryServices.DirectoryEntry("LDAP://" + sDN.ToString());
try
{
dr = dt.NewRow();
string output1;
string subStringE1 = "DC=";
int length1 = de.Path.ToString().Length;
int length0 = de.Path.ToString().IndexOf(subStringE1);
string str1 = de.Path.ToString().Substring(length0, length1 - length0);
string subStringE2 = ",DC";
int length2 = str1.ToString().IndexOf(subStringE2);
output1 = str1.ToString().Substring(3, length2 - 3);
dr["Application"] = "Application";
dr["Profile"] = adGroupDesc;
string AccountName = deMember.Properties["samAccountName"].Value.ToString();
dr["Account Name"] = deMember.Properties["samAccountName"].Value.ToString();
dr["Last Login"] = "";
dr["Account Owner"] = deMember.Properties["givenName"].Value.ToString() + @"-" + deMember.Properties["sn"].Value.ToString();
string Path = output1 + @"\" + adGroup + @"\" + deMember.Properties["samAccountName"].Value.ToString();
Console.WriteLine(Path);
dr["Path"] = output1 + @"\" + adGroup + @"\" + deMember.Properties["samAccountName"].Value.ToString();
dt.Rows.Add(dr);
}
catch (Exception ex)
{
Console.WriteLine("Error occured for user name" + sDN + "\n" + ex.Message);
}
}
}
return dt;
}
}
Так вы используете .NET 3.5 'PrincipalContext' и все - тогда ** ** почему вы переключение обратно в старом стиле .NET 2.0 'DirectoryEntry', если у вас есть имя участника? Не имеет никакого смысла и делает вещи намного более громоздкими! У вас уже есть 'GroupPrincipal grp' - почему вы не используете' .GetMembers() 'call для получения членов группы? Было бы намного проще! ** –
Привет, Марк, у вас есть какие-то указатели/ссылки на них. Большинство результатов seacrh, которые я получил, были на .NET 2.0. Также ссылка Afifi в Msdn также находится на .NET 2.0. – Ashutosh
См. Статью журнала MSDN: [Управление принципами безопасности в платформе .NET Framework 3.5] (http://msdn.microsoft.com/en-us/magazine/cc135979.aspx) –