我需要在Windows 2008服务器上创build多个用户,并将密码到期值修改为“ 从不 ”。 这些将是本地(而不是AD)用户。 我可以使用“ networking用户 ”创build它们,它正在修改杀死我的通行证过期。 如果我做了一个“ net user username ”,它会列出这个字段和它的值,但是没有交换机(至less没有帮助文件引用的那个)来修改它,而且我在线看到的大多数解决scheme都build议安装第三方工具,但是这个解决scheme必须是Windows本地的(最好使用Powershell)。 任何帮助表示赞赏。
UPDATE
我说如果我想出在PowerShell中如何做到这一点,我会在这里发布,而且我是一个我的话。
Get-WmiObject -Class Win32_UserAccount -Filter "name = 'steve'" | Set-WmiInstance -Argument @{PasswordExpires = 0}
这是一个布尔值,所以如果你想设置一个密码过期只是改变0到1.这对我来说很简单,我已经testing了这个方法更新其他WMI对象,它每次都工作。
简单的解决方案是创建一个批处理文件,发出以下命令:
net accounts /maxpwage:unlimited
但是,这会将本地计算机上所有帐户的密码最长期限设置为无限制,而不仅限于您创建的新帐户。
如果你需要一个更好的控制水平(即为个人用户设置密码过期值),你需要一些更复杂的东西。 脚本专家共享 VBScript 的示例 ,该脚本将修改本地用户帐户,以便其密码永不过期:
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
这将很容易修改,以适应任何用户的选择,甚至创建一个新的用户。
最后, 这是C#中的一个例子 ,您应该能够移植到PowerShell。 我不是一个PS专家,但考虑到它使用.NET框架,上面的代码应该给你一些想法。
从这个technet线程 。
$computer = $env:Computername $account = ([adsi]"WinNT://$computer/TestAccount") $account.PasswordExpired = 1 $account.psbase.commitchanges()
如果需要,可以在计算机名称之前添加域。
为本地用户设置密码永不过期 。 不要更改其他标志:
$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枚举
其他解决方案不适合我,所以我调整了杰森的解决方案:
$svrname = $env:computername $user = ([adsi]"WinNT://$svrname/Administrator") $user.userflags = 66049 $user.psbase.commitchanges()
userflags值确定为用户检查哪个tickbox – 这是一个基本的“密码不过期”值。 似乎无法弄清楚数字是如何汇集在一起的,下面的内容可能是有用的,但是根据这一点,我已经得到了保留的值,这是没有意义的。
http://www.selfadsi.org/ads-attributes/user-userAccountControl.htm
相反,我只是在测试框中启用了我需要的选项,并检索了值。 是最可靠的手段来确定你所需要我猜。
我采取了致命的百吉饼的解决方案,并没有奏效,直到我做了一个小小的改变。 见下文:
$svrname = $env:computername $user = ([adsi]"WinNT://$svrname/Administrator") $user.psbase.InvokeSet("userflags", 66049) $user.psbase.commitchanges()