Как добавить нескольких пользователей Windows 11, имена которых содержат умляуты (Ä, Ö, Å и т. д.), в группы, названия которых также содержат умляуты, с помощью скрипта PowerShell PS1?

Вопрос или проблема

Как добавить несколько пользователей Windows 11 с умляутами (Ä, Ö, Å и т.д.) в группы с умляутами с помощью скрипта PS1 PowerShell?

Потребовалось время, чтобы действительно проверить это.

Включает изображения и скрипты для финской версии Windows 11, потому что мы используем умляуты здесь, или “Ääkköset”. (Хотя я ненавижу неанглоязычное программное обеспечение или связанные с компьютерами конвенции, но это не относится к делу)

  1. Самое важное: Скачайте просто последнюю версию PowerShell из Microsoft Store. НЕ используйте Windows PowerShell, который поставляется с Windows 11, он устарел и не работает с умляутами (я пробовал, не работает, умляуты искажаются, как Käyttäjät превращается в Käyttäjät, раздражает).

    Скачивание обычного PowerShell вместо использования (неработающего для умляутов) Windows PowerShell

  2. Вот немного материала, чтобы начать. Что важно в скриптах PS1, это термин “Käyttäjät”. Что по-фински означает пользователи или обычные пользователи. Я уверен, что если вы замените его на термин, который используется в вашей локализованной версии Windows 11, то все будет в порядке. Пожалуйста, модераторы и эксперты SuperUser, не редактируйте скрипты путем их укорочения или удаления – я вернусь к этим, если они мне снова понадобятся. Хотя это сообщение уже довольно длинное.

    Создание пользователей для Windows 11 с помощью скрипта


Company_Personnel_Data_With_Umlauts.csv

GroupName;UserName;Password
Tuotanto;Anni Koskinen;Asennus1
Tuotanto;Kalle Nurmi;Asennus1
Myynti;Matti Saarinen;Asennus1
Tuotanto;Helena Koskinen;Asennus1
Hallinto;Seppo Saarinen;Asennus1
Hallinto;Tiina Mäkinen;Asennus1
Myynti;Pekka Niemi;Asennus1
Varasto;Kaisa Mäkinen;Asennus1
Ulkoiset;Anni Ahonen;Asennus1
Harjoittelijat;Tuomas Ahonen;Asennus1
Harjoittelijat;Pekka Heinonen;Asennus1
Myynti;Juhani Niemi;Asennus1
Hallinto;Pekka Lehtonen;Asennус1
Hallinto;Harri Saarinen;Asennус1
Myyntи;Tuomas Virtanen;Asennус1
Myyntи;Pekka Savolainen;Asennус1
Tuotanto;Timo Hämäläinen;Asennус1

Add_All_Users_And_Groups.ps1

# Определите путь к CSV файлу
$csvFile = "C:\Users\Asennus\Desktop\Company_Personnel_Data_With_Umlauts.csv"  # Замените фактическим путем к вашему файлу CSV

# Импорт данных о пользователях из CSV файла (укажите точку с запятой в качестве разделителя)
$users = Import-Csv -Path $csvFile -Delimiter ';'

# Следите за дубликатами, созданными группами и обработанными именами пользователей
$duplicateUsers = @()
$createdGroups = @()
$processedUsers = @()

# Убедитесь, что группа "Käyttäjät" существует
if (-not (Get-LocalGroup -Name "Käyttäjät" -ErrorAction SilentlyContinue)) {
    Write-Host "Создание группы: Käyttäjät"
    New-LocalGroup -Name "Käyttäjät" -Description "Группа пользователей по умолчанию"
    $createdGroups += "Käyttäjät"
}

# Проверка и создание групп из CSV при необходимости
foreach ($group in ($users.GroupName | Sort-Object -Unique)) {
    if (-not (Get-LocalGroup -Name $group -ErrorAction SilentlyContinue)) {
        Write-Host "Создание группы: $group"
        New-LocalGroup -Name $group -Description "Группа, созданная с помощью скрипта"
        $createdGroups += $group
    }
}

# Перебор каждого пользователя в файле CSV
foreach ($user in $users) {
    # Проверка, если имя пользователя уже обработано
    if ($processedUsers -contains $user.UserName) {
        $duplicateUsers += $user.UserName
        continue
    }

    # Пометить имя пользователя как обработанное
    $processedUsers += $user.UserName

    # Проверка, если пользователь уже существует
    $existingUser = Get-LocalUser -Name $user.UserName -ErrorAction SilentlyContinue
    if ($existingUser) {
        # Если пользователь существует, регистрируем его как дубликат и пропускаем создание
        $duplicateUsers += $user.UserName
    } else {
        # Создать пользователя
        New-LocalUser -Name $user.UserName -Password (ConvertTo-SecureString $user.Password -AsPlainText -Force) -FullName $user.UserName -Description "Пользователь, созданный с помощью скрипта"
    }

    # Добавить пользователя в группу "Käyttäjät", если он еще не является членом
    if (-not (Get-LocalGroupMember -Group "Käyttäjät" -Member $user.UserName -ErrorAction SilentlyContinue)) {
        Add-LocalGroupMember -Group "Käyttäjät" -Member $user.UserName -ErrorAction SilentlyContinue
    }

    # Удалить пользователя из всех других не-"Käyttäjät" групп
    $existingGroups = Get-LocalGroup | Where-Object {
        (Get-LocalGroupMember -Group $_.Name -ErrorAction SilentlyContinue | Where-Object { $_.Name -eq $user.UserName }) -and
        ($_.Name -ne "Käyttäjät")
    }

    foreach ($existingGroup in $existingGroups) {
        Remove-LocalGroupMember -Group $existingGroup.Name -Member $user.UserName -ErrorAction SilentlyContinue
    }

    # Добавить пользователя в указанную группу из CSV
    Add-LocalGroupMember -Group $user.GroupName -Member $user.UserName -ErrorAction SilentlyContinue
}

# Вывод резюме
Write-Host "`n--- Итоги скрипта ---"
if ($createdGroups.Count -gt 0) {
    Write-Host "Следующие группы были созданы:" -ForegroundColor Green
    $createdGroups | ForEach-Object { Write-Host "- $_" }
} else {
    Write-Host "Новые группы не были созданы." -ForegroundColor Yellow
}

if ($duplicateUsers.Count -gt 0) {
    Write-Host "`nСледующие дублирующиеся имена пользователей в CSV были пропущены (требуется ручная обработка):" -ForegroundColor Yellow
    $duplicateUsers | ForEach-Object { Write-Host "- $_" }
} else {
    Write-Host "`nДублирующихся имен пользователей в CSV не найдено." -ForegroundColor Green
}

Write-Host "`nВсе назначения успешно завершены!" -ForegroundColor Green

Remove_All_Those_Users_And_Groups_That_Were_Made_Via_Script.ps1

# Удалить пользователей с описанием "Пользователь, созданный с помощью скрипта"
Write-Host "Поиск пользователей с описанием 'Пользователь, созданный с помощью скрипта'..." -ForegroundColor Yellow
$localUsers = Get-LocalUser
$usersToRemove = $localUsers | Where-Object { $_.Description -eq "Пользователь, созданный с помощью скрипта" }

