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
相关产品推荐
相关产品推荐

