using System; namespace ZeroLevel.Services.Impersonation { /// /// Реализует исполнение произвольного кода от прав указанного процесса /// public class ProcessImpersonationExecutor : IImpersonationExecutor { private string _processName = string.Empty; private int _pid = -1; public ProcessImpersonationExecutor(string processName) { _processName = processName; } public ProcessImpersonationExecutor(int pid) { _pid = pid; } /// /// Исполнение кода /// /// Тип передаваемого аргумента /// Делегат /// Аргумент public void ExecuteCode(Action action, T arg) { using (Impersonation imp = new Impersonation()) { if (!String.IsNullOrWhiteSpace(_processName)) { imp.ImpersonateByProcess(_processName); } else if (_pid > -1) { imp.ImpersonateByProcess(_pid); } else { throw new Exception("Нет данных для идентификации процесса. Для копирования прав процесса требуется указать его имя или идентификатор."); } action(arg); } } /// /// Исполнение кода /// /// Тип передаваемого аргумента /// Делегат public void ExecuteCode(Action action) { using (Impersonation imp = new Impersonation()) { if (!String.IsNullOrWhiteSpace(_processName)) { imp.ImpersonateByProcess(_processName); } else if (_pid > -1) { imp.ImpersonateByProcess(_pid); } else { throw new Exception("Нет данных для идентификации процесса. Для копирования прав процесса требуется указать его имя или идентификатор."); } action(); } } } }