Загрузка данных
#requires -version 2.0
<#
.SYNOPSIS
Проверка отключения сохранения паролей в браузерах.
.DESCRIPTION
Проверяет политики PasswordManagerEnabled для:
- Google Chrome
- Microsoft Edge
- Yandex Browser
Проверяются 64-bit и 32-bit ветки реестра.
Для каждого компьютера создается отдельный файл:
\\SERVER\Audit$\COMPUTERNAME.txt
Этот файл одновременно является маркером того,
что компьютер уже прошел проверку.
В общий файл:
\\SERVER\Audit$\Security-Audit-Summary.txt
записывается только:
COMPUTER01 - PASS
COMPUTER02 - FAIL
COMPUTER03 - PASS WITH WARNINGS
ВАЖНО:
Измените $ResultDirectory на нужный сетевой путь.
#>
# ============================================================
# CONFIGURATION
# ============================================================
# Общая директория для результатов
$ResultDirectory = "\\SERVER\Audit$"
# Общий файл со сводкой
$SummaryFile = Join-Path `
$ResultDirectory `
"Security-Audit-Summary.txt"
# Имя компьютера
$ComputerName = $env:COMPUTERNAME
# Файл-маркер и подробный отчет
$MarkerFile = Join-Path `
$ResultDirectory `
($ComputerName + ".txt")
# ============================================================
# INITIALIZATION
# ============================================================
$ErrorActionPreference = "SilentlyContinue"
# ============================================================
# MARKER CHECK
# ============================================================
# Если подробный файл уже существует,
# значит компьютер ранее был проверен.
#
# Повторно проверку не выполняем.
if (Test-Path $MarkerFile) {
Write-Host ""
Write-Host "============================================================"
Write-Host "BROWSER PASSWORD POLICY AUDIT"
Write-Host "============================================================"
Write-Host ""
Write-Host "Computer: $ComputerName"
Write-Host ""
Write-Host "Audit already completed."
Write-Host "Marker file:"
Write-Host $MarkerFile
Write-Host ""
Write-Host "No action required."
Write-Host "============================================================"
exit 0
}
# ============================================================
# VARIABLES
# ============================================================
$Results = New-Object System.Collections.ArrayList
$FailCount = 0
$WarnCount = 0
$PassCount = 0
# ============================================================
# FUNCTIONS
# ============================================================
function Add-Result {
param(
[string]$Status,
[string]$Name,
[string]$Details
)
$Line = "[{0}] {1}: {2}" -f `
$Status, `
$Name, `
$Details
[void]$Results.Add($Line)
switch ($Status) {
"PASS" {
$script:PassCount++
}
"FAIL" {
$script:FailCount++
}
"WARN" {
$script:WarnCount++
}
}
}
function Add-Section {
param(
[string]$Title
)
$Separator = ""
$Separator = $Separator.PadLeft(60, "-")
[void]$Results.Add("")
[void]$Results.Add($Separator)
[void]$Results.Add($Title)
[void]$Results.Add($Separator)
}
function Get-RegistryValueSafe {
param(
[string]$Path,
[string]$Name
)
try {
$Property = Get-ItemProperty `
-Path $Path `
-Name $Name `
-ErrorAction Stop
return $Property.$Name
}
catch {
return $null
}
}
function Test-PasswordManagerPolicy {
param(
[string]$Browser,
[string]$Path,
[string]$Architecture
)
$Value = Get-RegistryValueSafe `
-Path $Path `
-Name "PasswordManagerEnabled"
if ($null -eq $Value) {
Add-Result `
-Status "FAIL" `
-Name "$Browser $Architecture" `
-Details "PasswordManagerEnabled отсутствует. Политика отключения сохранения паролей не задана."
}
elseif ([int]$Value -eq 0) {
Add-Result `
-Status "PASS" `
-Name "$Browser $Architecture" `
-Details "PasswordManagerEnabled = 0. Сохранение паролей отключено."
}
else {
Add-Result `
-Status "FAIL" `
-Name "$Browser $Architecture" `
-Details "PasswordManagerEnabled = $Value. Сохранение паролей НЕ отключено."
}
}
# ============================================================
# SYSTEM INFORMATION
# ============================================================
$OS = Get-WmiObject Win32_OperatingSystem
$ComputerSystem = Get-WmiObject Win32_ComputerSystem
$DateTime = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
$OSCaption = $OS.Caption
$OSVersion = $OS.Version
$OSBuild = $OS.BuildNumber
$Domain = $ComputerSystem.Domain
$CurrentUser = `
$env:USERDOMAIN + "\" + $env:USERNAME
# Определяем разрядность ОС
$OSArchitecture = $OS.OSArchitecture
if ([string]::IsNullOrEmpty($OSArchitecture)) {
if ([IntPtr]::Size -eq 8) {
$OSArchitecture = "64-bit"
}
else {
$OSArchitecture = "32-bit"
}
}
# ============================================================
# REPORT HEADER
# ============================================================
[void]$Results.Add(
"============================================================"
)
[void]$Results.Add(
"BROWSER PASSWORD POLICY AUDIT"
)
[void]$Results.Add(
"============================================================"
)
[void]$Results.Add("")
[void]$Results.Add("Computer : $ComputerName")
[void]$Results.Add("Domain : $Domain")
[void]$Results.Add("OS : $OSCaption")
[void]$Results.Add("Version : $OSVersion")
[void]$Results.Add("Build : $OSBuild")
[void]$Results.Add("Architecture : $OSArchitecture")
[void]$Results.Add("User : $CurrentUser")
[void]$Results.Add("Date : $DateTime")
# ============================================================
# 1. GOOGLE CHROME
# ============================================================
Add-Section "1. GOOGLE CHROME"
# 64-bit
$Chrome64 = `
"HKLM:\SOFTWARE\Policies\Google\Chrome"
# 32-bit
$Chrome32 = `
"HKLM:\SOFTWARE\WOW6432Node\Policies\Google\Chrome"
if ($OSArchitecture -eq "32-bit") {
# На 32-bit ОС отдельная WOW6432Node ветка
# не используется.
Test-PasswordManagerPolicy `
-Browser "Google Chrome" `
-Path $Chrome64 `
-Architecture "32-bit/OS"
}
else {
Test-PasswordManagerPolicy `
-Browser "Google Chrome" `
-Path $Chrome64 `
-Architecture "64-bit"
Test-PasswordManagerPolicy `
-Browser "Google Chrome" `
-Path $Chrome32 `
-Architecture "32-bit"
}
# ============================================================
# 2. MICROSOFT EDGE
# ============================================================
Add-Section "2. MICROSOFT EDGE"
# 64-bit
$Edge64 = `
"HKLM:\SOFTWARE\Policies\Microsoft\Edge"
# 32-bit
$Edge32 = `
"HKLM:\SOFTWARE\WOW6432Node\Policies\Microsoft\Edge"
if ($OSArchitecture -eq "32-bit") {
Test-PasswordManagerPolicy `
-Browser "Microsoft Edge" `
-Path $Edge64 `
-Architecture "32-bit/OS"
}
else {
Test-PasswordManagerPolicy `
-Browser "Microsoft Edge" `
-Path $Edge64 `
-Architecture "64-bit"
Test-PasswordManagerPolicy `
-Browser "Microsoft Edge" `
-Path $Edge32 `
-Architecture "32-bit"
}
# ============================================================
# 3. YANDEX BROWSER
# ============================================================
Add-Section "3. YANDEX BROWSER"
# 64-bit
$Yandex64 = `
"HKLM:\SOFTWARE\Policies\Yandex\Browser"
# 32-bit
$Yandex32 = `
"HKLM:\SOFTWARE\WOW6432Node\Policies\Yandex\Browser"
if ($OSArchitecture -eq "32-bit") {
Test-PasswordManagerPolicy `
-Browser "Yandex Browser" `
-Path $Yandex64 `
-Architecture "32-bit/OS"
}
else {
Test-PasswordManagerPolicy `
-Browser "Yandex Browser" `
-Path $Yandex64 `
-Architecture "64-bit"
Test-PasswordManagerPolicy `
-Browser "Yandex Browser" `
-Path $Yandex32 `
-Architecture "32-bit"
}
# ============================================================
# FINAL RESULT
# ============================================================
Add-Section "FINAL RESULT"
[void]$Results.Add("PASS : $PassCount")
[void]$Results.Add("WARN : $WarnCount")
[void]$Results.Add("FAIL : $FailCount")
[void]$Results.Add("")
# Определяем общий статус компьютера
if ($FailCount -eq 0 -and $WarnCount -eq 0) {
$OverallStatus = "PASS"
[void]$Results.Add(
"RESULT: PASS"
)
[void]$Results.Add(
"Во всех проверенных политиках сохранение паролей отключено."
)
}
elseif ($FailCount -eq 0) {
$OverallStatus = "PASS WITH WARNINGS"
[void]$Results.Add(
"RESULT: PASS WITH WARNINGS"
)
[void]$Results.Add(
"Критических нарушений не обнаружено, но присутствуют предупреждения."
)
}
else {
$OverallStatus = "FAIL"
[void]$Results.Add(
"RESULT: FAIL"
)
[void]$Results.Add(
"Обнаружены браузеры, в которых политика отключения сохранения паролей не установлена или имеет неправильное значение."
)
}
# ============================================================
# PREPARE OUTPUT
# ============================================================
$Header = ""
$Header = $Header.PadLeft(70, "=")
$Output = New-Object System.Collections.ArrayList
[void]$Output.Add("")
[void]$Output.Add($Header)
[void]$Output.Add("COMPUTER: $ComputerName")
[void]$Output.Add("DATE: $DateTime")
[void]$Output.Add($Header)
foreach ($Line in $Results) {
[void]$Output.Add($Line)
}
[void]$Output.Add($Header)
[void]$Output.Add("END OF AUDIT: $ComputerName")
[void]$Output.Add($Header)
[void]$Output.Add("")
# ============================================================
# WRITE DETAILED RESULT / MARKER
# ============================================================
try {
# Этот файл одновременно является:
#
# 1. Подробным отчетом
# 2. Маркером успешного выполнения проверки
$Output | Out-File `
-FilePath $MarkerFile `
-Encoding UTF8 `
-Force
}
catch {
# Если сеть недоступна,
# локальный файл НЕ считается маркером.
$LocalLogDirectory = `
"C:\ProgramData\DomainSecurityAudit"
if (-not (Test-Path $LocalLogDirectory)) {
New-Item `
-Path $LocalLogDirectory `
-ItemType Directory `
-Force | Out-Null
}
$LocalResult = Join-Path `
$LocalLogDirectory `
($ComputerName + ".txt")
$Output | Out-File `
-FilePath $LocalResult `
-Encoding UTF8 `
-Force
}
# ============================================================
# WRITE SUMMARY
# ============================================================
try {
$SummaryLine = "{0} - {1}" -f `
$ComputerName, `
$OverallStatus
Add-Content `
-Path $SummaryFile `
-Value $SummaryLine `
-Encoding UTF8
}
catch {
# Если Summary недоступен,
# подробный отчет все равно уже сохранен.
}
# ============================================================
# CONSOLE OUTPUT
# ============================================================
Write-Host ""
Write-Host "============================================================"
Write-Host "BROWSER PASSWORD POLICY AUDIT"
Write-Host "============================================================"
Write-Host ""
foreach ($Line in $Results) {
Write-Host $Line
}
Write-Host ""
Write-Host "============================================================"
Write-Host "Computer result:"
Write-Host $MarkerFile
Write-Host ""
Write-Host "Overall status:"
Write-Host $OverallStatus
Write-Host "============================================================"