DirectoryEntry. Вызвать (“группы”, пустой указатель) не получающий все группы?

Я сказал бы, что 8 ГБ являются недостаточным количеством RAM для таблицы на 400 ГБ. Сервер не имеет никакого шанса сохранить соответствующие данные в памяти если один индекс один взятия 5-8 ГБ. Таким образом, существуют партии и много чтений жесткого диска, которые делают запрос медленным.

, По-моему, увеличение суммы RAM и наличия базы данных по быстрому RAID (возможно, splitted на нескольких НАБЕГАХ?) помог бы большинству.

РЕДАКТИРОВАНИЕ: быть уверенным, каково Ваше реальное узкое место, Монитор производительности запущенного Windows .

5
задан ekad 26 November 2017 в 02:31
поделиться

3 ответа

На 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
0
ответ дан 14 December 2019 в 08:56
поделиться

Я думаю, что 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 может занять много времени.

0
ответ дан 14 December 2019 в 08:56
поделиться

Дэн Дайер и Джей совершенно правы. На самом деле вам нужно биномиальное распределение, а не нормальное. Форма биномиального распределения очень похожа на нормальное распределение, но оно дискретное и ограниченное, тогда как нормальное распределение является непрерывным и неограниченным.

Код Джея генерирует биномиальное распределение с 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, у которого есть метод "

7
ответ дан 14 December 2019 в 08:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: