Когда вы создаёте нового пользователя в Active Directory, он автоматически добавляется в группу Domain Users. Группа Domain Users в свою очередь по умолчанию добавляется в локальную группу Users на компьютере при добавлении его в домен AD. Это означает что любой пользователь домена может войти на любой компьютер в вашей сети. В этой статье мы рассмотрим, как ограничить вход пользователей на компьютеры домена и ограничить разрешенное время входа.
Разрешить вход на определенные компьютеры в свойствах пользователя AD
В свойствах (атрибутах) учетной записи пользователя Active Directory можно задать список компьютеров, на которые ему разрешено входить. Например, вы хотите, чтобы определенный пользователь мог войти только на свой компьютер. Для этого:
- Запустите оснастку 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.
- Сохраните изменения. Теперь пользователь может входить только на указанные компьютеры.
dsac.msc
) и с помощью PowerShell вы можете разрешить пользователю входить более чем на 65 компьютер. Однако максимальное значение ограничивается типом данных атрибута Logon-Workstation в схема Active Directory (Octet String). В Windows Server 2016 + в этом атрибуте может содержаться до 8192 символов (в предыдущих версиях Windows Server 2003-2012 использовалось ограничение 1024 символов).Еще одна интересная особенность появляется, если вы ограничили пользователю список компьютеров разрешенных для входа с помощью атрибута LogonWorkstation.
При попытке подключится к удаленному компьютеру (RDS ферме) по RDP, вы можете получить ошибку:
The system administrator has limited the computers you can log on with.
Системный администратор ограничил количество компьютеров с которых вы можете войти в систему.
Для решения этой проблемы нужно добавить в список LogonWorkstation компьютер с которого (!!!) осуществляется RDP вход.
Изменяем атрибут LogonWorkstations с помощью PowerShell
Вручную заполнять список компьютеров, на которые разрешено входить пользователю домена довольно утомительно. С помощью PowerShell можно автоматизировать это действие. Список компьютеров, на которые разрешено входить пользователю хранится в атрибуте пользователя в AD – LogonWorkstations. Например, наша задача разрешить определенному пользователю входить только на компьютеры, чьи имена содержатся в текстовом файле computers.csv (в этом примере в первой строке файла должно содержаться имя столбца – NetBIOSName).
Скрипт может выглядеть так (сначала загружаем модуль 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
Ограничить часы входа пользователя в Active Directory
В свойствах учетной записи пользователя вы можете ограничить время входа учетной записи. Например, вы можете разрешить пользователю входить на компьютеры домена только в рабочие часы с 8:00 до 19:00.
- Для этого откройте свойства пользователя в оснастке ADUС, перейдите на вкладку и нажмите кнопку Logon Hours (Время входа);
- По умолчанию для пользователей не ограничено время входа в домена (все выделено синим);
- Выделите диапазоны времени, в которые вы хотите запретить вход пользователя и нажмите Logon Denied (цвет диапазонов, в которые запрещено логиниться пользователям изменится на белый).
Если вам нужно применить одинаковы ограничения Logon Hours для нескольких пользователей, проще всего использовать PowerShell. Сначала вручную настройте ограничения для одного пользователя, а затем используете значение его атрибута logonHours в качестве шаблона для других пользователей. Например, вы хотите ограничить время входа для группы удаленных пользователей:
$templateuser='a.khramov'
$templatehours= Get-ADUser -Identity $templateuser -properties logonHours
Get-ADGroupmember "msk-VPN_Users" |foreach {Set-ADUSer $_.samaccountname -Replace @{logonHours = $templatehours.logonHours} }
Если пользователь попытайся войти в компьютер за пределами разрешенных logonhours, он получит ошибку:
Account restrictions are preventing this user from signing in. For example: blank passwords aren't allowed, sign-in times are limited, or a policy restriction has been enforced.
В Windows нет встроенного функционала по принудительному завершению сессии пользователе, если его рабочее время закончено. Для гарантированного выполнения
logoff
можно создать простое задание планировщика и распространить его через GPO.
Также обратите внимание на два параметра GPO в разделе to Computer configurations -> Policies -> Windows Settings -> Security Settings -> Local Policies -> Security Options.
- Network security: Force logoff when logon hours expire
- Microsoft network server: Disconnect clients when logon hours expire
При включении этих политик SMB сервера будут отключать подключения пользователей, чьи часы работы просрочены.
Ограничить вход на компьютеры в Active Directory с помощью GPO
В больших доменах использовать свойство пользователя LogonWorkstations для ограничения доступа пользователей к компьютерам нецелесообразно из-за ограничений и недостаточной гибкости. Для более гибкого управления правилами запрета/разрешения входа на компьютеры используют групповые политики.
Можно ограничить список пользователей в локальной группе Users с помощью политики Restricted Groups (см. пример использования политик Restricted Groups из раздела Windows Settings -> Security Settings для добавления пользователей в локальную группу администраторов). Но мы рассмотрим другой вариант.
Есть две групповые политики, которые находятся в разделе Computer Configuration -> Policies -> Security Settings -> Local Policies -> User Rights Assignment (Конфигурация пользователя -> Политики -> Параметры безопасности -> Локальные политики -> Назначение прав пользователя):
- Deny log on locally (Запретить локальный вход) – позволяет запретить локальный вход на компьютеры для определенных пользователей или групп. ;
- Allow log on locally (Локальный вход в систему) – содержит список пользователей и групп, которым разрешено входить на компьютер локально.
Например, чтобы запретить пользователям определенной группы входить на компьютеры в определенной Organizational Unit (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 $_ }
Затем нужно включить параметр GPO Allow log on locally, добавить в него эту группу (+ различные администраторские группы: Domain Admins, администраторы рабочих станций и прочее) и назначить политику на OU с компьютерами. Таким образом вы разрешите входить на компьютеры только пользователям конкретного OU.
Обновите настройки GPO на клиентах. Теперь при попытке входа пользователя, которому не разрешен локальный метод входа, появится окно с предупреждением:
You cannot log on because the logon method you are using is not allowed on this computer. Please see your network administrator for more information.
Или
The sign-in method you are trying to use isn’t allowed. For more info, contact your network administrator.
Несколько важных моментов касательно данных политик:
- Не стоит применять данные политики, для ограничения доступа к серверам и тем более к контроллерам домена;Как разрешить обычным пользователям RDP доступ к DC.
- Не включаете эти политики через стандартные GPO: Default Domain Policy или Default Domain Controllers Policy;
- Запрещающая политика имеет больший приоритет;
- Не забывайте про сервисные учетные записи(в том числе gMSA), которые могут использоваться для запуска служб на компьютерах;
- Не стоит применить политики, ограничивающие локальный вход на весь домен. Назначайте их на конкретные OU;
- Пользователи смогут подключаться компьютерам с помощью интерактивных RDP сессий несмотря на запрет локального входа. Для этого нужно, чтобы на компьютере был включен протокол RDP и учетная запись пользователя находилась в группе Remote Desktop Users.
Спасибо за статью
Спасибо за публикации. всегда нахожу что-то полезное для себя
Здравствуйте! Есть задача, после работы выключить компьютер и блокировать доменные учётные записи. Задача выполнено через GPO и Время входа. Но пользователей после работы обратно включает компьютер и отключают сетевые подключения и авторизуется со своими учетными записями к компьютеру и обратно включает сетевое подключение. Как с этим бороться?
Через GPO разместить на всех компах локальное задание планировщика. Время запуска с 18:00 до 09:00 каждые 5 минут — выполнить команду выключения компьютера.
Отключить кэш пароля. и как верно заметил itpro настроить логаут.
https://winitpro.ru/index.php/2020/11/16/cached-credentials-windows-cashedlogonscount
Как поставить «галочку» доступа на все компьютеры?
Не понял вопроса. Сбросить галку на одном компьютере или изменить настройки на всех ПК в домене?
Добрый день.
После настройки ограничения по входу на ПК, у пользователя пропадает возможность подключаться по 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
Добрый день!
Подскажите а как ограничить в ход на доменные копы, но ч о в почту с любого браузера мог входить
А браузер запускаете на компьютере/устройстве не в домене? Тогда разрешить вход толькос фейкового компьютера (т.е. доступ на все компьютеры будет запрещен).
Спасибо за статью! Как всегда все очень грамотно и по теме! 🙂
Может еще подскажите — как сделать, чтобы по RDP-подключению пользователя тоже пускало на указанные в The following computers физические компы или VM?
Доступ по RDP пропадает:(
Не быстро, но отвечу ))
Для этого необходимо в The following computers указать имя ПК с которого будут подключаться, т.е. если имя ПК юзера user1 а сервер куда надо подключиться server1 то прописать необходимо user1 и server1, либо обмануть прописав в файлике RDP параметр enablecredsspsupport:i:0 , тогда ПК юзера можно не прописывать.
https://docs.microsoft.com/en-us/previous-versions/windows/it-pro/windows-server-2008-R2-and-2008/ff393716(v=ws.10)
Как через powershell установить пользователю разрешение входить на все компьютеры домена?
По умолчанию вход на компьютеры домена под доменным аккаунтом не ограничен. Если ограничен, то как? В зависимости от этого нужно искать логику разрешения входа.
Здравствуйте, а есть задача несколько иного рода. В домене пользователям изначально в свойствах заданы компы на которые он вхож. Тут появляется что то типа компьютерного класса где проходят обучалки разного рода, и на эти компы нужно впустить конкретную группу…. Как это сделать если всем изначально присвоены компы. Пользователей более 400….
Я бы собрал компьютеры класса в одну OU/группу и POwerShell скриптом добавил их в LogonWorkstations всем пользователям. Потом аналогичным образом бы удалил.
Да ,так и сделал. В PowerShel я новичок, поэтому пришлось попотеть))) Но скрипт сделал, и теперь выгружаю список пользователей, потом скриптом просто прогоняю весь список пользователей вписывая им определённый набор компьютеров. Спасибо за ответ.