Удаленное управление ПК из оснастки «Пользователи и компьютеры Active Directory»

Все об администрировании Windows NT/2000/2003/2008/2012 Server (в т.ч. R2) серверов. Групповые политики, домены, безопасность и пр. То, чего не найдешь в бескрайних просторах Интернета. Решения тех проблем, которые не решаются типовыми ответами, которые можно получить в техподдержке Майкрософта - а именно: переустановить продукт или купить какой-ть другой лицензионный диск.


Модератор: UncleFather

Аватара пользователя
UncleFather
Site Admin
Сообщения: 1518
Зарегистрирован: 17 авг 2004 16:20, Вт
Контактная информация:

Удаленное управление ПК из оснастки «Пользователи и компьютеры Active Directory»

Сообщение UncleFather »

Задача:

Необходимо добавить в оснастку Active Directory Users and Computers (Пользователи и компьютеры Active Directory) возможность удаленного управления компьютерами, за которыми работают пользователи с известными логинами (именами).

01.png

То есть звонит пользователь, называет себя, админ находит его в оснастке ADUC, кликает правой кнопкой мыши, выбирает из контекстного меню «Управление ПК» и подключается при помощи какого-либо ПО удаленного доступа к пользовательскому ПК.


Решение:

Общий принцип

Скрипт, запущенный из под пользователя определяет имя компьютера, на котором он работает, и от своего имени текущего пользователя записывает значение атрибута в самом себе в каталоге AD.
Со стороны AD администратор открывает контекстное меню, из которого запускается скрипт, который по имени атрибута из AD запускает ПО удаленного доступа для управления компьютером пользователя.

Для того, чтобы создать новый атрибут в схеме нужно сначала добавить оснастку. На компьютере с установленным пакетом удаленного администрирования, либо на контроллере домена, нужно запустить с правами локального администратора:

Код: Выделить всё

regsvr32 schmmgmt.dll
02.png
02.png (6.28 КБ) 450 просмотров

Открываем оснастку Схема Active Directory

03.png

и идем в раздел Attributes. Создаем новый атрибут. Для добавления нового атрибута также потребуются права Администратора схемы. Внимание!!! Атрибуты это не место для экспериментов и создаются они один раз и навсегда, удалить или переименовать атрибут невозможно.

Для добавления нового атрибута потребуется ввести OID. Это уникальный идентификатор объекта. Пересечение OID недопустимо и если его вбить любым, то есть вероятность, что будут нерешаемые проблемы в будущем. OID обычно начинается с 1.2.840.113556 и далее циферки. Поскольку третье число (840) это код страны, а четвертое это код компании (Microsoft), можно ввести код несуществующей страны 800 и сгенерировать 2 случайных числа через точку.

Далее указываем syntax атрибута. Для нашей задачи подойдет Unicode String. И, наконец, имя атрибута. В этом примере «ComputerLabelForRemoteAccess»

04.png

Добавим этот атрибут в класс. Выбираем класс user и в закладе Attributes добавляем наш новый атрибут.

05.png

Теперь пользователь с нужными правами будет иметь право записывать этот атрибут в пользователе. По-умолчанию эти правом владеет Account operator или выше. Но нас интересует ситуация, когда пользователь сам бы мог редактировать этот атрибут. Для подобных целей существует пользователь с именем SELF, который является олицетворяем самого себя.

Нам нужно дать права пользователю SELF на запись атрибута ComputerLabelForRemoteAccess. Можно сразу изменить права на весь домен, с прицелом на то, что этот атрибут может понадобиться и для других целей.

По умолчанию, должно пройти какое-то время от создания атрибута до того момента, когда он появится в списке назначения прав и в свойствах атрибутов пользователя. Чтобы ускорить процесс, обновим схему вручную в оснастке Редактирование ADSI и перезагрузим контроллер домена - хозяина схемы.

06.png

После перезагрузки КД, заходим в дополнительные настройки безопасности объекта домен в оснастке ADUC и добавляем права для пользователя SELF для Дочернего объекта Пользователь на чтение и запись атрибута ComputerLabelForRemoteAccess.

07.png
08.png

Итак, атрибут создан и права назначены. Переходим к рабочему этапу, нужно добавить имя компьютера в значение атрибута. Для этого будем использовать сценарий на 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

Прописываем этот скрипт с помощью групповой политики в конфигурацию пользователя на запуск во время входа в систему.

09.png

Возможна ситуация, когда человек залогинен на двух компьютерах, а необходимо, чтобы в AD информация была актуальна. Для этого добавляем выполнение скрипта в групповую политику в конфигурацию пользователя в планировщик

10.png

со срабатыванием по событию разблокировки компьютера.

11.png

Исключаем запуск Logon скрипта на терминальных и других серверах, не относящихся к локальным компьютерам. Это можно сделать ограничением области действия политики, запускающей этот скрипт. Либо нацеливанием запланированного задания на исключение терминальных сеансов

13.png

и заменой скрипта, прописанного на вход пользователя запланированным заданием, выполняемым при входе пользователя в систему (так как Logon скрипт не возможно нацелить на уровень элемента)

12.png

Для проверки добавления свойств в атрибут 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.

14.png

Требуемый атрибут для изменения находится в объекте CN=user-Display,CN=419,CN=DisplaySpecifiers,CN=Configuration

15.png

CN=419 это язык. Если нужно поменять параметр для англоязычной оснастки ADUC, то CN=419 нужно поменять на CN=409.

Добавляем в adminContextMenu новую запись, состоящую из трех полей, разделенных запятыми без пробелов. Первое поле - это порядковый номер - положение в контекстном меню, второе - имя и третье поле - это полный путь к скрипту или программе, которая будет выполняться по клику на этом пункте меню. Например, так:

Код: Выделить всё

2,Падключицца через RAdmin,\\ad\SYSVOL\gb6.local\scripts\RemoteAccess\StartingRAdmin.vbs
16.png

После перезапуска оснастки ADUC для объектов Пользователь в контекстном меню появится новая запись.

17.png

Скрипт будет запускаться с правами пользователя, от имени которого оснастка была запущена. Всего при запуске программы из контекстного меню 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, который должен располагаться на общедоступном ресурсе, и подключается к компьютеру заданного пользователя.

Подробнее можно почитать здесь


Alexander A. Manaeff©

Понравилась статья? Будем крайне признательны за репосты в соцсетях! Материально поддержать проект можно здесь

Мои странички:
ВКонтакте
Одноклассники
Youtube
Facebook
Instagram

Изображение
Изображение
Изображение
Изображение