Данные в select'e не отображаются

197
04 сентября 2021, 16:20

Подскажите, делаю запрос к AD и через консоль вижу все данные, но если пытаюсь добавить в select, то пишет ошибка, где я накосячил с кодом? Может есть проще и лучше код. Прошу не судить строго, только учусь, заранее благодарен.

List<string> adlist = new List<string>();
 using (var context = new PrincipalContext(ContextType.Domain, "domain.ru"))
 {
   using (var searcher = new PrincipalSearcher(new UserPrincipal(context)))
         {
           foreach (var result in searcher.FindAll())
                   {
                     DirectoryEntry de = result.GetUnderlyingObject() as DirectoryEntry;
                     var lastname = (de.Properties["sn"].Value != null) ? de.Properties["sn"].Value.ToString() : "";
                     var display = (de.Properties["displayName"].Value != null) ? de.Properties["displayName"].Value.ToString() : "";
                            if (lastname != "")
                                {
                                    adlist.Add(display);
                                    adlist.Distinct().ToArray();
                                }
                        }
                    ADUserList.DataSource = adlist;
                    ADUserList.DataBind();
                    }
                }
<asp:DropDownList CssClass="form-control selectpicker" ID="ADUserList" runat="server"></asp:DropDownList>

[DirectoryServicesCOMException (0x80072020): An operations error occurred. ] System.DirectoryServices.DirectoryEntry.Bind(Boolean throwIfFail) +563130 System.DirectoryServices.DirectoryEntry.Bind() +45 System.DirectoryServices.DirectoryEntry.get_AdsObject() +40 System.DirectoryServices.PropertyValueCollection.PopulateList() +27
System.DirectoryServices.PropertyValueCollection..ctor(DirectoryEntry entry, String propertyName) +119
System.DirectoryServices.PropertyCollection.get_Item(String propertyName) +162
System.DirectoryServices.AccountManagement.PrincipalContext.DoLDAPDirectoryInitNoContainer() +1400 System.DirectoryServices.AccountManagement.PrincipalContext.DoDomainInit() +47 System.DirectoryServices.AccountManagement.PrincipalContext.Initialize() +123 System.DirectoryServices.AccountManagement.PrincipalContext.get_QueryCtx() +40 System.DirectoryServices.AccountManagement.PrincipalSearcher.SetDefaultPageSizeForContext() +31 OrgChart.VisualWebPart1.VisualWebPart1UserControl.GetActiveDirectory() +245 OrgChart.VisualWebPart1.VisualWebPart1UserControl.Page_Load(Object sender, EventArgs e) +4108 System.Web.UI.Control.OnLoad(EventArgs e) +106 System.Web.UI.Control.LoadRecursive() +68
System.Web.UI.Control.AddedControl(Control control, Int32 index) +11898100 OrgChart.VisualWebPart1.VisualWebPart1.CreateChildControls() +152
System.Web.UI.Control.EnsureChildControls() +106
System.Web.UI.Control.PreRenderRecursiveInternal() +66
System.Web.UI.Control.PreRenderRecursiveInternal() +256
System.Web.UI.Control.PreRenderRecursiveInternal() +256
System.Web.UI.Control.PreRenderRecursiveInternal() +256
System.Web.UI.Control.PreRenderRecursiveInternal() +256
System.Web.UI.Control.PreRenderRecursiveInternal() +256
System.Web.UI.Control.PreRenderRecursiveInternal() +256
System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +6875

Answer 1

Для доменной учетной записи чтение из AD без ограничений по-умолчанию. Для любой локальной учетной записи, в том числе и той, под которой работает IIS, ни какие права не помогут. Локальная учетная запись в AD доступ не получит. Можете попробовать запустить консольное приложение от имени любой локальной учетной записи и получите похожий результат - исключение в связи с отсутствием прав.

Варианты есть:

  1. В IIS создать отдельный пул для приложения и настроить его на запуск от имени доменной учетной записи, вообще говоря любой, но обязательно доменной. Учетную запись для этого стоит специально создать в AD, запретить интерактивный вход в систему и включить во все, необходимые для IIS локальные группы безопасности сервера, чтобы приложение корректно работало. Хороший вариант в плане безопасности, но требует некоторых знаний администрирования IIS и не позволяет понять какой реальный пользователь выполняет запрос в AD если, конечно, это критично для приложения.

    Можно попробовать использовать учетную запись local system для пула, но это плохой вариант в плане безопасности, т.к. ваше приложение получит ничем неограниченный доступ ко всем ресурсам сервера без исключений.

  2. Указать доменные учетные данные в конструкторе PrincipalContext, у него есть соответствующая перегрузка. Только не надо зашивать учетные данные в код, вынесите, хотя бы, в конфиг, а в идеале запросить у пользователя. Самый простой, но и самый небезопасный вариант.

  3. Если приложение поддерживает windows-авторизацию - использовать олицетворение ASP.NET. В плане безопасности все хорошо, но работает только для доменных пользователей приложения и также требует некоторых знаний администрирования IIS.

В общем-то на этом варианты похоже кончились, во всяком случае я ничего больше припомнить не могу. Читать AD могут только доменные пользователи и это не обходится. Поместить локального пользователя в группу безопасности домена не поможет.

READ ALSO
Ошибка - Привязка SOAP 1.1 не найдена

Ошибка - Привязка SOAP 1.1 не найдена

Пытаюсь преобразовать WSDL в классы C# командой wsdl mainwsdl /l:C#, содержимое main

268
Не выводится правильный ответ

Не выводится правильный ответ

Вычислить с точностью E=10-10 значение,где 1/(1+x) ~ 1-x+x2-x3+

86
Округление float с точностью до 0.5

Округление float с точностью до 0.5

Каким образом можно округлять значение float после точки к 5?

243
C# Передача ValueMember из DataGridViewComboBoxColumn в таблицу БД как ID

C# Передача ValueMember из DataGridViewComboBoxColumn в таблицу БД как ID

Добавляю столбец ProductComboBox в datagridview и подгружаю значения из таблицы d__ProductВсе выводит правильно

131