使用 Powershell 在 Windows 上实施密码复杂性
Enforce Password complexity on Windows using Powershell
如何使用 Windows Powershell 在工作组计算机上启用密码复杂性?我知道如何在域级别上执行此操作。我们有一些位于远程位置的计算机,它们没有域访问权限,因此它们在工作组中。
对于 powershell 这不是一个好的解决方案。
这对于本地安全策略是可以的。
- 转到 运行 并输入 SecPol.msc
- 转到帐户策略 > 密码策略 > 密码必须满足复杂性要求
- 设置为启用。
- 设置最小密码长度
- 设置密码最长期限
所以我决定编写一些函数来通过 Powershell 为您处理所有这一切。
您可以使用此功能Parse-SecPol
获取和编辑安全策略。这会将整个配置文件变成一个 PSobject,这样你就可以更改属性并对它们进行排序或任何你想做的事情。
接下来是 Set-SecPol
,它将允许您将对象重新保存回本地安全策略。
参数 -CfgFile
是您要保存配置文件的位置。
这是带有示例的完整脚本(必须 运行 作为管理员)
Function Parse-SecPol($CfgFile){
secedit /export /cfg "$CfgFile" | out-null
$obj = New-Object psobject
$index = 0
$contents = Get-Content $CfgFile -raw
[regex]::Matches($contents,"(?<=\[)(.*)(?=\])") | %{
$title = $_
[regex]::Matches($contents,"(?<=\]).*?((?=\[)|(\Z))", [System.Text.RegularExpressions.RegexOptions]::Singleline)[$index] | %{
$section = new-object psobject
$_.value -split "\r\n" | ?{$_.length -gt 0} | %{
$value = [regex]::Match($_,"(?<=\=).*").value
$name = [regex]::Match($_,".*(?=\=)").value
$section | add-member -MemberType NoteProperty -Name $name.tostring().trim() -Value $value.tostring().trim() -ErrorAction SilentlyContinue | out-null
}
$obj | Add-Member -MemberType NoteProperty -Name $title -Value $section
}
$index += 1
}
return $obj
}
Function Set-SecPol($Object, $CfgFile){
$SecPool.psobject.Properties.GetEnumerator() | %{
"[$($_.Name)]"
$_.Value | %{
$_.psobject.Properties.GetEnumerator() | %{
"$($_.Name)=$($_.Value)"
}
}
} | out-file $CfgFile -ErrorAction Stop
secedit /configure /db c:\windows\security\local.sdb /cfg "$CfgFile" /areas SECURITYPOLICY
}
$SecPool = Parse-SecPol -CfgFile C:\test\Test.cgf
$SecPool.'System Access'.PasswordComplexity = 1
$SecPool.'System Access'.MinimumPasswordLength = 8
$SecPool.'System Access'.MaximumPasswordAge = 60
Set-SecPol -Object $SecPool -CfgFile C:\Test\Test.cfg
如何使用 Windows Powershell 在工作组计算机上启用密码复杂性?我知道如何在域级别上执行此操作。我们有一些位于远程位置的计算机,它们没有域访问权限,因此它们在工作组中。
对于 powershell 这不是一个好的解决方案。 这对于本地安全策略是可以的。
- 转到 运行 并输入 SecPol.msc
- 转到帐户策略 > 密码策略 > 密码必须满足复杂性要求
- 设置为启用。
- 设置最小密码长度
- 设置密码最长期限
所以我决定编写一些函数来通过 Powershell 为您处理所有这一切。
您可以使用此功能Parse-SecPol
获取和编辑安全策略。这会将整个配置文件变成一个 PSobject,这样你就可以更改属性并对它们进行排序或任何你想做的事情。
接下来是 Set-SecPol
,它将允许您将对象重新保存回本地安全策略。
参数 -CfgFile
是您要保存配置文件的位置。
这是带有示例的完整脚本(必须 运行 作为管理员)
Function Parse-SecPol($CfgFile){
secedit /export /cfg "$CfgFile" | out-null
$obj = New-Object psobject
$index = 0
$contents = Get-Content $CfgFile -raw
[regex]::Matches($contents,"(?<=\[)(.*)(?=\])") | %{
$title = $_
[regex]::Matches($contents,"(?<=\]).*?((?=\[)|(\Z))", [System.Text.RegularExpressions.RegexOptions]::Singleline)[$index] | %{
$section = new-object psobject
$_.value -split "\r\n" | ?{$_.length -gt 0} | %{
$value = [regex]::Match($_,"(?<=\=).*").value
$name = [regex]::Match($_,".*(?=\=)").value
$section | add-member -MemberType NoteProperty -Name $name.tostring().trim() -Value $value.tostring().trim() -ErrorAction SilentlyContinue | out-null
}
$obj | Add-Member -MemberType NoteProperty -Name $title -Value $section
}
$index += 1
}
return $obj
}
Function Set-SecPol($Object, $CfgFile){
$SecPool.psobject.Properties.GetEnumerator() | %{
"[$($_.Name)]"
$_.Value | %{
$_.psobject.Properties.GetEnumerator() | %{
"$($_.Name)=$($_.Value)"
}
}
} | out-file $CfgFile -ErrorAction Stop
secedit /configure /db c:\windows\security\local.sdb /cfg "$CfgFile" /areas SECURITYPOLICY
}
$SecPool = Parse-SecPol -CfgFile C:\test\Test.cgf
$SecPool.'System Access'.PasswordComplexity = 1
$SecPool.'System Access'.MinimumPasswordLength = 8
$SecPool.'System Access'.MaximumPasswordAge = 60
Set-SecPol -Object $SecPool -CfgFile C:\Test\Test.cfg