Как проверить, существует ли цель символьной ссылки в каталоге? - PullRequest
0 голосов
/ 26 марта 2019

Я разрабатываю приложение для Windows, предназначенное для Windows XP.

Мое приложение должно разрешать символические ссылки на файлы и папки.Чтобы проверить, существует ли цель, я могу использовать CreateFile для символических ссылок на файлы.Но после того, как я искал в Google и MSDN целый день, я обнаружил, что если мне нужно получить дескриптор каталога, мне нужно использовать флаг FILE_FLAG_BACKUP_SEMANTICS.Это требует моего приложения для запроса более высоких привилегий.Я знаю, что многие пользователи недовольны таким поведением, поэтому мне нужно найти другой способ проверить, существует ли цель символической ссылки каталога.

Я также прочитал Эффекты символьной ссылки на функции файловых систем..Другие функции, которые я могу использовать для проверки существования файла или каталога, проверяют только символическую ссылку, а не ее цель.Я пробовал некоторые функции, такие как _access_s.Они также проверяют только символическую ссылку.

Поэтому мой вопрос заключается в том, существует ли какой-либо способ проверить, существует ли цель символической ссылки каталога, не требуя более высоких привилегий.

1 Ответ

2 голосов
/ 26 марта 2019

Я мог бы использовать CreateFile для символического файла, чтобы получить дескриптор файла и затем проверьте, существует файл или нет.

Если FILE_FLAG_OPEN_REPARSE_POINT не указано в вызове CreateFile, и вы получите дескриптор файла, это означает, что символическая ссылка / точка монтирования существует. поэтому уже не нужно проверять что-то. если вызов не удался, потому что цель не существует, последняя ошибка будет ERROR_FILE_NOT_FOUND или ERROR_PATH_NOT_FOUND (может быть также ERROR_BAD_PATHNAME)

о FILE_FLAG_BACKUP_SEMANTICS - это очень плохой дизайн CreateFile API. это внутренний вызов API NtCreateFile. FILE_FLAG_BACKUP_SEMANTICS сопоставлен с FILE_OPEN_FOR_BACKUP_INTENT CreateOptions флагом. этот флаг отмечен внутри IopCheckBackupRestorePrivilege

Эта функция будет определять, запрашивает ли звонящий какой-либо доступ это может быть удовлетворено привилегиями резервного копирования или восстановления, и если да, выполнить проверки привилегий. Если проверка привилегий прошла успешно, то соответствующие биты будут перемещены из RemainingDesiredAccess поле в структуре AccessState и помещены в Ранее поле «Предоставленный доступ».

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

, поэтому, даже если у вызывающей стороны нет ни одной, ни обеих привилегий резервного копирования или восстановления, это не создает проблем.

, но NtCreateFile имеют следующие 2 параметра: FILE_DIRECTORY_FILE и FILE_NON_DIRECTORY_FILE - это позволяет указать, хотим ли мы создать / открыть файл или каталог. если мы (потенциальные) создаем новый элемент - нам нужно указать, хотим ли мы создавать каталог (FILE_DIRECTORY_FILE должно быть установлено) или не каталог (FILE_NON_DIRECTORY_FILE, но по умолчанию предполагается этот случай - так необязательно). когда мы открываем файл - оба эти флага являются необязательными - если мы не указываем оба - это означает, что нам все равно, открываем ли мы файл или каталог. если мы заботимся об этом - нужно указать один из этих флагов.

но если посмотреть на CreateFile, то видно, что не существует опции, экспликация которой сопоставлена ​​с FILE_DIRECTORY_FILE или FILE_NON_DIRECTORY_FILE. CreateFile использовать для этой опции. FILE_FLAG_BACKUP_SEMANTICS. это очень не логично с моей точки зрения, но как есть. когда FILE_FLAG_BACKUP_SEMANTICS не установлено CreateFile pass FILE_NON_DIRECTORY_FILE опция для NtCreateFile. когда он установлен - пропуск FILE_OPEN_FOR_BACKUP_INTENT и , а не пропуск FILE_NON_DIRECTORY_FILE это позволит вам открыть файл или каталог. и нет опции для набора FILE_DIRECTORY_FILE - потому что этот CreatrFile не может создать новый каталог.

поэтому вместо этого есть отдельная опция для FILE_DIRECTORY_FILE и FILE_NON_DIRECTORY_FILE, CreateFile злоупотребления FILE_FLAG_BACKUP_SEMANTICS, которые имеют здесь двойной смысл

...