2012-06-07 3 views
1

Active Directory (AD DS) имеет концепцию «контроллеры домена только для чтения» (RODC). Вероятно, для обратной совместимости по умолчанию игнорируются контроллеры домена только для чтения: вы должны явно указать, что вы разрешаете подключаться к контроллеру домена только для чтения.Как может PrincipalContext/UserPrincipal.FindByIdentity() использовать контроллер домена только для чтения?

В нашем коде C# мы видим это в двух местах. Один из них заключается в создании нового System.DirectoryServices.DirectoryEntry: проблема легко решить, установив флаг System.DirectoryServices.AuthenticationTypes.ReadonlyServer, который позволяет использовать RODC.

Мой вопрос в том, как достичь того же для кода, как следующий, который использует классы из System.DirectoryServices.AccountManagement имен:

using (PrincipalContext ctx = new PrincipalContext(ContextType.Domain)) 
using (UserPrincipal userPrincipal = UserPrincipal.FindByIdentity(
                 ctx, 
                 IdentityType.SamAccountName, 
                 ...)) 
{ 
    // ... 
} 

, так как мы наблюдали, что этот код игнорирует все контроллеры домена только для чтения.

(Обратите внимание, что выше точно такой же вопрос, как отвечал на MSDN "Visual C# General" forum в потоке под названием "Issue connecting to read-only domain controller (RODC) from C# application through System.DirectoryServices.AccountManagement".)

ответ

1

Скорее всего, что произошло, это было более чем выглядел так, эта функция не существует. Если он не был просмотрен, он был преднамеренным, поскольку RODC не позволит вам выполнять многие из методов, существующих на UserPrincipal (например, ChangePassword, Delete и т. Д.). Я бы предположил, что для решения этой проблемы Microsoft должна была бы создать новый ReadOnlyUserPrincipal. Что еще более важно, почему имеет смысл создавать что-либо в пространстве имен System.DirectoryServices.AccountManagement как прочитанное только в том случае, если пространство имен выглядит больше, чем только службы (из-за отсутствия лучшего термина), если только версия, доступная только для чтения существуют (в данном случае). Следовательно, использование нечитаемого номера sevice и указание его на источник только для чтения не работает.

+0

OK, спасибо за это «невозможно». Все, что мы пытаемся сделать в этом конкретном коде, - это получить UPN с именем sAMAccountName пользователя, который не требует доступа на запись. Я предполагаю, что это означает, что мы должны делать это через «DirectoryEntry» вместо этого? Так или иначе, я попытаюсь. –