Задача:
Необходимо добавить в оснастку Active Directory Users and Computers (Пользователи и компьютеры Active Directory) возможность удаленного управления компьютерами, за которыми работают пользователи с известными логинами (именами).
То есть звонит пользователь, называет себя, админ находит его в оснастке ADUC, кликает правой кнопкой мыши, выбирает из контекстного меню «Управление ПК» и подключается при помощи какого-либо ПО удаленного доступа к пользовательскому ПК.
Решение:
Общий принцип
Скрипт, запущенный из под пользователя определяет имя компьютера, на котором он работает, и от своего имени текущего пользователя записывает значение атрибута в самом себе в каталоге AD.
Со стороны AD администратор открывает контекстное меню, из которого запускается скрипт, который по имени атрибута из AD запускает ПО удаленного доступа для управления компьютером пользователя.
Для того, чтобы создать новый атрибут в схеме нужно сначала добавить оснастку. На компьютере с установленным пакетом удаленного администрирования, либо на контроллере домена, нужно запустить с правами локального администратора:
Код: Выделить всё
regsvr32 schmmgmt.dll
Открываем оснастку Схема Active Directory
и идем в раздел Attributes. Создаем новый атрибут. Для добавления нового атрибута также потребуются права Администратора схемы. Внимание!!! Атрибуты это не место для экспериментов и создаются они один раз и навсегда, удалить или переименовать атрибут невозможно.
Для добавления нового атрибута потребуется ввести OID. Это уникальный идентификатор объекта. Пересечение OID недопустимо и если его вбить любым, то есть вероятность, что будут нерешаемые проблемы в будущем. OID обычно начинается с 1.2.840.113556 и далее циферки. Поскольку третье число (840) это код страны, а четвертое это код компании (Microsoft), можно ввести код несуществующей страны 800 и сгенерировать 2 случайных числа через точку.
Далее указываем syntax атрибута. Для нашей задачи подойдет Unicode String. И, наконец, имя атрибута. В этом примере «ComputerLabelForRemoteAccess»
Добавим этот атрибут в класс. Выбираем класс user и в закладе Attributes добавляем наш новый атрибут.
Теперь пользователь с нужными правами будет иметь право записывать этот атрибут в пользователе. По-умолчанию эти правом владеет Account operator или выше. Но нас интересует ситуация, когда пользователь сам бы мог редактировать этот атрибут. Для подобных целей существует пользователь с именем SELF, который является олицетворяем самого себя.
Нам нужно дать права пользователю SELF на запись атрибута ComputerLabelForRemoteAccess. Можно сразу изменить права на весь домен, с прицелом на то, что этот атрибут может понадобиться и для других целей.
По умолчанию, должно пройти какое-то время от создания атрибута до того момента, когда он появится в списке назначения прав и в свойствах атрибутов пользователя. Чтобы ускорить процесс, обновим схему вручную в оснастке Редактирование ADSI и перезагрузим контроллер домена - хозяина схемы.
После перезагрузки КД, заходим в дополнительные настройки безопасности объекта домен в оснастке ADUC и добавляем права для пользователя SELF для Дочернего объекта Пользователь на чтение и запись атрибута ComputerLabelForRemoteAccess.
Итак, атрибут создан и права назначены. Переходим к рабочему этапу, нужно добавить имя компьютера в значение атрибута. Для этого будем использовать сценарий на VBscript:
Код: Выделить всё
On Error Resume Next
Set objSysInfo = CreateObject("ADSystemInfo")
Set objNetwork = CreateObject("WScript.Network")
Set objUser = GetObject("LDAP://" & objSysInfo.UserName)
objUser.Put "ComputerLabelForRemoteAccess", objNetwork.ComputerName
objUser.SetInfo
Прописываем этот скрипт с помощью групповой политики в конфигурацию пользователя на запуск во время входа в систему.
Возможна ситуация, когда человек залогинен на двух компьютерах, а необходимо, чтобы в AD информация была актуальна. Для этого добавляем выполнение скрипта в групповую политику в конфигурацию пользователя в планировщик
со срабатыванием по событию разблокировки компьютера.
Исключаем запуск Logon скрипта на терминальных и других серверах, не относящихся к локальным компьютерам. Это можно сделать ограничением области действия политики, запускающей этот скрипт. Либо нацеливанием запланированного задания на исключение терминальных сеансов
и заменой скрипта, прописанного на вход пользователя запланированным заданием, выполняемым при входе пользователя в систему (так как Logon скрипт не возможно нацелить на уровень элемента)
Для проверки добавления свойств в атрибут ComputerLabelForRemoteAccess есть несколько скриптов PowerShell.
Поиск пользователей без значений. Скрипт создает таблицу, в которой показываются только пользователи, отображаемое имя, логин и дата последнего входа в систему. С его помощью можно отыскать пользователей недавно вошедших в систему (разблокировавших ПК) у которых не прописался нужный нам атрибут:
Код: Выделить всё
Import-Module ActiveDirectory
Get-ADObject -filter {(sAMAccountType -eq "805306368") -and (ComputerLabelForRemoteAccess -notlike "*")} -Properties DisplayName,GivenName,SN,LabelComputer,cn,sAMAccountName,lastLogonTimestamp, OperatingSystem -SearchBase "OU=Пользователи сети,DC=contoso,dc=com" | Select-Object @{Expression={$_.DisplayName};Label="Отображаемое имя"},@{Expression={$_.sAMAccountName};Label="Логин"}, @{label="Последний вход";expression={[datetime]::FromFileTime($_.lastLogonTimestamp)}} | Sort-Object "Последний вход"| Format-Table -Autosize
Read-Host "Отсортировано по дате последнего входа по возрастанию. Для выхода нажмите любую клавишу..."
Все компьютеры с метками. Этот скрипт похож на предыдущий, но показывает список пользователей с прописанной меткой ComputerLabelForRemoteAccess:
Код: Выделить всё
Import-Module ActiveDirectory
Get-ADObject -filter {(sAMAccountType -eq "805306368") -and (ComputerLabelForRemoteAccess -like "*")} -Properties DisplayName,GivenName,SN,LabelComputer,cn,sAMAccountName,lastLogon -SearchBase "OU=Пользователи сети,DC=contoso,dc=com" | Select-Object @{Expression={$_.DisplayName};Label="Отображаемое имя"},@{Expression={$_.sAMAccountName};Label="Логин"}, @{Expression={$_."ComputerLabelForRemoteAccess"};Label="Последний компьютер"},@{label="Последний вход";expression={[datetime]::FromFileTime($_.lastLogon)}} | Sort-Object "Последний вход" | Format-Table -Autosize
Read-Host "Отсортировано по последней дате входа по возрастанию. Нажмите любую кнопку для выхода..."
Поиск имени компьютера по пользователю. Like поиск происходит по всем основным параметрам пользователя. Возвращает таблицу найденного:
Код: Выделить всё
Import-Module ActiveDirectory
$exit = 0
do
{
Write-Host "Поиск по атрибутам пользователя: Имя, Фамилия, Отображаемое имя, Логин, Имя компьютера. Выход при пустом поле поиска."
$us = Read-Host -Prompt "Введите строку для поиска"
$find = ""
$find += '*' + $us + '*'
write-host = $find
Get-ADObject -filter {(sAMAccountType -eq "805306368") -and ((GivenName -like $find ) -or (sn -like $find ) -or (cn -like $find ) -or (DisplayName -like $find ) -or (ComputerLabelForRemoteAccess -like $find ) -or (sAMAccountName -like $find ))} -Properties DisplayName,GivenName,SN,ComputerLabelForRemoteAccess,cn,sAMAccountName | Select-Object @{Expression={$_.DisplayName};Label="Отображаемое имя"},@{Expression={$_.sAMAccountName};Label="Логин"},@{Expression={$_."LabelComputer"};Label="Последний компьютер"} | Format-Table -Autosize
} While ($us -ne "")
Добавление нового пункта контекстного меню в оснастку ADUC
Настройки контекстного меню оснастки ADUC находятся в каталоге AD. Для того, чтобы добавить новый пункт, необходимо воспользоваться редактором конфигурации AD, утилитой ADSI Edit. Необходимо подключиться к конфигурации AD.
Требуемый атрибут для изменения находится в объекте CN=user-Display,CN=419,CN=DisplaySpecifiers,CN=Configuration
CN=419 это язык. Если нужно поменять параметр для англоязычной оснастки ADUC, то CN=419 нужно поменять на CN=409.
Добавляем в adminContextMenu новую запись, состоящую из трех полей, разделенных запятыми без пробелов. Первое поле - это порядковый номер - положение в контекстном меню, второе - имя и третье поле - это полный путь к скрипту или программе, которая будет выполняться по клику на этом пункте меню. Например, так:
Код: Выделить всё
2,Падключицца через RAdmin,\\ad\SYSVOL\gb6.local\scripts\RemoteAccess\StartingRAdmin.vbs
После перезапуска оснастки ADUC для объектов Пользователь в контекстном меню появится новая запись.
Скрипт будет запускаться с правами пользователя, от имени которого оснастка была запущена. Всего при запуске программы из контекстного меню ADUC скрипту или программе передается 2 значения в параметрах, это DN и тип объекта. Для подключения по удаленному доступу к ПК пользователя нам необходим только первый параметр. Найдем его скриптом и запустим подключение к удаленному ПК:
Код: Выделить всё
On Error Resume Next
Set WshShell = CreateObject("WScript.Shell")
set fs=createobject("Scripting.FileSystemObject")
Dim CompName
Dim RunCMD
Dim FilePath
Set objAD = GetObject(Wscript.arguments.Item(0))
CompName = objAD.Get ("ComputerLabelForRemoteAccess")
If CompName = "" Then WScript.Echo "Имя компьютера отсутствует для пользователя"
If CompName = "" Then WScript.quit
If MsgBox ("Подключиться к компьютеру " & CompName & "?",vbOKCancel+vbQuestion,"Серьезно?") = vbCancel Then WScript.quit
If fs.FileExists ("\\ad\SYSVOL\gb6.local\scripts\RemoteAccess\RAdminViewer\Radmin.exe") Then FilePath = """\\ad\SYSVOL\gb6.local\scripts\RemoteAccess\RAdminViewer\Radmin.exe"""
RunCMD = FilePath &" /Connect:" & CompName & ":4899"
RetCode = WshShell.Run (RunCMD,5)
Скрипт запускает RAdminViewer, который должен располагаться на общедоступном ресурсе, и подключается к компьютеру заданного пользователя.
Подробнее можно почитать здесь