Я пытаюсь преобразовать 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