使用 System.DirectoryServices.DirectoryEntry(ADLDS、ADAM、Active Directory 应用程序模式)为新 AD 用户设置密码永不过期

Setting Password Never Expires for new AD user using System.DirectoryServices.DirectoryEntry (ADLDS, ADAM, Active Directory Application Mode)

我已经看到 this question 并尝试使用 "userPrincipalName" 和 "userFlags",并且在这两种情况下我都收到了 "The specified directory service attribute or value does not exist"。

我可以在 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();
}

您是否在使用 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 来设置两者。

由于您刚刚创建了帐户,因此您无需担心该值已经是多少,您只需将其设置为特定值即可。假设你想用 "don't expire password" 标志启用它,那么你可以使用这个:

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

您可以像这样将每个值分开,或者只使用 66048.

的结果十进制值