Как перечислить все SID, которым была назначена указанная пользовательская привилегия?C ++ - PullRequest
0 голосов
/ 10 июля 2019

Я нахожусь на Windows и C ++, я хотел бы восстановить все SID для данной привилегии.Чтобы восстановить SID, я использовал следующие методы: LsaOpenPolicy, LsaEnumerateAccountsWithUserRight и ConvertSidToStringSidA.Проблема возникает из-за метода ConvertSidToStringSidA, который возвращает ошибку: Неверный SID.Вот код, который я использовал:

    LSA_HANDLE lsaPolicyHandle;
    LSA_OBJECT_ATTRIBUTES lsaObjectAttributes;
    ZeroMemory(&lsaObjectAttributes, sizeof (lsaObjectAttributes));
    NTSTATUS ntStatus;

    ntStatus=LsaOpenPolicy(nullptr,&lsaObjectAttributes, POLICY_ALL_ACCESS, &lsaPolicyHandle);

    //Here ntstatus == ERROR_SUCCESS
    if(ntStatus != ERROR_SUCCESS)
    {
        qDebug()<<"error";
    }
    LSA_UNICODE_STRING lsaUSerRight;
    DWORD64 dwLen=0;
    LPCWSTR pcwStr = L"SeServiceLogonRight";
    dwLen = wcslen(pcwStr);
    lsaUSerRight.Buffer = const_cast<wchar_t*>(pcwStr);
    lsaUSerRight.Length = static_cast<unsigned short>(dwLen) * sizeof(WCHAR);
    lsaUSerRight.MaximumLength= static_cast<unsigned short>(dwLen+1) *sizeof(WCHAR);

    LSA_ENUMERATION_INFORMATION pEnumInfo;
    ULONG ulCount;
    ntStatus=LsaEnumerateAccountsWithUserRight(lsaPolicyHandle,
                                               &lsaUSerRight,
                                               reinterpret_cast<PVOID*>(&pEnumInfo),
                                               &ulCount);
    //Here ntstatus == ERROR_SUCCESS
    if(ntStatus != ERROR_SUCCESS)
    {
       qDebug()<<"error";
    }
    //here pEnumInfo has an adress 0x45FF34c et ulCount = 2
    LPSTR lpStringSid;
    PSID pSid=pEnumInfo.Sid;

   //Here invalid SID  
    BOOL bResultConvert=ConvertSidToStringSidA(pSid, &lpStringSid);

    if(bResultConvert==0)
    {
        qDebug()<<"error";
    }

1 Ответ

3 голосов
/ 10 июля 2019

LsaEnumerateAccountsWithUserRight заполняет указатель на LSA_ENUMERATION_INFORMATION, поэтому вам нужно изменить это:

LSA_ENUMERATION_INFORMATION pEnumInfo;

на это:

LSA_ENUMERATION_INFORMATION *pEnumInfo;

и чтобы получить доступ к первому возвращенному SID, измените это:

PSID pSid=pEnumInfo.Sid;

на следующее:

PSID pSid=pEnumInfo->Sid;

Тогда это сработает.

Не забудьте освободить структурывозвращается с LsaFreeMemory, когда вы закончите с ними и очистите с помощью LsaClose.

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