if ($usersToRemove.Count -gt 0) {
    Write-Host "Следующие пользователи будут удалены:" -ForegroundColor Yellow
    $usersToRemove | ForEach-Object { Write-Host "- $($_.Name)" }

    # Подтвердите удаление
    $userConfirmation = Read-Host "Введите 'YES', чтобы подтвердить удаление этих пользователей"
    if ($userConfirmation -eq "YES") {
        $usersToRemove | ForEach-Object {
            Write-Host "Удаление пользователя: $($_.Name)" -ForegroundColor Red
            Remove-LocalUser -Name $_.Name -ErrorAction SilentlyContinue
        }
        Write-Host "Все пользователи с описанием 'Пользователь, созданный с помощью скрипта' были удалены." -ForegroundColor Green
    } else {
        Write-Host "Операция отменена. Ни один пользователь не был удален." -ForegroundColor Cyan
    }
} else {
    Write-Host "Пользователей с описанием 'Пользователь, созданный с помощью скрипта' не найдено." -ForegroundColor Green
}

# Удаление групп с описанием "Группа, созданная с помощью скрипта"
Write-Host "`nПоиск групп с описанием 'Группа, созданная с помощью скрипта'..." -ForegroundColor Yellow
$localGroups = Get-LocalGroup
$groupsToRemove = $localGroups | Where-Object { $_.Description -eq "Группа, созданная с помощью скрипта" }

if ($groupsToRemove.Count -gt 0) {
    Write-Host "Следующие группы будут удалены:" -ForegroundColor Yellow
    $groupsToRemove | ForEach-Object { Write-Host "- $($_.Name)" }

    # Подтвердите удаление
    $groupConfirmation = Read-Host "Введите 'YES', чтобы подтвердить удаление этих групп"
    if ($groupConfirmation -eq "YES") {
        $groupsToRemove | ForEach-Object {
            Write-Host "Удаление группы: $($_.Name)" -ForegroundColor Red
            Remove-LocalGroup -Name $_.Name -ErrorAction SilentlyContinue
        }
        Write-Host "Все группы с описанием 'Группа, созданная с помощью скрипта' были удалены." -ForegroundColor Green
    } else {
        Write-Host "Операция отменена. Ни одна группа не была удалена." -ForegroundColor Cyan
    }
} else {
    Write-Host "Групп с описанием 'Группа, созданная с помощью скрипта' не найдено." -ForegroundColor Green
}

Ответ или решение

Для решения задачи создания и управления пользователями с умлаутами (например, Ä, Ö, Å) в Windows 11 через PowerShell, следует учитывать несколько важных моментов. Ваша цель – создать пользователей и группы, имена которых содержат специальные символы, и добавить пользователей в соответствующие группы.

Теория

Основные трудности при работе с PowerShell и названиями, содержащими умлауты, связаны с кодировкой. Стандартная Windows PowerShell может некорректно обрабатывать символы с умлаутами, и это может привести к искажениям. Чтобы избежать этого, рекомендуется использовать последнюю версию PowerShell, доступную в Microsoft Store. Эта версия обеспечивает лучшую поддержку Unicode, что особенно важно для работы с неанглийскими символами.

Важно убедиться, что PowerShell скрипт правильно обрабатывает CSV-файлы и поддерживает кодировку, способствующую корректной интерпретации специальных символов.

Пример

Начнем с CSV-файла (Company_Personnel_Data_With_Umlauts.csv), который содержит информацию о пользователях и группах. Пример CSV-файла может выгляеть так:

GroupName;UserName;Password
Tuotanto;Anni Koskinen;Asennus1
Tuotanto;Kalle Nurmi;Asennus1
Myynti;Matti Saarinen;Asennus1
...

Код PowerShell для создания этих пользователей и групп:

# Указываем путь к CSV-файлу
$csvFile = "C:\Users\Asennus\Desktop\Company_Personnel_Data_With_Umlauts.csv"

# Импорт данных из CSV
$users = Import-Csv -Path $csvFile -Delimiter ';'

# Массивы для отслеживания дубликатов и созданных групп
$duplicateUsers = @()
$createdGroups = @()

# Убедитесь, что группа "Käyttäjät" существует
if (-not (Get-LocalGroup -Name "Käyttäjät" -ErrorAction SilentlyContinue)) {
    New-LocalGroup -Name "Käyttäjät" -Description "Default user group"
    $createdGroups += "Käyttäjät"
}

