Автоматический контроль с помощью удаленного доступа к реестру Windows

  • Tutorial

Поддержка исправной, корректной работы компьютеров и ПО обычных пользователей — рутина сотрудников техподдержки и/или администраторов. Если компания небольшая, а все находятся в одной-двух комнатах, обычно нетрудно подойти самому и решить проблему или проверить то, что нужно.


Но что делать, если компания большая, а пользователь находится на другой площадке/в другом городе/стране?


image


Один из классических инструментов для такой работы — удаленное подключение (с помощью RDP, ПО вроде TeamViewer/Skype с демонстрацией рабочего стола и так далее). Однако он не лишен принципиальных недостатков:


  • в любом случае конечный пользователь будет отвлекаться от своей работы (в некоторых случаях — даже не видя своего рабочего стола)
  • эти инструменты не всегда будут работать, если на удаленном компьютере есть ошибки
  • установка стороннего ПО (в том числе проприетарного, в случае TeamViewer) далеко не всегда приветствуется политикой компании
  • способ практически не автоматизируется

Наконец — такой подход используется, когда инцидент уже произошел (сложно представить себе, чтобы администратор время от времени "профилактически" подключался к каждому пользователю). Именно поэтому важен механизм контроля (мониторинга) удаленных компьютеров.


Одним из возможных решений — использование удаленного доступа к реестру Windows. Он хранит данные в виде иерархической базы данных, что позволяет их быстро получать и компактно хранить. Используют реестр для хранения собственных настроек и параметров как ОС и встроенные службы, так и большинство сторонних программ. Поэтому содержание реестра во многом влияет на работу системы.


Исходя из этого, реестр вполне может использоваться как "индикатор" для контроля (можно обнаружить ошибку, если она связана с некорректными параметрами в реестре или смоделировать у себя проблемную ситуацию).


Еще одна возможность, которую дает такое решение — возможность административного контроля пользователей (например, удаленное чтение позволяет увидеть факты установок нежелательных программ и внесение изменений в настройки) — не стоит забывать о влиянии "человеческого фактора" на работу системы. На практике это пригодилось в рамках проекта SkypeTime, где было нужно отследить исправление настроек в Skype for Business.


image


Но реестр содержит тысячи записей, проконтролировать всех их крайне сложно. Поэтому прежде всего следует ограничить предмет контроля — определить, какие именно параметры нам интересны, и узнать, в каких именно ветках реестра находятся соответствующие значения. Как правило, последнее не составляет труда найти в документации / Интернете, или определить самостоятельно исходя из названий ключей.


Определившись с предметом контроля, можно переходить к непосредственной настройке удаленного доступа. Для этого необходимо активировать службу Remote Procedure Call на удаленных компьютерах и нужным образом настроить firewall, что удобно сделать с помощью групповых политик. С учетом требований безопасности, для доступа необходимы права доменного администратора или локального администратора на каждом из устройств.


Настройка удаленного доступа

Для активации самой службы, в разделе Computer Configuration > Preferences > Control Panel Settings > Services задаем для службы RpcSs параметры, как на скрин-шоте


image


Осталось добавить соответствующие исключения Firewall. В этой же политике в разделе Computer Configuration > Policies > Windows Settings > Security Settings > Windows Firewall with Advanced Security > Inbound Rules создаем New Rule:
Rule Type – Custom


image


В качестве пути программы указываем – %SystemRoot%\system32\svchost.exe
Из дополнительных настроек в разделе Службы (Services) задаем Применять к службе со следующим кратким именем – Winmgmt


image


На следующих страницах задаем TCP без указания конкретных портов и для всех адресов


image


image


и разрешаем подключение (Allow the Connection) для доменного профиля


image


image


Однако контролировать вручную реестр десятков и сотен компьютеров "вручную" (пусть даже по нескольким записям) — дело неблагодарное и бессмысленное. К счастью, этот процесс достаточно просто автоматизировать с помощью скриптов. Например, следующий скрипт на PowerShell позволяет узнать, кто из пользователей изменял параметры AwayThreshold и IdleThreshold (время перехода в состояние "Нет на месте" и "Неактивен") для Skype for Business.


Код скрипта
Param (
    [alias("c")]
    [string]$FromFileComputers,

    [alias("r")]
    [string]$OutputRPCErrorsFile,

    [alias("u")]
    [string]$FromFileUsers,

    [alias("o")]
    [string]$OutputFile="output.csv",

    [alias("a")]
    [int]$MinAway,

    [alias("i")]
    [int]$MinIdle
)

$RPCErrorsArray = @()

$result = @()
$HKU = 2147483651

$RegistryForCheckArray = "SOFTWARE\Microsoft\Office\13.0\Lync","SOFTWARE\Microsoft\Office\14.0\Lync","SOFTWARE\Microsoft\Office\15.0\Lync","SOFTWARE\Microsoft\Office\16.0\Lync","SOFTWARE\Microsoft\Communicator"

$CurrentComputerNumber = 0;

if(![string]::IsNullOrEmpty($FromFileUsers))
{
    $Users = Get-Content $FromFileUsers;
}

if(![string]::IsNullOrEmpty($FromFileComputers))
{
    $Comps = Get-Content $FromFileComputers;
}
else
{
    $date  = (get-date).AddMonths(-1) 
    $Comps = Get-ADComputer -filter { lastlogontimestamp -ge $date } | select name | ForEach-Object {$_.name}
    #$Comps = "NB_CY"
}

$ServersCount = ($Comps).Count;
Foreach ($Comp in $Comps) {
$CurrentComputerNumber++

    try 
    {
        Write-Host "Checking: $Comp [$CurrentComputerNumber/$ServersCount]";
        $profiles = Get-WmiObject Win32_UserProfile -filter "Loaded=$true and special=$false" -ComputerName $Comp -ErrorAction Stop
        $reg = [wmiclass]"\\$Comp\root\default:stdregprov"
        Foreach ($profile in $profiles)
        {
            $username = Split-Path $profile.LocalPath -Leaf

            if(![string]::IsNullOrEmpty($FromFileUsers))
               {
                    if(!$Users.Contains($username))
                    {
                        continue;
                    }
               }

            Foreach( $registry in $RegistryForCheckArray)
            {
                $hkey = "$($profile.sid)\$registry"
                #Write-Host "KEY: $hkey"

                $away = $reg.GetDWORDValue($hku,$hkey,"AwayThreshold").uValue
                $idle = $reg.GetDWORDValue($hku,$hkey,"IdleThreshold").uValue
                $sip = $reg.GetStringValue($hku,$hkey,"ServerSipUri").sValue

                if([string]::IsNullOrEmpty($away) -and [string]::IsNullOrEmpty($idle)) 
                {
                    continue;
                }

                if(($MinAway -gt 0 -and $away -lt $MinAway) -or ($MinIdle -gt 0 -and $idle -lt $MinIdle))
                {
                    continue;
                }

                $result += New-Object PsObject -Property @{
                               "PC" = $Comp
                               "Username" = $username
                               "SIP" = $sip
                               "SFB_Away" = $away
                               "SFB_Idle" = $idle
               }

            }
        }
    }
    catch
    {

        if ($_.Exception.GetType().Name -eq "COMException") {

            $RPCErrorsArray += $Comp;
        }

        Write-Host "Error: ($_.Exception.GetType().Name)";
        $_.Exception
    }

}
$result | Export-csv -Path $OutputFile
$result | Format-Table -Property PC,Username,SIP,SFB_Away,SFB_Idle -AutoSize
Write-Host "Saved to: $OutputFile"

if(![string]::IsNullOrEmpty($OutputRPCErrorsFile))
{
    $RPCErrorsArray | out-file $OutputRPCErrorsFile
    Write-Host "RPC errors saved to: $OutputRPCErrorsFile"
}

Для большего удобства, скрипт может быть запущен с параметрами:

-c путь к файлу со списком hostname компьютеров для проверки, если не задано — получает компьютеры из AD с активностью за 30 дней.
-r путь к файлу, в который будут записаны hostname компьютеров у которых была ошибка RPC.
-u путь к файлу со списком юзеров (login), если не задано — проверяет всех.
-o путь к файлу, в котором будет результат выполнения скрипта, по умолчанию output.csv.
-a минимальное значение для параметра AwayThreshold, записи со значением, меньше указанного, не попадут результат выполнения скрипта.
-i минимальное значение для параметра IdleThreshold, записи со значением, меньше указанного, не попадут результат выполнения скрипта.

Далее запуск скрипта можно автоматизировать, добавив в Планировщик заданий Windows (Task Scheduler) или через функционал Sheduled Job в PowerShell.
AdBlock похитил этот баннер, но баннеры не зубы — отрастут

Подробнее
Реклама

Комментарии 11

    +1
    Существуют ли какие-нибудь более реальные примеры использования этой фичи?
      +1
      Например проверять — установлены ли «плохие» программы, прописано ли что-то лишнее в автозапуске.
      0
      Зачем открывать удаленный доступ по RPC и создавать очень серьезную дыру в безопасности в виде возможности удаленно редактировать реестр? Всем реестром можно управлять при помощи GP, о которых в статье и идет речь, а если каким параметром реестра и нельзя будет по умолчанию управлять, то создается свой шаблон GP — и уже можно.
        0
        С ситуацией из примера (Skype for Business, параметры Away/Idle) не сработало, а изначально ради этого все и затевалось. То есть GP создать можно (указав нужное время), но пользователь сможет спокойно изменить время в настройках программы (при этом в реестре останется изначальное значение), и указанные пользователем параметры будут действовать до перезапуска S4B.

        Описанным же способом отследить эти изменения получилось
          0
          Ну, s4b в этом плане не самый удачный по управляемости вариант, у него нет возможности большую часть настроек железно задать в принципе. Но стоит учесть прежде всего то, что изначально (когда еще назывался Office Communicator) это был продукт, дополняющий стек Outlook + Exchange, и сейчас таковым является, ничего не изменилось в его концепции. Я это к тому, что расписание статусов ему нужно отправлять в виде события в календаре на Exch, и это единственный правильно идеологический вариант всей указанной выше связки MS, да и по логике time management тоже :)
          Но это все лирика. При разрешенном удаленном вызове процедур доступ к реестру не самое большое зло. Посмотрите лучше, что можно натворить при помощи psexec, знания командной строки, в умелых да и не очень руках.
            0
            Точно так же пользователь может изменить исполняемый файл Lync, чтобы значение timeout читалось не из реестра, а было указано в коде. И запускать модифицированный файл с рабочего стола.

            Очень смешно было в интернет-кафе, где в политиках запрещён запуск regedit и taskmgr, но можно было принести и запустить свои пропатченные версии, которые игнорируют настройки реестра.
              0
              Думаю, что не каждая кухарка сможет модифицировать исполняемый файл. В отличие от изменения просто в настройках.
              0
              Описанным же способом отследить эти изменения получилось
              Ну, получилось. А что дальше? Технически нельзя запретить пользователю менять настройку, а он меняет, потому что «так удобнее».
            0
            Контроль антивируса — не отключен ли, обновился ли на всех устройствах

            Параметры блокировки экрана (тоже вопрос безопасности, в принципе)

            Firewall
              0

              Я это делаю через wmi. Без явного доступа к

              0

              Лучше на всех машинах включить winrm.
              А также параллельно опрашивать машины.
              Следить за исключениями в коде.
              Не использовать get-wmiobject у него нет time out.

              Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

              Самое читаемое