По умолчанию при создании пользователя в AD он автоматически добавляется в группу Domain Users. Группа Domain Users в свою очередь по умолчанию добавляется в локальную группу Users на компьютере при добавлении его в домен AD. Это означает что любой пользователь домена может войти на любой компьютер в сети. В этой статье мы рассмотрим основные способы ограничения возможности входа пользователей на компьютеры домена.
Разрешаем вход только на определенные компьютеры в свойствах пользователя AD
В небольших доменах вы можете в свойствах каждого пользователя в AD ограничить возможность входа под его учетной на компьютеры домена. Например, вы хотите, чтобы конкретный пользователь мог входить только на свой компьютер. Для этого:
- Запустите оснастку ADUC (Active Directory Users and Computers), выполнив команду dsa.msc.
- С помощью поиска найдите учетную запись пользователя, которому нужно разрешить вход только на определённые компьютеры и откройте его свойства.
- Перейдите на вкладку Account и нажмите кнопку Log On To.
- Как вы видите, пользователю разрешено входить на все компьютеры (The user can log on to: All computer). Чтобы разрешить пользователю доступ на определенные компьютеры, выберите опцию The following computers и добавьте в список имена компьютеров, но которые ему разрешено логиниться. Примечание. Нужно указывать полное NetBIOS или DNS имя компьютера (знаки подстановки использовать нельзя), параметр регистронезависимый.
- Количество компьютеров, которые можно добавить в этот список ограничено 64. При попытке добавить 65 компьютер появится сообщение об ошибке: This property is limited to 64 values. You must remove some of the existing values before you can add new ones.
- Сохраните изменения. Теперь пользователь может входить только на указанные компьютеры.
Изменяем атрибут LogonWorkstations с помощью PowerShell
Вручную ограничивать вход пользователей на компьютеры домена довольно утомительно. С помощью PowerShell можно автоматизировать это действия. Список компьютеров, на которые разрешено входить пользователю хранится в атрибуте пользователя в AD – LogonWorkstations. Например, наша задача разрешить определенному пользователю входить только на компьютеры, чьи имена содержатся в текстовом файле computers.csv
Скрипт может выглядеть так (сначала загружаем модуль AD для Powershell):
Import-Module ActiveDirectory
$ADusername = ‘aapetrov’
$complist = Import-Csv -Path "C:\PS\computers.csv" | ForEach-Object {$_.NetBIOSName}
$comparray = $complist -join ","
Set-ADUser -Identity $ADusername -LogonWorkstations $comparray
Clear-Variable comparray
С помощью следующей команды можно вывести список компьютеров, на которые разрешено входить пользователю можно с помощью командлета Get-ADUser.
Get-ADUser $ADusername -Properties LogonWorkstations | Format-List Name, LogonWorkstations
Либо можно посмотреть список компьютеров в консоли ADUC.
Чтобы добавить в список новый компьютер, воспользуйтесь такой командой:
$Wks = (Get-ADUser dvivannikov -Properties LogonWorkstations).LogonWorkstations
$Wks += ",newpc"
Set-ADUser aapetrov -LogonWorkstations $Wks
Ограничиваем вход на компьютеры с помощью GPO
В больших доменах использовать свойство пользователя LogonWorkstations для ограничения доступ пользователей к компьютерам нецелесообразно из-за ограничений и недостаточной гибкости. Как правило, чтобы запретить пользователям входить на некоторые ПК? используют групповые политики.
Можно ограничить список пользователей в локальной группе Users с помощью политики Restricted Groups (Windows Settings -> Security Settings), но мы рассмотрим другой вариант.
Есть две групповые политики, которые находятся в разделе Computer Configuration -> Policies -> Security Settings -> Local Policies -> User Rights Assignment (Конфигурация пользователя -> Политики -> Параметры безопасности -> Локальные политики -> Назначение прав пользователя):
- Deny log on locally (Запретить локальный вход) – позволяет запретить локальный вход на компьютеры для определенных пользователей или групп. ;
- Allow log on locally (Локальный вход в систему) – содержит список пользователей и групп, которым разрешено входить на компьютер локально.
Например, чтобы запретить пользователям определенной группы входить на компьютеры в некой OU, вы можете создать отдельную группу пользователей, добавить ее в политику Deny log on locally и назначить ее на OU с компьютерами, доступ к которым вы хотите ограничить.
В больших доменах можно использовать комбинацию этих политик. Например, вы хотите запретить пользователям входить на компьютеры других OU.
Для этого в каждой OU нужно создать группу безопасности, куда нужно включить всех пользователей OU.
Import-module ActiveDirectory
$rootOU = “OU= Users,OU=MSK,DC=winitpro,DC=ru”
$group = “corp\msk-users”
Get-ADUser -SearchBase $rootOu -Filter * | ForEach-Object {Add-ADGroupMember -Identity $group -Members $_ }
Затем нужно включить политику Allow log on locally, добавить в нее эту группу (+ различные администраторские группы: Domain Admins, администраторы рабочих станций и прочее) и назначить политику на OU с компьютерами. Таким образом вы разрешите только пользователям конкретного OU входить на компьютеры.
При попытке входа пользователя, которому не разрешен локальный вход, появится окно с предупреждением:
Или
Несколько важных моментов касательно данных политик:
- Не стоит применять данные политики, для ограничения доступа к серверам и тем более к контроллерам домена.Как разрешить обычным пользователям RDP доступ к DC.
- Не включаете эти политики через стандартные GPO: Default Domain Policy или Default Domain Controllers Policy.
- Запрещающая политика имеет больший приоритет.
- Не забывайте про сервисные учетные записи(в том числе gMSA), которые могут использоваться для запуска служб на компьютерах.
- Не стоит применить политики, ограничивающие локальный вход на весь домен. Назначайте их на конкретные OU.
Спасибо за статью
Спасибо за публикации. всегда нахожу что-то полезное для себя
Здравствуйте! Есть задача, после работы выключить компьютер и блокировать доменные учётные записи. Задача выполнено через GPO и Время входа. Но пользователей после работы обратно включает компьютер и отключают сетевые подключения и авторизуется со своими учетными записями к компьютеру и обратно включает сетевое подключение. Как с этим бороться?
Через GPO разместить на всех компах локальное задание планировщика. Время запуска с 18:00 до 09:00 каждые 5 минут — выполнить команду выключения компьютера.
Как поставить «галочку» доступа на все компьютеры?
Не понял вопроса. Сбросить галку на одном компьютере или изменить настройки на всех ПК в домене?
Добрый день.
После настройки ограничения по входу на ПК, у пользователя пропадает возможность подключаться по RDGW. В списке разрешенных, указаны ПК и сервер RDGW. Подскажите пожалуйста, можно ли решить эту проблему ?
Приветствую,
а если пользователей много, а не один?
выгрузил SamAccountName в *.csv как его теперь правильно подставить в ваш код?
Можно загрузить список пользователей из текстового файл:
$complist = Import-Csv -Path "C:\PS\computers.csv" | ForEach-Object {$_.NetBIOSName}
$comparray = $complist -join ","
$Users = gc "c:\PS\Users.txt"
foreach ($User in $Users) {
Set-ADUser -Identity $User -LogonWorkstations $comparray
}
Код не проверял — но по логике как-то так. Т.е. получаем список пользователей из файла, а потом для каждого пользователя добавляем список разрешенных компьютеров (в этом примере подразумевается, что список компов один)
Работает!
Спасибо!
Добрый день! Статический список работает — спасибо
Но у меня задача следующая: мне нужно из csv файла вида user,pc1,pc2,pc3 указать каким пользователям какие пк доступны для входа — у всех пользователей свой набор пк для входа. Как такое реализовать?
Import-Module ActiveDirectory
Import-CSV C:\temp3\pclist2aa.csv | % {
$UserN = $_.SamAccountName
$ComputerN1 = $_.LogonWorkstations1
$ComputerN2 = $_.LogonWorkstations2
$ComputerN3 = $_.LogonWorkstations3
$ObjFilter = "(&(objectCategory=person)(objectCategory=User)(samaccountname=$UserN))"
$objSearch = New-Object System.DirectoryServices.DirectorySearcher
$objSearch.PageSize = 15000
$objSearch.Filter = $ObjFilter
$objSearch.SearchRoot = "LDAP://dc=test,dc=company,dc=com"
$AllObj = $objSearch.findOne()
$user = [ADSI] $AllObj.path
$ErrorActionPreference = "silentlycontinue"
If (($user.get("userWorkstations")) -ne $null)
{$ComputerN = $user.get("userWorkstations")+","+ $ComputerN1 +","+ $ComputerN2 +","+ $ComputerN3}
Write-host -NoNewLine "Updating $UserN Properties ..."
$user.psbase.invokeSet("userWorkstations",$ComputerN)
Write-host "Done!"
$user.setinfo()
}
Этот пример не сработал почему-то
У вас скрипт на правку атрибутов через LDAP. В статье я предлагаю использовать модуль AD PowerShell. Это несколько проще.
Все верно список статический. А что вы подразумеваете под динамическим?
Навскидку, если у вас всего 3 компа в строке можно сделать так:
Import-Csv C:\temp3\pclist2aa.csv| foreach {Set-ADUser -Identity $_.SamAccountName -LogonWorkstations '$_.ComputerN1 + "," + $_.ComputerN2+ "," + $_.ComputerN3'}
Добрый день. Мне нужно применить GPO на OU, в которой хранятся компьютеры, но для конкретных пользователей. При этом данные пользователи размещены в другом OU. Можно ли это реализовать, создав политику и с настройками для пользователей, применить ее к OU с компьютерами и OU с пользователями и включив loopback? Заранее спасибо за ответ
Все верно — политику нужно применить к OU компьютерам и использовать Loopback Policy Processing