Главная > Powershell > Создание локального пользователя через Powershell

Создание локального пользователя через Powershell

Недавно прочёл хорошую статью, в которой пошагово рассматривался процесс создания локальной (не доменной) учётной записи администратора на компьютере. Пока читал вспомнил, что давно хотел написать скрипт, который будет создавать скрытую учётку админа для удалённого администрирования, всё не хватало волшебного пендаля стимула. Так что сегодня будем учиться создавать локальных пользователей на компьютере. А чтобы было ещё веселее, будем создавать локального пользователя на удалённом компьютере.

Я уже кода-то рассматривал вопрос работы с локальными учётными записями через Powershell. С тех пор выходили новые версии Powershell, .NET Framework, Windows, а удобных инструментов для работы с пользователями похоже так и не появилось (не считая DSC). Поэтому придётся работать через неудобный ADSI.

В указанной выше статье рассматривается создание учётной записи локального администратора. Взяв за основу тот пример я пошёл чуть дальше – в моём скрипте можно указать в какой группе будет создаваемый пользователь, а также можно создавать пользователей на удалённом компьютере (естественно при наличии соответствующих прав).

Итак, скрипт имеет несколько параметров:

  • Имя компьютера, с которым будем работать
  • Имя создаваемого пользователя
  • Группа, в которую этот пользователь будет входить
  • Описание пользователя
  • Пароль пользователя
  • Переключать, указывающий нужно-ли скрывать создаваемого пользователя с экрана приветствия

Первые четыре параметра имеют значения по умолчанию, которые можно изменить. С паролем можно было поступить по разному, например, забить его точно также в тело скрипта (что не есть безопасно), или задать случайный. В данном примере для простоты пароль будет вводиться с клавиатуры (тоже не безопасно, но всё-же лучше, чем хранить в открытом виде в теле скрипта). Последний параметр – простой переключатель, отвечающий на вопрос нужно-ли будет скрывать пользователя с экрана приветствия (если указан – нужно, если нет – соответственно не нужно).

param
(
    # Имя компьютера
    [string]$ComputerName = $Env:COMPUTERNAME,
    
    # Имя пользователя
    [string]$UserName = 'ServiceAccount',
    
    # Группа
    [string]$GroupName = 'Администраторы',
    
    # Описание
    [string]$Description = 'Автоматически созданная учётная запись',

    # Пароль
    [Parameter(Mandatory=$true)]
    [string]$Password,
    
    # Нужно-ли скрывать пользователя
    [switch]$HideUser
)

Я пропущу несколько моментов не имеющих отношения к делу, вроде проверки доступности компьютера и т.д.

При желании/необходимости можно убедиться, что создаваемого пользователя ещё нет. Для этого можно использовать метод Exists():

# Проверка существует-ли пользователь
if ([ADSI]::Exists("WinNT://$ComputerName/$UserName"))
{
    Write-Warning "$UserName на $ComputerName уже существует"
    break
}

А также убедиться в том, что имя группы задано корректно, и такая группа есть на компьютере (аналогичным образом):

# Проверка существует-ли группа
if (-not [ADSI]::Exists("WinNT://$ComputerName/$GroupName"))
{
    Write-Warning "Группа $GroupName на $ComputerName не найдена"
    break
}

Получаем объект компьютера:

$Computer = [ADSI]"WinNT://$ComputerName,computer"

Заполняем атрибуты пользователя:

# Создаём пользователя
$User = $Computer.Create('User', $UserName)

# Устанавливаем пароль пользователя
$User.SetPassword($Password)

# Добавляем описание пользователя
$User.Put('Description',$Description)

Сейчас, у нас всё готово для того, чтобы создать пользователя, но сам пользователь фактически ещё не создан, результат всех наших манипуляция хранится в оперативной памяти. Для того, чтобы создать-таки наконец пользователя и перенести изменения из оперативной памяти в постоянную нужно вызвать метод SetInfo():

# Записываем информацию
$User.SetInfo()

Устанавливаем срок действия пароля – не ограничен. Поначалу думал, что установка свойства PasswordExpired в 0 даст нужный эффект, тем более, что у существующих пользователей с неограниченным сроком действия пароля это свойство установлено в 0, однако на практике оказалось, что это ни фига не работает. Поигравшись определил, что если PasswordExpired установить в 1, то это равносильно установке галочки "Потребовать смену пароля при следующем входе в систему".

Поэтому для неограниченного срока действия пароля поступил как в исходной статье:

# Задаём срок действия пароля - не ограничен
$User.UserFlags.Value = $User.UserFlags.Value -bor 0x10000
$User.CommitChanges()

Добавляем пользователя в группу:

# Добавляем пользователя в группу
$Group = [ADSI]"WinNT://$ComputerName/$GroupName, group"
$Group.Add("WinNT://$UserName, user")

Также не помешает добавить обработку ошибок на случай если пользователь от имени которого мы пытаемся создать пользователя не имеет таких прав, или, например, пароль не соответствует настройкам политик безопасности. Для этих целей хорошо подойдёт конструкция try… catch.

Осталось спрятать пользователя (при выборе соответствующего параметра), но об этом поговорим в другой раз.

Рубрики:Powershell Метки: ,
  1. Комментариев нет.
  1. No trackbacks yet.

Оставьте комментарий