【问题标题】:How do I write a script to modify the password expiration values for users on a Windows Server?如何编写脚本来修改 Windows Server 上用户的密码过期值?
【发布时间】:2011-06-16 23:46:21
【问题描述】:

我需要在 Windows 2008 服务器上创建多个用户并将密码过期值修改为“Never”。这些将是本地(不是 AD)用户。我可以使用“net user”创建它们,它正在修改让我丧命的通行证到期。如果我执行“net user username”,它会列出该字段及其值,但没有开关(至少不是帮助文件引用的开关)来修改它,我的大多数解决方案在网上看到建议安装 3rd 方工具,但是这个解决方案必须是 Windows 原生的(最好使用 Powershell)。任何帮助表示赞赏。

更新

我说过,如果我知道如何在 Powershell 中执行此操作,我会在此处发布,我是一个信守诺言的人。

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

这是一个布尔值,因此如果您想设置密码过期,只需将 0 更改为 1。这对我来说非常简单,而且我已经测试了此方法更新其他 WMI 对象,并且每次都有效。

【问题讨论】:

  • 您需要脚本来执行此操作,还是只需执行一次?
  • 这是一个完全有效的问题,考虑到你想用脚本来做,迁移到超级用户是没有意义的。我稍微修改了标题以使您的问题更清楚。来自我的 +1。

标签: windows scripting powershell powershell-2.0 windows-server-2008-r2


【解决方案1】:

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

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,上面的代码应该会给你一些想法。

【讨论】:

  • 谢谢,我会看看这些解决方案。这是一个脚本,我正在尝试完全自动化 webfarm 的应用程序服务器设置,并且有一些我无法弄清楚如何轻松编写脚本(比如这个)......如果我想了解如何将 C# 转换为 powershell 我也会在这里发布(这些脚本都是用 powershell 编写的)。再次感谢,仅供参考,我喜欢脚本专家...
【解决方案2】:

来自this technet thread

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

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

【讨论】:

  • 不错。我不太使用 WMI,所以我没想到那里。
  • 忘了提及...您上面的脚本设置了实际的过期标志,而不是 willexpire 标志。但是还是谢谢你的帮助......
【解决方案3】:

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

$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

【讨论】:

    【解决方案4】:

    为我工作:

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

    用正确的用户名替换 ftpuser

    【讨论】:

      【解决方案5】:

      其他解决方案对我不起作用,因此我将 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

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

      【讨论】:

        【解决方案6】:

        我采用了 Deadly-Bagel 的解决方案,但没有奏效,直到我做了一个小改动。见下文:

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

        【讨论】:

          猜你喜欢
          • 2010-09-08
          • 2010-10-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-03-19
          • 2011-03-08
          • 1970-01-01
          相关资源
          最近更新 更多