Я сказал бы, что 8 ГБ являются недостаточным количеством RAM для таблицы на 400 ГБ. Сервер не имеет никакого шанса сохранить соответствующие данные в памяти если один индекс один взятия 5-8 ГБ. Таким образом, существуют партии и много чтений жесткого диска, которые делают запрос медленным.
, По-моему, увеличение суммы RAM и наличия базы данных по быстрому RAID (возможно, splitted на нескольких НАБЕГАХ?) помог бы большинству.
РЕДАКТИРОВАНИЕ: быть уверенным, каково Ваше реальное узкое место, Монитор производительности запущенного Windows .
На Freund,
я пытаюсь использовать ваш код и не ухожу далеко. Я обновил путь к записи в каталоге на «LDAP: // DC = myDomain, DC = co, DC = uk», но не получаю никаких результатов (obj.Properties [«tokenGroups»]. Count = 0)
Я не понимаю, как указан пользователь, для которого указывается группа.
Не могли бы вы указать мне правильное направление?
Спасибо
РЕДАКТИРОВАТЬ:
В конце концов, я все разобрал. Запись в каталоге, из которой нужно получить группы токенов, должна быть записью пользователя ... если это имеет смысл ...
Я добавил код на случай, если у кого-то еще есть такой же запрос:
Dim directoryEntry As DirectoryEntry = _
New DirectoryEntry("LDAP://CN=users,DC=domanName,DC=com")
Dim directorySearcher As DirectorySearcher = _
New DirectorySearcher(directoryEntry, "(sAMAccountName=" & UserName & ")")
Dim searchResult As SearchResult = directorySearcher.FindOne()
If Not searchResult Is Nothing Then
Dim userDirectoryEntry As DirectoryEntry = searchResult.GetDirectoryEntry
userDirectoryEntry.RefreshCache(New String() {"tokenGroups"})
... etc ...
End If
Я думаю, что marc_s прав. Если вам нужны все группы, вы можете использовать следующий фрагмент:
using (DirectoryEntry obj = new DirectoryEntry("LDAP://" + dn))
{
obj.RefreshCache(new string[] { "tokenGroups" });
string[] sids = new string[obj.Properties["tokenGroups"].Count];
int i = 0;
foreach (byte[] bytes in obj.Properties["tokenGroups"])
{
sids[i] = _ConvertSidToString(bytes);
++i;
}
obj.Close();
return sids;
}
Обратите внимание, что вычисление вложенных групп - дорогостоящая операция, поэтому RefreshCache может занять много времени.
Дэн Дайер и Джей совершенно правы. На самом деле вам нужно биномиальное распределение, а не нормальное. Форма биномиального распределения очень похожа на нормальное распределение, но оно дискретное и ограниченное, тогда как нормальное распределение является непрерывным и неограниченным.
Код Джея генерирует биномиальное распределение с 6 попытками и 50% вероятностью успеха в каждом. испытание. Если вы хотите «исказить» свое распределение, просто измените строку, в которой решается, прибавлять ли 1 к n, чтобы вероятность была отличной от 50%.
Это два единственных ограничения, о которых я знаю для обычного Active Directory (без Exchange).
Получение группы по умолчанию - это немного сложно, но у меня есть образец кода для этого.
private string GetPrimaryGroup(DirectoryEntry aEntry, DirectoryEntry aDomainEntry)
{
int primaryGroupID = (int)aEntry.Properties["primaryGroupID"].Value;
byte[] objectSid = (byte[])aEntry.Properties["objectSid"].Value;
StringBuilder escapedGroupSid = new StringBuilder();
// Copy over everything but the last four bytes(sub-authority)
// Doing so gives us the RID of the domain
for(uint i = 0; i < objectSid.Length - 4; i++)
{
escapedGroupSid.AppendFormat("\\{0:x2}", objectSid[i]);
}
//Add the primaryGroupID to the escape string to build the SID of the primaryGroup
for(uint i = 0; i < 4; i++)
{
escapedGroupSid.AppendFormat("\\{0:x2}", (primaryGroupID & 0xFF));
primaryGroupID >>= 8;
}
//Search the directory for a group with this SID
DirectorySearcher searcher = new DirectorySearcher();
if(aDomainEntry != null)
{
searcher.SearchRoot = aDomainEntry;
}
searcher.Filter = "(&(objectCategory=Group)(objectSID=" + escapedGroupSid.ToString() + "))";
searcher.PropertiesToLoad.Add("distinguishedName");
return searcher.FindOne().Properties["distinguishedName"][0].ToString();
}
Получение вложенных групп также требует нескольких шагов, и я должен буду искать решение этой проблемы, если это проблема.
Марк
PS: в качестве примечания - почему ты, черт возьми, выполняет вызов DirectoryEntry.Invoke ("groups", null) "? Почему бы вам просто не перечислить свойство DirectoryEntry.Properties ["memberOf"], которое является многозначным (содержит несколько значений) и содержит DN (отличительное имя) группы?
foreach(string groupDN in myUser.Properties["memberOf"])
{
string groupName = groupDN;
}
ИЛИ если вы используете .NET. 3.5, вы можете использовать новые классы участников безопасности в S.DS.AccountManagement. Один из них - UserPrincipal, у которого есть метод "