# Проверка и создание групп
foreach ($group in ($users.GroupName | Sort-Object -Unique)) {
    if (-not (Get-LocalGroup -Name $group -ErrorAction SilentlyContinue)) {
        New-LocalGroup -Name $group -Description "Group created via script"
        $createdGroups += $group
    }
}

# Цикл по каждому пользователю в CSV
foreach ($user in $users) {
    if ($duplicateUsers -contains $user.UserName) {
        continue
    }

    $existingUser = Get-LocalUser -Name $user.UserName -ErrorAction SilentlyContinue
    if ($existingUser) {
        $duplicateUsers += $user.UserName
    } else {
        New-LocalUser -Name $user.UserName -Password (ConvertTo-SecureString $user.Password -AsPlainText -Force) -FullName $user.UserName -Description "User created via script"
    }

    if (-not (Get-LocalGroupMember -Group "Käyttäjät" -Member $user.UserName -ErrorAction SilentlyContinue)) {
        Add-LocalGroupMember -Group "Käyttäjät" -Member $user.UserName -ErrorAction SilentlyContinue
    }

    $existingGroups = Get-LocalGroup | Where-Object {
        (Get-LocalGroupMember -Group $_.Name -ErrorAction SilentlyContinue | Where-Object { $_.Name -eq $user.UserName }) -and
        ($_.Name -ne "Käyttäjät")
    }

    foreach ($existingGroup in $existingGroups) {
        Remove-LocalGroupMember -Group $existingGroup.Name -Member $user.UserName -ErrorAction SilentlyContinue
    }

    Add-LocalGroupMember -Group $user.GroupName -Member $user.UserName -ErrorAction SilentlyContinue
}

# Вывод итогов
Write-Host "`n--- Итог работы скрипта ---"
if ($createdGroups.Count -gt 0) {
    Write-Host "Созданы следующие группы:" -ForegroundColor Green
    $createdGroups | ForEach-Object { Write-Host "- $_" }
} else {
    Write-Host "Новые группы не были созданы." -ForegroundColor Yellow
}

if ($duplicateUsers.Count -gt 0) {
    Write-Host "`nПропущенные дублирующиеся имена пользователей в CSV (требуется ручная обработка):" -ForegroundColor Yellow
    $duplicateUsers | ForEach-Object { Write-Host "- $_" }
} else {
    Write-Host "`nВ CSV нет дублирующихся имен пользователей." -ForegroundColor Green
}

Write-Host "`nВсе назначения выполнены успешно!" -ForegroundColor Green

Применение

Этот скрипт позволит вам автоматизировать процесс создания учетных записей пользователей и групп в Windows 11, учитывая наличие специальных символов в именах. Это особенно полезно в многоязычных организациях, где такие символы являются частью повседневной лексики.

Для успешного выполнения скрипта необходимо обратить внимание на следующие моменты:

  1. Использование новой версии PowerShell: Убедитесь, что вы используете последнюю версию PowerShell из Microsoft Store, так как она лучше поддерживает работу с умлаутами и символами Unicode.

  2. Корректная кодировка CSV-файлов: Убедитесь, что CSV-файл сохраняется в формате, поддерживающем UTF-8 для корректного отображения специальных символов.

  3. Толерантность к дубликатам и ошибкам: Скрипт учитывает наличие дубликатов пользователей и выводит их список для дальнейшей ручной обработки, что предотвращает возникновение ошибок при создании пользователей.

  4. Удаление пользователей и групп: Для удаления созданных пользователей и групп воспользуйтесь отдельным скриптом Remove_All_Those_Users_And_Groups_That_Were_Made_Via_Script.ps1, обеспечивая тем самым чистоту и порядок в системе.

Уделяя внимание этим аспектам, вы сможете эффективно управлять пользователями в системе Windows 11, не испытывая проблем с кодировкой.

Оцените материал
Добавить комментарий

Капча загружается...