如何编写脚本来修改Windows Server上用户的密码到期值?

时间:2011-01-28 02:23:11

标签: windows scripting powershell powershell-v2.0 windows-server-2008-r2

我需要在Windows 2008服务器上创建多个用户,并将密码到期值修改为“从不”。这些将是本地(非AD)用户。我可以使用“ net user ”创建它们,它正在修改杀死我的通过期限。如果我执行“ net user username ”,它会列出字段及其值,但是没有开关(至少没有帮助文件引用的那个)来修改它,而且大多数解决方案我在网上看到建议安装第三方工具,但是这个解决方案必须是Windows原生的(理想情况下使用Powershell)。任何帮助表示赞赏。

更新

我说过,如果我在Powershell中想出如何做到这一点,我会把它发布在这里,而且我是一个忠诚的人。

Get-WmiObject -Class Win32_UserAccount -Filter "name = 'steve'" | Set-WmiInstance -Argument @{PasswordExpires = 0}

这是一个布尔值,所以如果你想设置一个密码到期,只需将0改为1.这对我来说很简单,我已经测试了这个方法更新其他WMI对象,它每次都有效。

6 个答案:

答案 0 :(得分:6)

简单的解决方案是创建一个发出以下命令的批处理文件:

net accounts /maxpwage:unlimited

但是,这会将本地计算机上所有帐户的最长密码期限设置为无限制,而不仅仅是您创建的新帐户。


如果您需要更精细的控制级别(即,为各个用户设置密码到期值的能力),您将需要更复杂的东西。 VBScript的脚本专家share an example将修改本地用户帐户,以使其密码永不过期:

Const ADS_UF_DONT_EXPIRE_PASSWD = &h10000 

strDomainOrWorkgroup = "Fabrikam" 
strComputer = "atl-win2k-01" 
strUser = "KenMeyer" 

Set objUser = GetObject("WinNT://" & strDomainOrWorkgroup & "/" & _ 
    strComputer & "/" & strUser & ",User") 

objUserFlags = objUser.Get("UserFlags") 
objPasswordExpirationFlag = objUserFlags OR ADS_UF_DONT_EXPIRE_PASSWD 
objUser.Put "userFlags", objPasswordExpirationFlag  
objUser.SetInfo 

很容易将其修改为适合您选择的任何用户,甚至可以创建新用户。


最后,here's an example in C#,您应该能够移植到PowerShell。我不是PS专家,但考虑到它使用.NET Framework,上面的代码应该给你一些想法。

答案 1 :(得分:1)

来自this technet thread

$computer = $env:Computername
$account = ([adsi]"WinNT://$computer/TestAccount")
$account.PasswordExpired = 1
$account.psbase.commitchanges()

如果需要,您可以在计算机名称之前添加域名。

答案 2 :(得分:1)

为本地用户设置密码永不过期。不要改变其他标志:

$ADS_UF_DONT_EXPIRE_PASSWD = 0x10000

$username = 'user'
$user = [adsi] "WinNT://./$username"
$user.UserFlags = $user.UserFlags[0] -bor $ADS_UF_DONT_EXPIRE_PASSWD
$user.SetInfo()

ADS_USER_FLAG_ENUM enumeration

答案 3 :(得分:0)

其他解决方案对我不起作用所以我将Jason的解决方案调整为:

$svrname = $env:computername
$user = ([adsi]"WinNT://$svrname/Administrator")
$user.userflags = 66049
$user.psbase.commitchanges()

userflags值确定为用户检查哪些复选框 - 这是一个基本的“密码不会过期”值。似乎无法弄清楚数字是如何组合在一起的,下面的内容可能很有用但是根据我已经启用了保留值,这是没有意义的。

http://www.selfadsi.org/ads-attributes/user-userAccountControl.htm

相反,我只是在测试盒上启用了我需要的选项并检索了值。是猜测你需要什么的最可靠的方法。

答案 4 :(得分:0)

我采用了Deadly-Bagel的解决方案并且它没有工作,直到我做了一个小小的改变。见下文:

$svrname = $env:computername
$user = ([adsi]"WinNT://$svrname/Administrator")
$user.psbase.InvokeSet("userflags", 66049)
$user.psbase.commitchanges()

答案 5 :(得分:0)

为我工作:

WMIC USERACCOUNT WHERE "Name='ftpuser'" SET PasswordExpires=FALSE

用正确的用户名替换 ftpuser