Здравствуйте, B0FEE664, Вы писали:
BFE>Возможна ли ситуация при которой std::filesystem::copy_file скопирует файл, но при этом у процесса нет прав доступа на чтение файла?
Оффтоп. std::filesystem — это какой-то выкидыш здравого смысла, стараюсь держаться от него подальше
Здравствуйте, B0FEE664, Вы писали:
BFE>Возможна ли ситуация при которой std::filesystem::copy_file скопирует файл, но при этом у процесса нет прав доступа на чтение файла?
ну попробуй из под юзера скопировать какой нибудь файл админа на который стоит запрет чтения от левых
Здравствуйте, m2user, Вы писали:
BFE>>Возможна ли ситуация при которой std::filesystem::copy_file скопирует файл, но при этом у процесса нет прав доступа на чтение файла?
M>Это зависит от нижележащего API операционной системы. Т.е. обычно нет, но можно представить себе некую экзотическую ОС, где это было бы возможно.
Win32 CopyFile ничего по этому поводу не говорит, надо проверять. Но могу предположить, что она вполне может скопировать файл, скопировав и права доступа — т.е. к результирующему файлу доступа тоже не будет у пользователя, который её вызвал. Можно предположить, что функция обломается с копированием, если атрибуты безопасности не поддерживаются файловой системой в точке назначения. Маловероятно, но можно попробовать
M>Но могу предположить, что она вполне может скопировать файл, скопировав и права доступа — т.е. к результирующему файлу доступа тоже не будет у пользователя, который её вызвал.
Ну да, копируешь на флешку/сетевой каталог/смонтированный vhd образ и уносишь на другой ПК.
Что касается прав, то при создании нового файла их устанавливает (копирует с оригинала) сам процесс. Т.е. если у него есть права на изменение прав, то он же их потом и поменяет на нужные ему.
(здесь я исхожу из предположения, что CopyFile просто открывает файл (CreateFile) и копирует контент в новое место).
Здравствуйте, m2user, Вы писали:
M>>Но могу предположить, что она вполне может скопировать файл, скопировав и права доступа — т.е. к результирующему файлу доступа тоже не будет у пользователя, который её вызвал.
M>Ну да, копируешь на флешку/сетевой каталог/смонтированный vhd образ и уносишь на другой ПК.
Вполне могут учитываться свойства тома
M>Что касается прав, то при создании нового файла их устанавливает (копирует с оригинала) сам процесс. Т.е. если у него есть права на изменение прав, то он же их потом и поменяет на нужные ему.
При создании права создаются по дефолту в зависимости от учетки (или вроде с hTemplateFileб если задан). При копировании права копируются с исходного файла
M>(здесь я исхожу из предположения, что CopyFile просто открывает файл (CreateFile) и копирует контент в новое место).
Это неверное предположение, CreateFile/ReadFile/WriteFile может делать и пользовательский код. Операционная система, я уверен, располагает и другими механизмами. Не уверен, но могу предположить, что бэкап вполне возможно делается без прав доступа к содержимому файла
Здравствуйте, Великий Мессия, Вы писали:
BFE>>Возможна ли ситуация при которой std::filesystem::copy_file скопирует файл, но при этом у процесса нет прав доступа на чтение файла? ВМ>ну попробуй из под юзера скопировать какой нибудь файл админа на который стоит запрет чтения от левых
Здравствуйте, Великий Мессия, Вы писали:
BFE>>Возможна ли ситуация при которой std::filesystem::copy_file скопирует файл, но при этом у процесса нет прав доступа на чтение файла? ВМ>ну попробуй из под юзера скопировать какой нибудь файл админа на который стоит запрет чтения от левых
С правами, кстати, ещё смешнее: права файла узнать можно, но вот узнать, может ли приложение открыть файл на чтение — нельзя.
M>>(здесь я исхожу из предположения, что CopyFile просто открывает файл (CreateFile) и копирует контент в новое место).
M>Это неверное предположение, CreateFile/ReadFile/WriteFile может делать и пользовательский код. Операционная система, я уверен, располагает и другими механизмами.
Если интересно, то можно поискать в исходниках w2k/w2k3, которые валялись в интернетах.
(ну или call stack отладчиком посмотреть).
M>Не уверен, но могу предположить, что бэкап вполне возможно делается без прав доступа к содержимому файла
Для пофайлового backup/restore обычно используется backup/restore privilege.
Привиллегия назнается группе через локальные политики и дает право читать данные и метаданные в обход прав на файловой системе.
(robocopy например умеет её использовать)
Но в контексте вопроса ТС я не рассматриваю это как копирование без "прав доступа на чтение файла".
Права у процесса есть, просто получены другим путем.
BFE>но вот узнать, может ли приложение открыть файл на чтение — нельзя.
Хм, что ты имеешь в виду (и для какой ОС)?
В общем случае эффективные права зависят от многих факторов, среди которых не только security атрибуты файла, но и полный набор групп в токене процесса (потока).
Здравствуйте, m2user, Вы писали:
BFE>>но вот узнать, может ли приложение открыть файл на чтение — нельзя.
M>Хм, что ты имеешь в виду (и для какой ОС)? M>В общем случае эффективные права зависят от многих факторов, среди которых не только security атрибуты файла, но и полный набор групп в токене процесса (потока).
Есть такая функция: std::filesystem::status
она возвращает std::filesystem::file_status
у этого типа есть метод std::filesystem::file_status::permissions
который возвращает значение перечисления std::filesystem::perms, которое перечислением не является, а, как обычно, следуя дебильной практике, является набором флагов.
Как бы там ни было, возможность узнать права на файл можно: ссылка, но что с ними делать изнутри программы? Основываясь на значении флагов узнать, возможно ли открыть файл на чтение/запись, возможно ли скопировать или переместить файл — нет такой возможности.
В std::filesystem всё продумано!
Ну и вот задача: мне надо скопировать файл. Если таргет это symlink или каталог, то они должны быть удалены перед копированием. Мне надо знать пройдёт ли операция копирования до того, как таргет (symlink или каталог) будут удалены. Как это сделать не открывая исходный файл на чтение?
BFE>Ну и вот задача: мне надо скопировать файл. Если таргет это symlink или каталог, то они должны быть удалены перед копированием. Мне надо знать пройдёт ли операция копирования до того, как таргет (symlink или каталог) будут удалены. Как это сделать не открывая исходный файл на чтение?
скопировать (под временным именем, в целевую папку) -> удалить старое -> переименовать.
Или с hardlink поиграть, но копирование в любом случае должно быть первое.
Копирование может не пройти и по причинам "сетевое соединение оборвалось" / "место на диске кончилось, хотя 5 миллисекунд назад оно было" и по 100500 других причин.
Здравствуйте, B0FEE664, Вы писали:
ВМ>>ну попробуй из под юзера скопировать какой нибудь файл админа на который стоит запрет чтения от левых BFE>С правами, кстати, ещё смешнее: права файла узнать можно, но вот узнать, может ли приложение открыть файл на чтение — нельзя.
Это бессмысленно всё равно. Ну допустим ты это как-то узнал до открытия файла. И что дальше? Какая разница-то? Что с этой информацией можно сделать полезного?
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Здравствуйте, Chorkov, Вы писали:
BFE>>Ну и вот задача: мне надо скопировать файл. Если таргет это symlink или каталог, то они должны быть удалены перед копированием. Мне надо знать пройдёт ли операция копирования до того, как таргет (symlink или каталог) будут удалены. Как это сделать не открывая исходный файл на чтение?
C>скопировать (под временным именем, в целевую папку) -> удалить старое -> переименовать.
Думал сначала переименовать, а потом удалить таргет, но такой вариант лучше.
Наверное, даже, лучше так: скопировать с временным именем, переименовать таргет, переименовать скопированный файл, удалить переименованный таргет...
C>Или с hardlink поиграть, но копирование в любом случае должно быть первое.
Это завязываться на файловую систему...
C>Копирование может не пройти и по причинам "сетевое соединение оборвалось" / "место на диске кончилось, хотя 5 миллисекунд назад оно было" и по 100500 других причин.
Это известно. Ещё и таргет может создаваться, скажем, по таймеру...
Здравствуйте, ·, Вы писали:
ВМ>>>ну попробуй из под юзера скопировать какой нибудь файл админа на который стоит запрет чтения от левых BFE>>С правами, кстати, ещё смешнее: права файла узнать можно, но вот узнать, может ли приложение открыть файл на чтение — нельзя. ·>Это бессмысленно всё равно. Ну допустим ты это как-то узнал до открытия файла. И что дальше? Какая разница-то? Что с этой информацией можно сделать полезного?
Тогда можно удалять таргет, например.
Здравствуйте, B0FEE664, Вы писали:
BFE>·>Это бессмысленно всё равно. Ну допустим ты это как-то узнал до открытия файла. И что дальше? Какая разница-то? Что с этой информацией можно сделать полезного? BFE>Тогда можно удалять таргет, например.
Нельзя, конечно, если ты пишешь код с защитой от сбоев. А иначе... с ровно таким же успехом таргет можно удалять и без проверки.
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Здравствуйте, ·, Вы писали:
BFE>>·>Это бессмысленно всё равно. Ну допустим ты это как-то узнал до открытия файла. И что дальше? Какая разница-то? Что с этой информацией можно сделать полезного? BFE>>Тогда можно удалять таргет, например. ·>Нельзя, конечно, если ты пишешь код с защитой от сбоев. А иначе... с ровно таким же успехом таргет можно удалять и без проверки.
При работе с файловой системой от всех возможных сбоев защититься невозможно, насколько я понимаю, но вот ситуация с правами — она довольно распространённая и мне кажется логичным проверить возможность копирования до удаления таргета просто потому, что эта ситуация встречается часто по сравнению с другими сбоями. А это даже не сбой, а разумное поведение. По крайней мере я бы ожидал от, скажем, файлового менеджера, что такая проверка делается.
BFE>Мне надо знать пройдёт ли операция копирования до того, как таргет (symlink или каталог) будут удалены. Как это сделать не открывая исходный файл на чтение?
Хм, тебе прниципиально нужно избежать "лишнего" открытия на чтение?
Так то, файловый дескриптор на чтение (оригинальный файл) и файловый дескриптор на запись/удаление (копия с временным именем) это самый очевидный способ определить есть ли достаточные права.