По умолчанию пользователи Active Directory могут локально входить под своими учетками на любой доменный компьютер в сети. Это обеспечивается за счет того, что все новые пользователи создаваемые в Active Directory автоматически добавляются в группу Domain Users. А группа Domain Users в свою очередь по умолчанию добавляццфцется в локальную группу Users на рабочих станциях Windows при добавлении их в домен 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 имя компьютера (нельзя знаки подстановки использовать). Параметр регистронезависимый. Максимально допустимое NetBIOS hostname в Windows – 16 символов. - Сохраните настройки учетной записи.
Теперь пользователь может авторизоваться только на указанные компьютерах. При попытке зайти на любой другой компьютер, кроме разрешенных в AD, пользователей получит ошибку:
Your account is configured to prevent you from using this PC. Please try another PC.

Кроме того, настроенный список разрешенных компьютеров в поле Log on To, будет блокировать подключение к разрешенным хостам по RDP (в том числе к разрешенным RDS фермам), если используется проверка подлинности NLA. В этом случае при подключении к разрешенному хосту по RDP под этим пользователем, появится ошибка:
The system administrator has limited the computers you can log on with.Try logging on at a different computer.
Системный администратор ограничил количество компьютеров с которых вы можете войти в систему.

Для исправления проблемы нужно добавить hostname компьютера-источника, с которого выполняется RDP подключение в список доверенных (даже если он не в домене), либо отключить NLA для RDP (что не безопасно).
Атрибут userWorkstations в Active Directory
Фактически список разрешенных компьютеров хранится в атрибуте пользователя userWorkstations (в виде списка имен компьютеров, разделенных запятыми). Вы можете просмотреть или отредактировать текущее значение userWorkstations на вкладке редактора атрибутов.

Максимальный размер userWorkstations атрибута ограничен 1024 символами (этого хватает на 64 компьютера с длиной имени 16 символов), и если попытаться добавить список большое количество компьютеров, при добавлении появится ошибка:
This property is limited to 64 values. You must remove some of the existing values before you can add new ones.

Изменить значение атрибута userWorkstations с помощью PowerShell
Вручную заполнять список компьютеров, на которые разрешено входить пользователю домена из графической консоли ADUC может быть довольно утомительно. Чтобы добавить в список разрешенных компьютеров еще одно имя, проще воспользоваться PowerShell (требуется модуль AD для PowerShell). Следующая команда разрешит указанному пользователю вход на указанный компьютер (компьютер будет добавлен в список в атрибуте userWorkstations):
$allowPC = "wks123"
$user = "abelov"
$current = (Get-ADUser $user -Properties userWorkstations).userWorkstations
$newValue = if ($current) { "$current,$allowPC" } else { $allowPC }
Set-ADUser $user -LogonWorkstations $newValue

Если нужно добавить в разрешенные для входа компьютеры большое количество записей, проще всего сохранить список компьютеров в CSV файл (NetBIOSName в этом примере название столбца в файле). Затем выполнить:
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 userWorkstations | Format-List Name, userWorkstations

Чтобы очистить список разрешенных компьютеров (пользователю можно будет входитьб на любой компьютер):
Set-ADUser -Identity 'abelov' -LogonWorkstations $null
Вывести список всех пользователей, для которых включены ограничения на вход в домен:
Get-ADUser -ldapfilter '(userWorkstations=*)'|ft

Разрешенное время входа пользователей в Active Directory
По умолчанию пользователь домена может выполнять вход на компьютеры в любой время (24/7). В целях безопасности можно ограничить разрешенное время входа рабочими часами (например, с 8:00 до 19:00).
- Откройте свойства нужного пользователя в оснастке ADUС, перейдите на вкладку Account и нажмите кнопку Logon Hours (Время входа)

- Появится специальный календарный интерфейс, где можно задать разрешенные и запрещенный часы и дни недели. По умолчанию для пользователей не ограничено время входа в домена (все выделено синим);
- Выделите диапазоны времени, в которые вы хотите запретить вход пользователя и нажмите Logon Denied (цвет диапазонов, в которые запрещено логиниться пользователям изменится на белый).

Чтобы включить временные ограничения сразу для нескольких пользователей в OU, выделите аккаунты и откройте их свойства. Перейдите на вкладку Accounts. Включите опцию Logon hours и настройте разрешенные и запрещенные часы. Все изменения применятся для всех выделенных аккаунтов.

Если пользователь попытается войти в компьютер за пределами разрешенных часов, он получит ошибку:
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.

Также с помощью PowerShell можно скопировать значение настроенного атрибута Logon Hours у одного (эталонного пользователя) и применить их для всех пользователей. Следующий пример применит одинаковые ограничения на время входа в домен для группы удаленных пользователей:
$templateuser='a.khramov'
$templatehours= Get-ADUser -Identity $templateuser -properties logonHours
Get-ADGroupmember "msk-VPN_Users" |foreach {Set-ADUSer $_.samaccountname -Replace @{logonHours = $templatehours.logonHours} }
С помощью параметра GPO Set action to take when logon hours expire в User Configuration -> Administrative Templates -> Windows Components -> Windows Logon Options можно выбрать действие, которое нужно выполнить, если разрешенные рабочие часы пользователя закончились. Можно заблокировать текущий сеанс (
lock
), завершить (
logoff
) или отключить (
disconnect
)

