C # доступ к Active Directory как другой пользователь - PullRequest
0 голосов
/ 12 декабря 2018

Я хотел бы попросить вас помочь в следующем вопросе.Я работаю над специальным приложением, будет использоваться только мной и только один раз.

Часть этого - выполнить сброс пароля для более чем 3000 пользователей в AD и отправить им новые учетные данные.

Я могу читать из AD как обычный пользователь, но мне нужно использовать привилегированную учетную запись для ее изменения.Как я могу это сделать?Я знаю, что могу использовать PowerShell и сделать это за считанные секунды, но я хотел бы узнать, как это сделать в C #.

Мой код для поиска пользователя прост

public class ADSecurity
{
    public static string getUserName(string sam)
    {
        PrincipalContext ctx = new PrincipalContext(ContextType.Domain);
        UserPrincipal user = UserPrincipal.FindByIdentity(ctx, IdentityType.SamAccountName, sam);
        return user.Name;
    }
}

Как я могу сделать то же самое, но как другой пользователь?

Я видел несколько руководств, но никто из них не объяснял ... просто совет о том, как имитировать, но ничего о том, как его использовать.Здесь была одна статья об олицетворении, но с использованием протокола LDAP (DirectoryEntry).Но, как я понимаю, это действительно медленно.

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

Спасибо.

1 Ответ

0 голосов
/ 12 декабря 2018

Есть несколько способов сделать это:

  1. Запустите приложение с необходимыми учетными данными (Shift + щелчок правой кнопкой мыши по файлу .exe и используйте «Запуск от имени другого пользователя»).Если вы просто делаете это один раз, это самое простое.
  2. Используйте PrincipalContext конструктор , который принимает имя пользователя и пароль.
public class ADSecurity
{
    public static string getUserName(string sam)
    {
        PrincipalContext ctx = new PrincipalContext(ContextType.Domain, null, username, password);
        UserPrincipal user = UserPrincipal.FindByIdentity(ctx, IdentityType.SamAccountName, sam);
        return user.Name;
    }
}
Используйте DirectoryEntry конструктор , который принимает имя пользователя и пароль.

Я не уверен, о каком примере вы говорите, он "медленный", но вмой опыт использования DirectoryEntry напрямую почти всегда быстрее, если вы используете его правильно.Пространство имен System.DirectoryServices.AccountManagement (которое вы используете в своем примере) в любом случае использует DirectoryEntry за кулисами.

Конечно, варианты 2 и 3 требуют, чтобы вы знали пароль.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...