You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PowerShell New-LocalUser的PasswordNeverExpires等属性失效问题

问题排查与修复方案

核心错误点

  • WinNT ADSI接口不支持直接设置PasswordNeverExpires/UserMayNotChangePassword属性,这两个配置属于用户属性的位掩码标志,需要通过修改userFlags属性实现
  • 属性赋值方法调用错误,ADSI接口给属性赋值使用Put()而非Set(),你修改的代码中调用$user.set()属于方法名写错
  • 参数类型选择不合理,开关类参数建议使用[switch]而非[bool],符合PowerShell原生Cmdlet的使用习惯
  • 未判断参数是否被显式传入,[bool]类型参数默认值为$false,即使你没有传对应参数,代码也会强制给标志位赋值为$false,覆盖系统默认配置

修复后完整代码

function New-LocalUser
{
    [CmdletBinding()]
    [Alias()]
    [OutputType([int])]
    Param
    (
        [Parameter(Mandatory=$true,
                   ValueFromPipelineByPropertyName=$true,
                   Position=0)]
        [string[]]$Name,

        [Parameter(Mandatory=$false,
                   ValueFromPipelineByPropertyName=$true,
                   Position=1)]
        [string[]]$Computername = "$Env:computername",

        [Parameter(Mandatory=$true,
                   ValueFromPipelineByPropertyName=$true,
                   Position=2)]
        [ValidateScript({$_.GetType().Name -eq 'SecureString'})]
        [array][system.security.securestring]$Password,

        [Parameter(Mandatory=$false,
                   ValueFromPipelineByPropertyName=$true,
                   Position=3)]
        [string[]]$Description=' ',

        [Parameter(Mandatory=$false,
                   ValueFromPipelineByPropertyName=$true,
                   Position=4)]
        [switch]$PasswordNeverExpires,

        [Parameter(Mandatory=$false,
                   ValueFromPipelineByPropertyName=$true,
                   Position=5)]
        [switch]$UserMayNotChangePassword 

    )

    Begin
    {
        # 定义userFlags常量值
        $ADS_UF_DONT_EXPIRE_PASSWD = 0x10000
        $ADS_UF_PASSWD_CANT_CHANGE = 0x40
    }
    Process
    {
        $cred=New-Object -TypeName System.management.automation.pscredential -ArgumentList "null",$Password[0]
        $Plaintextpassword=$cred.GetNetworkCredential().password
        $computer = [ADSI]"WinNT://$($ComputerName[0]),computer"
        $user = $computer.Create("User", "$($Name[0])")
        $user.setpassword("$PlainTextPassword")
        $user.put("Description",$($Description[0])) 
        
        # 处理用户标志位
        $userFlags = $user.Get("userFlags")
        if ($PSBoundParameters.ContainsKey('PasswordNeverExpires')) {
            if ($PasswordNeverExpires) {
                $userFlags = $userFlags -bor $ADS_UF_DONT_EXPIRE_PASSWD
            } else {
                $userFlags = $userFlags -band (-bnot $ADS_UF_DONT_EXPIRE_PASSWD)
            }
        }
        if ($PSBoundParameters.ContainsKey('UserMayNotChangePassword')) {
            if ($UserMayNotChangePassword) {
                $userFlags = $userFlags -bor $ADS_UF_PASSWD_CANT_CHANGE
            } else {
                $userFlags = $userFlags -band (-bnot $ADS_UF_PASSWD_CANT_CHANGE)
            }
        }
        $user.Put("userFlags", $userFlags)
        
        $user.SetInfo()    
    }
    End
    {
    }
}

验证方法

  • 执行创建命令示例:New-LocalUser -Name "测试用户" -Password (ConvertTo-SecureString "测试密码123!" -AsPlainText -Force) -PasswordNeverExpires -UserMayNotChangePassword
  • 运行net user 测试用户查看输出中「密码永不过期」「用户可修改密码」字段是否符合预期
  • 重启设备后再次执行上述命令验证配置是否持久化生效

内容的提问来源于stack exchange,提问作者Manoj Stack

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 02:24:07