С# доступ к активному каталогу с разными учетными данными пользователя

Существует новое приложение для создания пользователей, которое мы только что предоставили нашим пользователям. Однако этим пользователям нужна возможность создавать пользователей через приложение, даже если у них самих нет разрешения на создание пользователей.

В С#, как вы выдаете себя за другого пользователя, чтобы иметь эту функциональность. Это основное приложение, использующее System.DirectoryServices.

Фрагмент кода:

DirectoryEntry dEntry = new DirectoryEntry("LDAP://OU=");
DirectorySearcher dSearcher = new DirectorySearcher(dEntry);
//filter just user objects
dSearcher.SearchScope = SearchScope.Subtree;
dSearcher.Filter = "(&(objectClass=user)(mail=" + excel_Holding_Table.Rows[i]["EmailAddress"].ToString() + "))";
dSearcher.PageSize = 1000;
sResults = dSearcher.FindAll();

person Community    schedule 24.05.2012    source источник
comment
Запускать процесс/службу от имени администратора? Я знаю, как это сделать вручную, но не знаю, как это будет работать в .NET в автоматическом режиме.   -  person JAB    schedule 24.05.2012


Ответы (4)


Вы можете напрямую использовать класс DirectoryEntry и указать имя пользователя и пароль:

DirectoryEntry de = new DirectoryEntry(path);

de.Username = "username";
de.Password = "password";

И получить доступ к Active Directory из объекта de. Или вы можете использовать класс WindowsIdentity и олицетворять пользователя:

WindowsIdentity newId = new WindowsIdentity(safeTokenHandle.DangerousGetHandle());
WindowsImpersonationContext impersonatedUser = newId.Impersonate();

Полный образец кода доступен по адресу:

Олицетворение и DirectoryEntry

person Darren    schedule 24.05.2012

Используйте конструктор DirectoryEntry, который принимает параметры имени пользователя, пароля и authenticationType.

Кроме того, типы DirectoryEntry DirectorySearcher и SearchResultCollection являются IDisposable - вам нужно их удалить, возможно, с помощью операторов using.

person Joe    schedule 24.05.2012

Используйте конструктор DirectoryEntry (String, String, String, AuthenticationTypes), который принимает имя пользователя и пароль вместо олицетворения.

DirectoryEntry directoryEntry = new DirectoryEntry("IIS://" + serverName + "/W3SVC/1/Root", @"domain\username", "password", AuthenticationTypes.Secure | AuthenticationTypes.Sealing); 

Справочник

person danielQ    schedule 24.05.2012

Вы можете использовать привилегированные учетные данные для подключения к AD или для олицетворения привилегированного пользователя, как предлагалось в других ответах.

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

Более безопасным решением было бы создание веб-службы, работающей под учетной записью службы с соответствующими разрешениями AD. Пользователи могут аутентифицироваться в веб-службе, используя проверку подлинности Windows, и веб-служба будет создавать пользователей от их имени. Он может использовать авторизацию для ограничения того, что пользователям разрешено делать (например, создавать пользователей только в своем собственном отделе).

person Joe    schedule 21.01.2017