Почему ConvertStringSidToSid не может преобразовать SID строки? - PullRequest
0 голосов
/ 27 февраля 2019

Я пытаюсь преобразовать SID в строку и обратно, используя ConvertSidToStringSid и ConvertStringSidToSid , но преобразование не выполняется с кодом ошибки 1337.

Тестовый SID, который я создал, не смог выполнить обратную передачу - это вызвало сбой ConvertStringSidToSid с кодом 1337 (ERROR_INVALID_SID).Похоже, что Windows представляет полномочия идентификаторов со слишком большим количеством байтов, используя шестнадцатеричное вместо десятичного в строковом представлении и дроссели ConvertStringSidToSid.В документации по ConvertStringSidToSid, указанной выше, сказано: «Вы можете использовать эту функцию для получения SID, который функция ConvertSidToStringSid преобразовала в строковый формат», что говорит о том, что то, что я пытаюсь сделать, должно поддерживаться.Есть ли лучший способ преобразовать SID туда и обратно в их строковое представление?

Вот минимальный пример, который демонстрирует проблему:

#include "pch.h"
#include <iostream>
#include <windows.h>
#include <sddl.h>

int main()
{
    SID_IDENTIFIER_AUTHORITY sid_id_auth = { 1,2,3,4,5,6 };
    PSID sid;
    PSID new_sid;
    LPWSTR string_sid;

    // Create a new SID with the given ID authority and no sub-authorities
    if (!AllocateAndInitializeSid(&sid_id_auth, 0, 0, 0, 0, 0, 0, 0, 0, 0, &sid)) {
        std::cout << "Failed to allocate SID: error code " << GetLastError() << std::endl;
        return 1;
    }

    // Stringify and print
    if (!ConvertSidToStringSidW(sid, &string_sid)) {
        std::cout << "Failed to convert to string: error code " << GetLastError() << std::endl;
        FreeSid(sid);
        return 2;
    }
    std::wcout << string_sid << std::endl;

    // Destringify and print
    if (ConvertStringSidToSidW(string_sid, &new_sid)) {
        std::cout << "Success" << std::endl;
    }
    else {
        std::cout << "Failed: error code " << GetLastError() << std::endl;
    }

    // Clean up
    LocalFree(string_sid);
    LocalFree(new_sid);
    FreeSid(sid);
}

На моем компьютере (Windows 10.0.16299,Visual Studio 15.9.7), печатает:

S-1-0x10203040506
Failed: error code 1337

Ответы [ 2 ]

0 голосов
/ 27 февраля 2019

Вам не хватает значения идентификатора-авторитета в компонентах SID : S-1-0x10203040506.Таким образом, вы получите ERROR_INVALID_SID (1337).

После добавления значения идентификатора-авторитета, здесь я использую SECURITY_NT_AUTHORITY (используется с Windows общеизвестными SID ): 5, как показано ниже.Ошибка устранена.

if (ConvertStringSidToSidW(L"S-1-5-0x10203040506", &new_sid)) {
    std::cout << "Success" << std::endl;
}
else {
    std::cout << "Failed: error code " << GetLastError() << std::endl;
}
0 голосов
/ 27 февраля 2019

Вы передаете недопустимое значение для nSubAuthorityCount в AllocateAndInitializeSid.
В документации указано:

nSubAuthorityCount

Указываетколичество подчиненных органов для размещения в SID.Этот параметр также определяет, сколько из параметров субавторизации имеют значимые значения.Этот параметр должен содержать значение от 1 до 8.

и

S- R - I - S

В этой записи буквенный символ «S» идентифицирует последовательность цифр как SID, R - уровень редакции, I - это значение авторитетного идентификатора, а S … - одно или несколько значений субавторийности.

Передача 0 поэтому неверна, даже если AllocateAndInitializeSidвозвращает TRUE, что могло быть недосмотром.

ConvertSidToStringSidW, похоже, также не проверяет это требование, поэтому преобразование завершается успешно.
ConvertStringSidToSidW завершается неудачно, поскольку ожидает строку вформат S- R - I - S .

...