Установить правила доступа к сервису - PullRequest
0 голосов
/ 30 мая 2018

Я хочу иметь возможность sc sdset $serviceName $accessString, чтобы позволить конкретному пользователю остановить и запустить службу, см. Также этот вопрос .Но я хочу сделать это без командной строки и с помощью c ++, используя вместо этого Windows API.

Я уже получил SecurityDescriptor и SecurityInfo .Теперь я терплю неудачу, добавляя это новое правило в сервис.Я нашел этот ресурс , но мне неясно, как я могу превратить свой SecurityDescriptor в структуру EXPLICIT_ACCESS для использования с SetEntriesInAcl ().

1 Ответ

0 голосов
/ 30 мая 2018

здесь главный вопрос - как решить - какая учетная запись (SID) должна иметь права.если хотите разрешить NetworkService сам запуск / остановка / пауза - нужно SERVICE_START, SERVICE_STOP, SERVICE_PAUSE_CONTINUE - так на самом деле GENERIC_EXECUTE если посмотреть Служба безопасности и прав доступа

мы можем разработать, например, следующий DACL :

  • GENERIC_ALL для LocalSystem и Администраторы
  • GENERIC_READ для Для всех
  • GENERIC_READ | GENERIC_EXECUTE для NetworkService

-

#include <sddl.h>

ULONG afe(PCWSTR lpServiceName)
{
    ULONG err = 0;

    if (SC_HANDLE hSCManager = OpenSCManagerW(0, 0, 0))
    {
        if (SC_HANDLE hService = OpenService(hSCManager, lpServiceName, WRITE_DAC))
        {
            PSECURITY_DESCRIPTOR SecurityDescriptor;
            if (ConvertStringSecurityDescriptorToSecurityDescriptorW(
                L"D:(A;;GA;;;SY)" // SDDL_LOCAL_SYSTEM -> SDDL_GENERIC_ALL
                L"(A;;GA;;;BA)" // SDDL_BUILTIN_ADMINISTRATORS -> SDDL_GENERIC_ALL
                L"(A;;GR;;;WD)" // SDDL_EVERYONE -> SDDL_GENERIC_READ
                L"(A;;GRGX;;;NS)", // SDDL_NETWORK_SERVICE -> SDDL_GENERIC_READ|SDDL_GENERIC_EXECUTE
                SDDL_REVISION_1, &SecurityDescriptor, 0))
            {
                if (!SetServiceObjectSecurity(hService, DACL_SECURITY_INFORMATION, SecurityDescriptor))
                {
                    err = GetLastError();
                }
                LocalFree(SecurityDescriptor);

            }
            else
            {
                err = GetLastError(); 
            }

            CloseServiceHandle(hService);
        }
        else
        {
            err = GetLastError();
        }
        CloseServiceHandle(hSCManager);
    }
    else
    {
        err = GetLastError();
    }

    return err;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...