Изменить локальную политику безопасности с помощью Powershell
Я использую Windows Server 2012.
Я могу сделать это:
В папке "Администрирование" дважды щелкните значок "Локальная политика безопасности", разверните "Политики учетной записи" и нажмите "Политика паролей".
На правой панели дважды щелкните "Пароль", чтобы соответствовать требованиям сложности, и установите для него значение "Отключено". Нажмите кнопку ОК, чтобы сохранить изменения политики.
Как я могу сделать это программно с помощью Powershell?
2 ответа
В ответе @Kayasax нет никакого чистого способа сделать это в PowerShell, вы должны поместить secedit в Powershell.
secedit /export /cfg c:\secpol.cfg
(gc C:\secpol.cfg).replace("PasswordComplexity = 1", "PasswordComplexity = 0") | Out-File C:\secpol.cfg
secedit /configure /db c:\windows\security\local.sdb /cfg c:\secpol.cfg /areas SECURITYPOLICY
rm -force c:\secpol.cfg -confirm:$false
Я решил написать пару функций, чтобы облегчить этот процесс.
Parse-SecPol
: превратит локальную политику безопасности в PsObject. Вы можете просмотреть все свойства и внести изменения в объект.
Set-SecPol
: повернет Parse-SecPol
Возвратите объект в файл конфигурации и импортируйте его в локальную политику безопасности.
Вот пример его использования:
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 7
Я решил это с помощью следующего сценария PowerShell
$name = $PSScriptRoot + "\" + $MyInvocation.MyCommand.Name
if (!([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator")) { Start-Process powershell.exe "-NoProfile -ExecutionPolicy Bypass -File `"$name`"" -Verb RunAs; exit }
$registryPath = "HKLM:\SYSTEM\CurrentControlSet\Control\Lsa"
$Name = "LimitBlankPasswordUse"
$value = "0"
New-ItemProperty -Path $registryPath -Name $name -Value $value ` -PropertyType DWORD -Force | Out-Null
Этот скрипт будет автоматически запускаться от имени администратора, если он еще не открыт в режиме администратора
Я также попробовал сценарий, который написал Раф. У меня была версия 2.0, но она работала только с версией 4.0