欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

用vbscript防止本地用户更改其密码

程序员文章站 2022-04-09 11:47:08
问: 嗨,scripting guy!如何配置本地用户帐户以使该用户无法更改其密码? -- dc 答: 嗨,dc。这其中的秘密就在于神秘的 userfl...
问:

嗨,scripting guy!如何配置本地用户帐户以使该用户无法更改其密码?

-- dc

答:

嗨,dc。这其中的秘密就在于神秘的 userflags 属性。我们先向您介绍如何设置用户帐户以使用户无法更改其密码,然后介绍可以使用 userflags 属性管理的一些其他本地用户帐户属性。运气好的话,还可以赶上吃午餐哩!

我们先来介绍可以防止用户更改其密码的脚本:

复制代码 代码如下:

const ads_uf_passwd_cant_change = &h0040

set objuser = getobject("winnt://atl-ws-01/kenmyer")

if not objuser.userflags and ads_uf_passwd_cant_change then
    objpasswordnochangeflag = objuser.userflags xor ads_uf_passwd_cant_change
    objuser.put "userflags", objpasswordnochangeflag 
    objuser.setinfo
end if

首先,定义一个常量(它有一个好记的名称 ads_uf_passwd_cant_change),我们需要用它来标识 userflags 属性内的正确“开关”。userflags 属性是一种位掩码属性示例,它包含多个属性和属性值。姑且将位掩码视为一组开关,每个开关表示一种不同的属性。如果将“用户不能更改密码”开关打开,则用户无法更改其密码;如果将开关关闭,则用户可以 更改其密码。这部分内容还算浅显易懂;位掩码唯一不好处理的地方是,“开关”名称可不像“用户不能更改密码”这样好记,它们使用的是类似于 &h0040 的十六进制值。要执行这项任务,我们需要切换“&h0040”开关,这就是我们定义这一常量的原因。

接下来,连接到计算机 atl-ws-01 上的 kenmyer 帐户。此时,我们检查相关开关是否已打开。在使用位掩码时,您通常会看到类似下面的代码:

if objuser.userflags and ads_uf_passwd_cant_change then

我们可以用浅显的语言来说明以上代码:如果存在 userflags 属性,并且打开了 ads_uf_passwd_cant_change 开关,则该语句为真,并且应执行某种操作。就这项任务而言,我们并不关心处于打开状态的开关;如果设置了“不能更改密码”标志,我们的工作即告完成。我们只关心处于关闭状态的开关。因此,我们编写了下面这行代码;只有当开关 处于打开状态时,它才会起作用:

if not objuser.userflags and ads_uf_passwd_cant_change then

接下来的内容可就真的 要让您伤脑筋了。请看下面这行代码:

objpasswordnochangeflag = objuser.userflags xor ads_uf_passwd_cant_change

尽管看起来有点复杂,实际上这行代码确实非常简单。我们此处执行的全部操作是切换“用户不能更改密码”开关的值。这正是 xor 命令的功能。如果开关处于打开状态,则 xor 将其关闭;如果开关处于关闭状态,则 xor 将其打开。我们要做的就是获取 userflags 属性的当前值,并切换“用户不能更改密码”开关。因为我们已经知道该开关处于关闭状态(还记得我们刚才使用的“if not”语句吗?),所以 xor 命令将该开关打开。变量 objpasswordnochangeflag 中包含的值将与当前 userflags 属性中的值完全相同,唯一不同之处在于,“用户不能更改密码”开关此时处于打开状态,而不是处于关闭状态。

跟得上我们的思路吗?脚本的其余部分就非常简单了。下面这行代码将变量 objpasswordnochangeflag 的值写入 userflags 属性:

objuser.put "userflags", objpasswordnochangeflag

然后,我们使用 setinfo 命令将这些更改写入用户帐户。通过运行这样一个脚本,使本地用户 ken myer 不再拥有在计算机 atl-ws-01 上更改其密码的权限。

那么,如果您想允许 ken myer 更改其密码,该怎么办呢?那还不简单。只需检查“用户不能更改密码”开关是否处于打开 状态,如果是,则使用 xor 将其关闭:

const ads_uf_passwd_cant_change = &h0040

set objuser = getobject("winnt://atl-ws-01/kenmyer")

if objuser.userflags and ads_uf_passwd_cant_change then
  objpasswordnochangeflag = objuser.userflags xor ads_uf_passwd_cant_change
  objuser.put "userflags", objpasswordnochangeflag 
  objuser.setinfo
end if

唯一不同之处在于,我们从 if-then 语句中删除了 not 一词。这是因为,我们现在想要 查找开关处于打开状态的情况,然后将其关闭。

我们承认,这些位掩码属性的确 让人难懂。如果您想了解详细信息(以及一些图片),请参见“microsoft windows 2000 脚本编写指南”中的。正如前面所承诺的一样,我们在下面列出了可以使用 userflags 属性进行管理的一些其他本地用户帐户属性:

属性

常量

将执行登录脚本

ads_uf_script

&h0001

禁用帐户

ads_uf_accountdisable

&h0002

帐户需要主目录

ads_uf_homedir_required

&h0008

锁定帐户

ads_uf_lockout

&h0010

帐户不需要密码

ads_uf_passwd_notreqd

&h0020

用户不能更改密码

ads_uf_passwd_cant_change

&h0040

允许加密文本密码

ads_uf_encrypted_text_password_allowed

&h0080

帐户密码永不过期

ads_uf_dont_expire_passwd

&h10000

登录需要使用智能卡

ads_uf_smartcard_required

&h40000

密码已过期

ads_uf_password_expired

&h800000

如果什么时候没有事情可做,请将这些值替换到“用户不能更改密码”脚本中,看会出现什么情况。(当然,我们始终建议您,在用这样的脚本做试验时,请使用测试计算机,或者至少应使用测试帐户。)