0

我正在使用 perl Net::LDAPS 连接到 Active Directory 2008 域控制器并尝试设置“用户下次登录时必须更改密码”帐户选项,但它不起作用。

我能够创建、修改、删除和移动不同的对象,但我无法获取更改密码设置!

这是我正在尝试做的,但它不起作用:

注意:我正在为 Net::LDAPS 使用一个自写的类包装器,下面的代码被归结为我正在尝试做的事情。

# 绑定到 LDAP 目录:
$self->{LDAP_INSTANCE} = Net::LDAPS->new($host);
$self->{LDAP_INSTANCE}->bind(dn=>$dn, password=>$password, version=>3 )

我的 $rc =$self->{LDAP_INSTANCE}->modify(
    $DN_OF_USER_ACCOUNT,
    [替换=> [userAccountControl => 0x00800000]]
);
打印 $rc->错误;# 结果为空字符串/没有错误

# 注意:我也尝试过:hex(800000) 而不是 0x00800000。

我正在绑定域管理员帐户,并且我已验证 $DN_OF_USER_ACCOUNT 是正确的。

4

1 回答 1

0

userAccountControl属性是具有许多设置的位域。将用户的值更改为0x00800000是非常有害的,因为它会删除0x200 ADS_UF_NORMAL_ACCOUNT.

文档0x00800000是:

0x00800000
ADS_UF_PASSWORD_EXPIRED
用户密码已过期。该标志由系统使用来自 Pwd-Last-Set 属性和域策略的数据创建。

如果我们查看pwdLastSet的文档,我们会看到:

上次更改此帐户密码的日期和时间。[...] 如果此值设置为 0 并且 User-Account-Control 属性不包含 UF_DONT_EXPIRE_PASSWD 标志,则用户必须在下次登录时设置密码。

所以要使密码过期,我们需要设置pwdLastSet为零。Scripting Guy 的一篇博客文章证实了这一点,他在 VBScript 中执行此操作。

在 Perl 中:

# Binding to LDAP Directory:
$self->{LDAP_INSTANCE} = Net::LDAPS->new($host);
$self->{LDAP_INSTANCE}->bind(dn=>$dn, password=>$password, version=>3 )

my $rc =$self->{LDAP_INSTANCE}->modify(
    $DN_OF_USER_ACCOUNT, 
    [ replace => [pwdLastSet => 0] ]
);
print $rc->error;
于 2015-09-13T16:07:19.093 回答