Установка пароля никогда не истекает для нового пользователя AD с помощью System.DirectoryServices.DirectoryEntry (ADLDS, ADAM, режим приложения Active Directory) - PullRequest
0 голосов
/ 28 мая 2020

Я видел этот вопрос и пробовал использовать как userPrincipalName, так и userFlags, и в обоих случаях я получаю «Указанный атрибут или значение службы каталогов не существует».

Я могу установить атрибут со следующим в Powershell

Get-ADUser -Filter 'cn -like "*username*"' -Server <serveraddrress> -SearchBase "<searchbase>" | Set-ADUser -PasswordNeverExpires:$True

Мой C# код выглядит следующим образом, он отлично работает, если я удалю параметр строки userAccountControl, но он создает пользователя с Пароль никогда не истекает = FALSE

using (var dirEntry = entry.Children.Add("CN=" + username, "user"))
{
    dirEntry.Properties["userPrincipalName"].Value = string.Format("{0}@principal", username);
    dirEntry.CommitChanges();
    dirEntry.Options.PasswordPort = port;
    dirEntry.Options.PasswordEncoding = PasswordEncodingMethod.PasswordEncodingClear;
    dirEntry.Invoke("SetPassword", password);

    if (!string.IsNullOrEmpty(email))
         dirEntry.Properties["mail"].Value = email;
    dirEntry.Properties["msDS-UserAccountDisabled"].Value = "FALSE";

    //this doesn't work with both "userAccountControl" and "userFlags"
    dirEntry.Properties["userAccountControl"].Value = (int)(dirEntry.Properties["userAccountControl"].Value ?? 0) | 0x10000;

    dirEntry.CommitChanges();
}

1 Ответ

1 голос
/ 28 мая 2020

Используете ли вы режим приложения Active Directory (ADAM)? Эта строка заставляет меня думать, что вы:

dirEntry.Properties["msDS-UserAccountDisabled"].Value = "FALSE";

Этот атрибут не существует в обычном Active Directory. Итак, если это работает для вас, тогда вы используете ADAM.

Если вы используете ADAM, используйте атрибут msDS-UserDontExpirePassword, чтобы пароль не истек:

dirEntry.Properties["msDS-UserDontExpirePassword"].Value = true;

Если вы не используете ADAM, значит "msDS-UserAccountDisabled не существует, и вам не следует его использовать. Вместо этого используйте userAccountControl, чтобы установить оба.

Поскольку вы только что создали учетную запись, вам не нужно беспокоиться о том, какое значение уже было, вы можете просто установить его на конкретное значение c. Предполагая, что вы хотите, чтобы он был включен с флагом «не истекает срок действия пароля», вы можете использовать это:

//NORMAL_ACCOUNT | DONT_EXPIRE_PASSWORD
dirEntry.Properties["userAccountControl"].Value = 0x0200 | 0x10000;

Вы можете оставить каждое значение разделенным таким образом или просто использовать полученное десятичное значение 66048.

...