Подскажите, делаю запрос к 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
Для доменной учетной записи чтение из AD без ограничений по-умолчанию. Для любой локальной учетной записи, в том числе и той, под которой работает IIS, ни какие права не помогут. Локальная учетная запись в AD доступ не получит. Можете попробовать запустить консольное приложение от имени любой локальной учетной записи и получите похожий результат - исключение в связи с отсутствием прав.
Варианты есть:
В IIS создать отдельный пул для приложения и настроить его на запуск от имени доменной учетной записи, вообще говоря любой, но обязательно доменной. Учетную запись для этого стоит специально создать в AD, запретить интерактивный вход в систему и включить во все, необходимые для IIS локальные группы безопасности сервера, чтобы приложение корректно работало. Хороший вариант в плане безопасности, но требует некоторых знаний администрирования IIS и не позволяет понять какой реальный пользователь выполняет запрос в AD если, конечно, это критично для приложения.
Можно попробовать использовать учетную запись local system для пула, но это плохой вариант в плане безопасности, т.к. ваше приложение получит ничем неограниченный доступ ко всем ресурсам сервера без исключений.
Указать доменные учетные данные в конструкторе PrincipalContext
, у него есть соответствующая перегрузка. Только не надо зашивать учетные данные в код, вынесите, хотя бы, в конфиг, а в идеале запросить у пользователя. Самый простой, но и самый небезопасный вариант.
Если приложение поддерживает windows-авторизацию - использовать олицетворение ASP.NET. В плане безопасности все хорошо, но работает только для доменных пользователей приложения и также требует некоторых знаний администрирования IIS.
В общем-то на этом варианты похоже кончились, во всяком случае я ничего больше припомнить не могу. Читать AD могут только доменные пользователи и это не обходится. Поместить локального пользователя в группу безопасности домена не поможет.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Пытаюсь преобразовать WSDL в классы C# командой wsdl mainwsdl /l:C#, содержимое main
Каким образом можно округлять значение float после точки к 5?
Добавляю столбец ProductComboBox в datagridview и подгружаю значения из таблицы d__ProductВсе выводит правильно