Простая тестовая программа для иллюстрации идеи:
"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 для вышеуказанной программы;
Поэтому мой вопрос: почему SECURITY_DESCRIPTOR после конверсий не имеет правильных данных?
Учитывая, что это состояние (о ConverStringSecurityDescriptorToSecurityDescriptor) "Эта функция извлекает дескриптор безопасности, который преобразует функцию ConvertSecurityDescriptorToStringSecurityDescriptor в строковый формат". Я бы предположил, что эта простая программа будет работать.
Некоторый контекст. Моя работа требует, чтобы я получил SECURITY_DESCRIPTOR, затем передал это через трубку в другую программу. Самый простой способ - преобразовать в строку, передать ее, а затем конвертировать обратно с другой стороны.
Я сильно подозреваю, что различия, которые вы видите, - это потому, что MyBuildSecurityDescriptor
создает абсолютный дескриптор безопасности, а ConvertStringSecurityDescriptorToSecurityDescriptor
создает самооценку дескриптора безопасности. Вы можете преобразовать MakeAbsoluteSD
дескрипторы безопасности в абсолютные дескрипторы безопасности, используя MakeAbsoluteSD
, но, честно говоря, нет никакой реальной точки; все API Windows принимают абсолютные или независимые дескрипторы безопасности.
MSDN явно указывает в описании структуры SECURITY_DESCRIPTOR:
Поскольку внутренний формат дескриптора безопасности может меняться, мы рекомендуем, чтобы приложения не изменяли структуру SECURITY_DESCRIPTOR напрямую. Для создания и управления дескриптором безопасности используйте функции, перечисленные в разделе "См. Также".
Я бы использовал функцию IsValidSecurityDescriptor
(а также проверку возвращаемых значений), чтобы проверить последовательность ваших дескрипторов.