Бувала у вас ситуація: користувач не може залогінитись, скидання пароля не дає жодного результату, ви дивитесь на логін у Active Directory — все написано ідеально, жодного зайвого символу чи пробілу, копіюєте його для входу — система вперто видає помилку автентифікації?
Після години дебагу, перевірки блокувань і вивчення логів виявляється причина: гомогліфи.
Хтось під час створення облікового запису (або при копіюванні даних із заявки від HR чи з робочого чату) ввів кириличну літеру замість латинської. Наше око бачить звичні літери на кшталт a, c, e, o, p чи x, але для домену та протоколів Kerberos/NTLM латинська a (Unicode U+0061) і кирилична а (Unicode U+0430) — це абсолютно різні речі.
Щоб не перебирати логін посимвольно вручну і не сидіти з лупою біля монітора, можна за пару секунд локалізувати диверсанта за допомогою PowerShell. Нижче два скрипти: перший для швидкої перевірки будь-якого підозрілого рядка (вкаже точний порядковий номер літери), другий — для автоматичної перевірки обліковки прямо з AD.
Варіант 1. Швидка перевірка будь-якого рядка
Цю функцію можна виконати в консолі PowerShell і просто передати їй підозрілий логін:
function Test-Cyrillic {
param (
[Parameter(Mandatory = $true)]
[string]$Text
)
$found = @()
for ($i = 0; $i -lt $Text.Length; $i++) {
$char = $Text[$i]
# Перевірка на кирилицю (включно з додатковими блоками Cyrillic Supplement)
if ($char -match '[\p{IsCyrillic}\p{IsCyrillicSupplement}]') {
$found += [PSCustomObject]@{
"Позиція (№)" = $i + 1
"Символ" = $char
"Unicode код" = ('U+{0:X4}' -f [int][char]$char)
}
}
}
if ($found.Count -gt 0) {
Write-Host "`nУВАГА! Знайдено кирилицю у рядку: `"$Text`"" -ForegroundColor Red
$found | Format-Table -AutoSize
} else {
Write-Host "`nВсе чисто: у рядку `"$Text`" кирилиці не виявлено." -ForegroundColor Green
}
}
Приклад виклику:
# У цьому прикладі перша "а" — латинська, а друга "а" — кирилична:
Test-Cyrillic "ivan.petrovа"
Результат буде таким:
Text
УВАГА! Знайдено кирилицю у рядку: "ivan.petrovа"
Позиція (№) Символ Unicode код
12 а U+0430
(Код U+0430 — це кирилична мала «а», тоді як латинська мала «a» має код U+0061).
Варіант 2. Перевірка користувача напряму з Active Directory
Якщо треба перевірити конкретного користувача в AD за його атрибутами (sAMAccountName, UserPrincipalName, mail тощо):
Import-Module ActiveDirectory
$Identity = "ivan.petrov" # Тут вкажіть SamAccountName або UPN
$user = Get-ADUser -Identity $Identity -Properties sAMAccountName, UserPrincipalName, DisplayName, mail
$attributesToCheck = @('sAMAccountName', 'UserPrincipalName', 'DisplayName', 'mail')
foreach ($attr in $attributesToCheck) {
$val = $user.$attr
if ([string]::IsNullOrEmpty($val)) { continue }
$found = @()
for ($i = 0; $i -lt $val.Length; $i++) {
if ($val[$i] -match '[\p{IsCyrillic}\p{IsCyrillicSupplement}]') {
$found += [PSCustomObject]@{
"Позиція" = $i + 1
"Символ" = $val[$i]
"Unicode" = ('U+{0:X4}' -f [int][char]$val[$i])
}
}
}
if ($found.Count -gt 0) {
Write-Host "`n[!] Кирилиця в атрибуті $attr ($val):" -ForegroundColor Red
$found | Format-Table -AutoSize
} else {
Write-Host "[OK] $attr : чистий" -ForegroundColor Green
}
}

No comments:
Post a Comment
А что вы думаете по этому поводу?