Преобразование из SECURITY_DESCRIPTOR в строку и обратно не работает

0

Простая тестовая программа для иллюстрации идеи:

"MyBuildSecurityDescriptor" - это функция, скопированная здесь для создания базового дескриптора безопасности.

PSECURITY_DESCRIPTOR pSecDesc = MyBuildSecurityDescriptor();

// Convert to a PISECURITY_DESCRIPTOR to view the contents.
PISECURITY_DESCRIPTOR piSecDesc = (PISECURITY_DESCRIPTOR)pSecDesc;

LPTSTR szSecDesc;
ConvertSecurityDescriptorToStringSecurityDescriptor(pSecDesc, SECURITY_DESCRIPTOR_REVISION,
                                                    DACL_SECURITY_INFORMATION | GROUP_SECURITY_INFORMATION | OWNER_SECURITY_INFORMATION | SACL_SECURITY_INFORMATION,
                                                    &szSecDesc,
                                                    NULL);

// At this point szSecDesc has the correct security descriptor in it.
// "D:(A;;KR;;;WD)(A;;KA;;;BA)" for those interested.

// Now to convert back from string version.
PSECURITY_DESCRIPTOR pSecurityDescriptor;
ConvertStringSecurityDescriptorToSecurityDescriptor(szSecDesc, SDDL_REVISION_1, &pSecurityDescriptor, NULL);

// Convert to a PISECURITY_DESCRIPTOR to view the contents.
PISECURITY_DESCRIPTOR piNewSecDesc = (PISECURITY_DESCRIPTOR)pSecurityDescriptor;

Вот отладочные представления в visual studio для piSecDesc и piNewSecDesc для вышеуказанной программы; Изображение 174551Изображение 174551

Поэтому мой вопрос: почему SECURITY_DESCRIPTOR после конверсий не имеет правильных данных?

Учитывая, что это состояние (о ConverStringSecurityDescriptorToSecurityDescriptor) "Эта функция извлекает дескриптор безопасности, который преобразует функцию ConvertSecurityDescriptorToStringSecurityDescriptor в строковый формат". Я бы предположил, что эта простая программа будет работать.

Некоторый контекст. Моя работа требует, чтобы я получил SECURITY_DESCRIPTOR, затем передал это через трубку в другую программу. Самый простой способ - преобразовать в строку, передать ее, а затем конвертировать обратно с другой стороны.

  • 0
    Вы проверяли возвращаемые значения функций Convert?
Теги:
winapi

1 ответ

1
Лучший ответ

Я сильно подозреваю, что различия, которые вы видите, - это потому, что MyBuildSecurityDescriptor создает абсолютный дескриптор безопасности, а ConvertStringSecurityDescriptorToSecurityDescriptor создает самооценку дескриптора безопасности. Вы можете преобразовать MakeAbsoluteSD дескрипторы безопасности в абсолютные дескрипторы безопасности, используя MakeAbsoluteSD, но, честно говоря, нет никакой реальной точки; все API Windows принимают абсолютные или независимые дескрипторы безопасности.

MSDN явно указывает в описании структуры SECURITY_DESCRIPTOR:

Поскольку внутренний формат дескриптора безопасности может меняться, мы рекомендуем, чтобы приложения не изменяли структуру SECURITY_DESCRIPTOR напрямую. Для создания и управления дескриптором безопасности используйте функции, перечисленные в разделе "См. Также".

Я бы использовал функцию IsValidSecurityDescriptor (а также проверку возвращаемых значений), чтобы проверить последовательность ваших дескрипторов.

  • 0
    Именно так. В дескрипторе относительной безопасности «указатели» содержат смещение, а не фактический указатель. Отладчик, не зная об этом, пытается и не может интерпретировать их как указатели.
  • 0
    Как раз то, что мне было нужно! Хотя я полагаю, что на самом деле мне не нужно использовать MakeAbsoluteSD, если все API принимают любой тип. В реальном коде я проверяю возвращаемые значения, поэтому некоторые из моих недоразумений возникли, когда они вернулись успешно, но я добавлю проверки для IsValidSecurityDescriptor. Спасибо за вашу помощь.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню