Прерывание процессов на удаленных компьютерах при помощи Windows PowerShell

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

Было решено реализовать это через прерывание процесса этой программы.

Для того, чтобы пользователь, не имеющий административных прав мог прерывать процессы на компьютерах, он должен обладать привилегией Debug Programs (Отладка программ), которой по умолчанию обладают только администраторы. Для того, чтобы предоставить пользователю возможность прерывания процессов на заданных компьютерах, мы можем воспользоваться групповой политикой.

Для этого мы создадим группу, в которую будут входить компьютеры, на которых нам нужно будет прерывать процессы. Назовем ее, например, process_termination_computers. А также создадим группу, в которую будут входить пользователи, которым нужна подобная привилегия. Даже если пользователь один, стоит создать подобную группу, чтобы в случае передачи этих полномочий другому пользователю, или же в случае расширения круга лиц, которым доступна подобная функциональность, нам не приходилось редактировать саму групповую политику. Назовем эту группу process_termination_users.

Создадим новый объект групповой политики с именем, например process_termination_policy. Нужный нам параметр находится в разделе Computer Configuration\Policies\Windows Settings\Security Settings\Local Policies\User Rights Assignment. Называется он, соответственно, Debug Programs. Добавим в него группу пользователей — process_termination_users. Также не забудьте добавить группу Administrators, поскольку применение этой политики переопределит значения по умолчанию, и вы, как администратор, потеряете эту привилегию :)

gp_priv

Созданную политику привяжем к Организационному подразделению (OU) в котором находятся объекты нужных нам компьютеров и разрешим применение этой политики только к членам группы process_terminate_computers.

Теперь нам нужно создать на компьютерах отдельную конфигурацию сеанса — PSSessionConfiguration, предназначенную только для прерывания работы процессов. На Windows 7 и Windows 8 это можно сделать удаленно (если на компьютерах включен Remoting). Также на Windows 7 (если на ней установлен Windows Management Framework 3.0, который включает в себя Windows PowerShell 3.0) и на Windows 8 мы можем ограничить число команд, доступных для выполнения через эту конфигурацию сеанса.

Для этого нам нужно сначала создать PSSessionConfigurationFile. Сделать это можно при помощи команды New-PSSessionConfigurationFile.

New-PSSessionConfigurationFile -Path c:\PSConf.pssc -SessionType RestrictedRemoteServer -LanguageMode NoLanguage -ModulesToImport Microsoft.PowerShell.Management -VisibleCmdlets Get-Process,Stop-Process

02

Эта команда включает в себя следующие параметры:

-Path c:\PSConf.pssc  — путь и имя файла, куда следует сохранить указанные в команде параметры. Этот файл нам пригодится при регистрации конфигурации.

-SessionType RestrictedRemoteServer — этот параметр делает доступными только те функции, которые необходимые для работы сессии. Таким образом в сессии не будут доступны команды для импортирования других модулей.

-LanguageMode NoLanguage — так как нам не потребуется использование каких-либо языковых конструкций, этим параметром мы запрещаем использование элементов языка PowerShell.

-ModulesToImport Microsoft.PowerShell.Management — нужные нам командлеты, а именно — Get-Process и Stop-Process, находятся в модуле Microsoft.PowerShell.Management, поэтому мы указываем данный параметр для импорта данного модуля.

-VisibleCmdlets Get-Process,Stop-Process — так как из всего модуля Microsoft.PowerShell.Management требуются всего два командлета, этим параметром мы делаем так, что из всех командлетов модуля доступны будут только эти два.

Далее нам нужно зарегистрировать конфигурацию на компьютерах.

Register-PSSessionConfiguration -Name term.process -AccessMode Remote -Path C:\PSConf.pssc -SecurityDescriptorSddl ‘O:NSG:BAD:P(A;;GX;;;SID_группы_process_termination_users)(A;;GA;;;BA)S:P(AU;FA;GA;;;WD)(AU;SA;GXGW;;;WD)’

03

Команда содержит следующие параметры:

-Name term.process — имя PSSessionConfiguration.

-AccessMode Remote — параметр указывает, что конфигурация будет поддерживать удаленные подключения.

-Path C:\PSConf.pssc — путь к ранее созданному нами файлу, содержащему дополнительные параметры конфигурации.

-SecurityDescriptorSddl ‘O:NSG:BAD:P(A;;GX;;;SID_группыprocess_termination_users)(A;;GA;;;BA)S:P(AU;FA;GA;;;WD)(AU;SA;GXGW;;;WD)’ — значение дескриптора безопасности в формате SDDL. Этой командой, в дополнение к стандартным разрешениям, мы предоставляем группе process_termination_users право Invoke. Хотя, возможно, удобнее было бы использовать параметр -ShowSecurityDescriptorUI, который позволяет задавать разрешения безопасности при помощи графического интерфейса, использование параметра -SecurityDescriptorSddl дает нам возможность удаленной конфигурации и автоматизации этой задачи. В строке определения дескриптора безопасности замените строку «SIDгруппы_process_termination_users» на фактическое значение SID вашей группы.

В случае, если на компьютере установлена Windows XP (а на ней установлен Windows PowerShell 2.0, так как в первой версии Remoting отсутствует), то наши возможности значительно уменьшаются. Все, что мы можем сделать в этом случае — это зарегистрировать конфигурацию, включающую в себя полную функциональность. Иным вариантом является описание конфигурации на C#. Однако, мы по-прежнему можем воспользоваться параметром -SecurityDescriptorSddl.

Также стоит помнить, что в случае Windows XP мы не сможем зарегистрировать конфигурацию удаленно.

Команда будет выглядеть следующим образом:

Register-PSSessionConfiguration -Name term.process  -SecurityDescriptorSddl ‘O:NSG:BAD:P(A;;GX;;;SID_группы_process_termination_users)(A;;GA;;;BA)S:P(AU;FA;GA;;;WD)(AU;SA;GXGW;;;WD)’

035

Теперь, когда мы зарегистрировали конфигурации на всех требуемых компьютерах, пользователь сможет прерывать нужные процессы при помощи следующей команды:

Invoke-Command -ComputerName comp-1,comp-2,comp-3 -ConfigurationName term.process -ScriptBlock {Get-Process -Name some_process | Stop-Process}

04

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


Страницы в социальных сетях:

Twitter: https://twitter.com/vsseth
Facebook: https://fb.com/inpowershell
VKontakte: https://vk.com/inpowershell


Реклама

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход /  Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход /  Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход /  Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход /  Изменить )

Connecting to %s