Есть еще два GPO параметра, которые позволяют ограничить сетевую активность пользователей за пределами рабочего времени, заданного в настройках учетной записи. Речь о следующих параметрах 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 сессии пользователей, чьи рабочие часы истекли.
net user <login> /time:<allowed-time>
Ограничить вход на компьютеры AD с помощью GPO
В больших доменах редко используется ограничение доступа пользователей к компьютерам через атрибут userWorkstations. Т.к. это такое решение недостаточно гибкое (максимальное число компьютеров в атрибуте ограничено) и требует постоянного ручного вмешательства. Проще настроить правила запрета/разрешения входа на компьютеры через параметры безопасности в разделе GPO 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.
$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 сессий несмотря на запрет локального входа.


Спасибо за статью
Спасибо за публикации. всегда нахожу что-то полезное для себя
Здравствуйте! Есть задача, после работы выключить компьютер и блокировать доменные учётные записи. Задача выполнено через 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 я новичок, поэтому пришлось попотеть))) Но скрипт сделал, и теперь выгружаю список пользователей, потом скриптом просто прогоняю весь список пользователей вписывая им определённый набор компьютеров. Спасибо за ответ.
Добрый день! При включении это функции, перестает заходить на почту через веб интерфейс. почтовый сервер kerio connect. в логах пишет что не правильный введен пароль. Не знаете как решить эту проблему?
Возможно в свойствах учетки нужно разрешить вход на компьтер с kerio
Таких параметров нет
Приветствую
А как-то можно поменять надпись «Системный администратор ограничил количество компьютеров с которых вы можете войти в систему.» на что-то другое?
Штатно — нет. Если толкьо модифицировать какуюту библиотеку, где это хранится. Но это такое себе…
Интересный сценарий — пытаюсь подключиться со своего компьютер по RDP подключиться к RDS под другим пользователем (пользователю разрешено входить только на RDS) и получают ошибку:
Remote Desktop ConnectionThe system administrator has limited the computers you can log on with. Try logging on at a different computer. If the problem continues, contact your system administrator or technical support.
Как оказалось, если используется NLA для RDP, в этом случае нужно добавить в разрешенные еще и компьютер источник. Т.к. по факут пользователь аутентфицируется на нем.
При попытке добавить в политике в «Локальный вход в систему» например группу AD не удается сохранить конфигурацию, пишет
Администраторы должны иметь право локального входа в систему
Как ее можно использовать?
Чтобы автоматически блокировать сеанс пользователя, чье разрешенное время работы истекло, нужно включить параметр GPO Set action to take when logon hours expire в User Configuration -> Administrative Templates -> Windows Components -> Windows Logon Options
Можно заблокировать сеанс (lock), завершить (logoff) или отключить (disconnect)
Добрый день, подскажите как разрешить вход на определенный компьютер только Администартору или группе domain admins
В локальной политике безопаности GPO есть такой параметр:
Allow log on locally (Локальный вход в систему) — Computer Configuration -> Policies -> Security Settings -> Local Policies -> User Rights Assignment
Отредактируйте эту политику и добавьте в нее только тех пользователей и группы, которым разрешен вход.
Удалите группу users из политики.
Добрый день! есть задача разрешить доменным пользователям удаленный вход по рдп на свои рабочие пк. Настроил каждому пользователю LogonWorkstations. В локальной сети все работает. Но если подключаться по vpn не с доменных пк , то пк по именам не видятся, а по ip выдает ошибку Remote Desktop Connection
The system administrator has limited the computers you can log on with. Try logging on at a different computer. If the problem continues, contact your system administrator or technical support.
Вроде, помнится выше был ответ
Но я сам пробовал и нужно указать для юзера 1 не только ПК 1, но и сам сервер 1
Если не прав, сильно не бейте, просто поправьте))
Под сервером 1 имеете ввиду контролер домена?
Да
Уже добавлен. Не помогает. При подключении по IP AD не может сопоставить IP-адрес с именем компьютера из списка разрешенных. Система рассматривает это как попытку входа с неразрешенного компьютера. В DNS уже прописал статические ip всем машинам. тоже не помогло.
Возможно тут дело в NLA, который по умолчанию используется при RDP входе. Отключать его конечно небезопасно, но проверить можно.
Либо как вариант — накрутить какой-то логон скрипт, коорый при входе пользователя на комп проверяет настройки LogonWorkstations и запускает logoff, если компьютер не совпадает. Костыль конечно )
>>>С помощью оснастки Active Directory Administrative Center ( dsac.msc )
С помощью оснастки Active Directory Users and Computers (dsa.msc)
Важный момент. С функционального режим домена Windows Server 2012 R2 используется атрибут не LogonWorkstations , а User-Workstations https://learn.microsoft.com/ru-ru/windows/win32/adschema/a-userworkstations
атрибут Logon-Workstation
Этот атрибут не используется. См. атрибут User-Workstations .
Не нашел LogonWorkstations в редакторе атрибутов, нашел только LogonWorkstation и у него формат иной двоичный, 8ый, десятичный, 16