У кого-нибудь есть идеи, как получить SACL на удаленном сервисе с использованием C #? Я пробовал множество разных методов, и в основном ничего не работает. Я могу получить DACL и SACL на локальном компьютере, но, похоже, получить их на удаленном компьютере невозможно.
Я создал класс ServiceSecurity
, который наследуется от NativeObjectSecurity
и во многом похож на класс RegistrySecurity
. Ниже приведены два конструктора, которые у меня есть:
public ServiceSecurity(string serviceName, AccessControlSections includeSections)
: base(true, ResourceType.Service, serviceName, includeSections, null, null)
{
}
public ServiceSecurity(System.Runtime.InteropServices.SafeHandle handle, AccessControlSections includeSections)
: base(true, ResourceType.Service, handle, includeSections)
{
}
Первый использует имя службы, а второй ожидает дескриптор службы. Очевидно, что первый работает нормально, чтобы получить DACL и SACL, потому что все это локально, но чтобы добраться до удаленной машины, я использую класс ServiceController
, чтобы найти службу на удаленной машине. Получив его, я передаю свойство ServiceHandle
службы построенному классу ServiceSecurity
, после чего получаю исключение неавторизованного доступа, которое кажется неправильным, поскольку моя учетная запись пользователя является администратором домена для домен и локальный администратор на поле назначения. У меня также есть право SeSecurityPrivilege
, которое должно дать мне доступ.
У кого-нибудь есть идеи? Кажется, что SafeHandle
, который я получаю, не прав, но свойства SafeHandle
говорят, что он не закрыт и что он является допустимым дескриптором, поэтому я не совсем знаю, что происходит.
Вот код, который я использую, чтобы попытаться получить данные:
ServiceSecurity sSec = new ServiceSecurity(services[i].ServiceName, accessSections);
string outputData = sSec.GetSecurityDescriptorSddlForm(accessSections);
Вышеуказанное будет работать для локальных разрешений и настроек аудита (DACL и SACL). Но он предназначен для работы на локальной машине. Если я сделаю это вместо:
ServiceSecurity sSec = new ServiceSecurity(services[i].ServiceHandle, accessSections);
string outputData = sSec.GetSecurityDescriptorSddlForm(accessSections);
Сбой конструктора ServiceSecurity на локальном и удаленном серверах для SACL следующим образом, но все же работает для DACL:
System.UnauthorizedAccessException: Attempted to perform an unauthorized operation.
at System.Security.AccessControl.Win32.GetSecurityInfo(ResourceType resourceType, String name, SafeHandle handle, AccessControlSections accessControlSections, RawSecurityDescriptor& resultSd)
at System.Security.AccessControl.NativeObjectSecurity.CreateInternal(ResourceType resourceType, Boolean isContainer, String name, SafeHandle handle, AccessControlSections includeSections, Boolean createByName, ExceptionFromErrorCode exceptionFromErrorCode, Object exceptionContext)
at System.Security.AccessControl.NativeObjectSecurity..ctor(Boolean isContainer, ResourceType resourceType, SafeHandle handle, AccessControlSections includeSections)
Для accessSections я указываю только один из AccessControlSections
, будь то Аудит или Доступ и Аудит, похоже, дает сбой каждый раз, когда я передаю ServiceHandle
.
Обновление:
Так что, возможно, вопрос действительно должен быть: как мне получить дескриптор службы, обладающей правами ACCESS_SYSTEM_SECURITY
, чтобы я мог получить SACL?