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();
}
}
}
}