std::filesystem::copy_file и права
От: B0FEE664  
Дата: 10.07.25 17:59
Оценка:
Возможна ли ситуация при которой std::filesystem::copy_file скопирует файл, но при этом у процесса нет прав доступа на чтение файла?
И каждый день — без права на ошибку...
Re: std::filesystem::copy_file и права
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 10.07.25 18:01
Оценка: -2
Здравствуйте, B0FEE664, Вы писали:

BFE>Возможна ли ситуация при которой std::filesystem::copy_file скопирует файл, но при этом у процесса нет прав доступа на чтение файла?


Оффтоп. std::filesystem — это какой-то выкидыш здравого смысла, стараюсь держаться от него подальше
Маньяк Робокряк колесит по городу
Re[2]: std::filesystem::copy_file и права
От: B0FEE664  
Дата: 10.07.25 18:55
Оценка:
Здравствуйте, Marty, Вы писали:

M>Оффтоп. std::filesystem — это какой-то выкидыш здравого смысла, стараюсь держаться от него подальше


Да, у меня тоже сложилось впечатление, что авторы ничего сложного с её помощью написать даже не пытались.
И каждый день — без права на ошибку...
Re: std::filesystem::copy_file и права
От: m2user  
Дата: 10.07.25 19:06
Оценка:
BFE>Возможна ли ситуация при которой std::filesystem::copy_file скопирует файл, но при этом у процесса нет прав доступа на чтение файла?

Это зависит от нижележащего API операционной системы. Т.е. обычно нет, но можно представить себе некую экзотическую ОС, где это было бы возможно.
Re: std::filesystem::copy_file и права
От: Великий Мессия google
Дата: 10.07.25 19:14
Оценка:
Здравствуйте, B0FEE664, Вы писали:

BFE>Возможна ли ситуация при которой std::filesystem::copy_file скопирует файл, но при этом у процесса нет прав доступа на чтение файла?


ну попробуй из под юзера скопировать какой нибудь файл админа на который стоит запрет чтения от левых
Re[2]: std::filesystem::copy_file и права
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 10.07.25 19:16
Оценка:
Здравствуйте, m2user, Вы писали:

BFE>>Возможна ли ситуация при которой std::filesystem::copy_file скопирует файл, но при этом у процесса нет прав доступа на чтение файла?


M>Это зависит от нижележащего API операционной системы. Т.е. обычно нет, но можно представить себе некую экзотическую ОС, где это было бы возможно.


Win32 CopyFile ничего по этому поводу не говорит, надо проверять. Но могу предположить, что она вполне может скопировать файл, скопировав и права доступа — т.е. к результирующему файлу доступа тоже не будет у пользователя, который её вызвал. Можно предположить, что функция обломается с копированием, если атрибуты безопасности не поддерживаются файловой системой в точке назначения. Маловероятно, но можно попробовать
Маньяк Робокряк колесит по городу
Re[3]: std::filesystem::copy_file и права
От: m2user  
Дата: 10.07.25 20:32
Оценка:
M>Но могу предположить, что она вполне может скопировать файл, скопировав и права доступа — т.е. к результирующему файлу доступа тоже не будет у пользователя, который её вызвал.

Ну да, копируешь на флешку/сетевой каталог/смонтированный vhd образ и уносишь на другой ПК.
Что касается прав, то при создании нового файла их устанавливает (копирует с оригинала) сам процесс. Т.е. если у него есть права на изменение прав, то он же их потом и поменяет на нужные ему.
(здесь я исхожу из предположения, что CopyFile просто открывает файл (CreateFile) и копирует контент в новое место).
Re[4]: std::filesystem::copy_file и права
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 10.07.25 20:53
Оценка:
Здравствуйте, m2user, Вы писали:

M>>Но могу предположить, что она вполне может скопировать файл, скопировав и права доступа — т.е. к результирующему файлу доступа тоже не будет у пользователя, который её вызвал.


M>Ну да, копируешь на флешку/сетевой каталог/смонтированный vhd образ и уносишь на другой ПК.


Вполне могут учитываться свойства тома


M>Что касается прав, то при создании нового файла их устанавливает (копирует с оригинала) сам процесс. Т.е. если у него есть права на изменение прав, то он же их потом и поменяет на нужные ему.


При создании права создаются по дефолту в зависимости от учетки (или вроде с hTemplateFileб если задан). При копировании права копируются с исходного файла


M>(здесь я исхожу из предположения, что CopyFile просто открывает файл (CreateFile) и копирует контент в новое место).


Это неверное предположение, CreateFile/ReadFile/WriteFile может делать и пользовательский код. Операционная система, я уверен, располагает и другими механизмами. Не уверен, но могу предположить, что бэкап вполне возможно делается без прав доступа к содержимому файла
Маньяк Робокряк колесит по городу
Re[2]: std::filesystem::copy_file и права
От: B0FEE664  
Дата: 10.07.25 21:04
Оценка:
Здравствуйте, Великий Мессия, Вы писали:

BFE>>Возможна ли ситуация при которой std::filesystem::copy_file скопирует файл, но при этом у процесса нет прав доступа на чтение файла?

ВМ>ну попробуй из под юзера скопировать какой нибудь файл админа на который стоит запрет чтения от левых

Что докажет единичный случай?
И каждый день — без права на ошибку...
Re[2]: std::filesystem::copy_file и права
От: B0FEE664  
Дата: 10.07.25 22:31
Оценка:
Здравствуйте, Великий Мессия, Вы писали:

BFE>>Возможна ли ситуация при которой std::filesystem::copy_file скопирует файл, но при этом у процесса нет прав доступа на чтение файла?

ВМ>ну попробуй из под юзера скопировать какой нибудь файл админа на который стоит запрет чтения от левых

С правами, кстати, ещё смешнее: права файла узнать можно, но вот узнать, может ли приложение открыть файл на чтение — нельзя.
И каждый день — без права на ошибку...
Re[5]: std::filesystem::copy_file и права
От: m2user  
Дата: 11.07.25 00:28
Оценка:
M>>(здесь я исхожу из предположения, что CopyFile просто открывает файл (CreateFile) и копирует контент в новое место).

M>Это неверное предположение, CreateFile/ReadFile/WriteFile может делать и пользовательский код. Операционная система, я уверен, располагает и другими механизмами.



Если интересно, то можно поискать в исходниках w2k/w2k3, которые валялись в интернетах.
(ну или call stack отладчиком посмотреть).

M>Не уверен, но могу предположить, что бэкап вполне возможно делается без прав доступа к содержимому файла


Для пофайлового backup/restore обычно используется backup/restore privilege.
Привиллегия назнается группе через локальные политики и дает право читать данные и метаданные в обход прав на файловой системе.
(robocopy например умеет её использовать)

Но в контексте вопроса ТС я не рассматриваю это как копирование без "прав доступа на чтение файла".
Права у процесса есть, просто получены другим путем.
Re[3]: std::filesystem::copy_file и права
От: m2user  
Дата: 11.07.25 00:33
Оценка:
BFE>но вот узнать, может ли приложение открыть файл на чтение — нельзя.

Хм, что ты имеешь в виду (и для какой ОС)?
В общем случае эффективные права зависят от многих факторов, среди которых не только security атрибуты файла, но и полный набор групп в токене процесса (потока).
Re[4]: std::filesystem::copy_file и права
От: B0FEE664  
Дата: 11.07.25 08:39
Оценка:
Здравствуйте, m2user, Вы писали:

BFE>>но вот узнать, может ли приложение открыть файл на чтение — нельзя.


M>Хм, что ты имеешь в виду (и для какой ОС)?

M>В общем случае эффективные права зависят от многих факторов, среди которых не только security атрибуты файла, но и полный набор групп в токене процесса (потока).

Есть такая функция:
std::filesystem::status
она возвращает
std::filesystem::file_status
у этого типа есть метод
std::filesystem::file_status::permissions
который возвращает значение перечисления std::filesystem::perms, которое перечислением не является, а, как обычно, следуя дебильной практике, является набором флагов.
Как бы там ни было, возможность узнать права на файл можно: ссылка, но что с ними делать изнутри программы? Основываясь на значении флагов узнать, возможно ли открыть файл на чтение/запись, возможно ли скопировать или переместить файл — нет такой возможности.
В std::filesystem всё продумано!

Ну и вот задача: мне надо скопировать файл. Если таргет это symlink или каталог, то они должны быть удалены перед копированием. Мне надо знать пройдёт ли операция копирования до того, как таргет (symlink или каталог) будут удалены. Как это сделать не открывая исходный файл на чтение?
И каждый день — без права на ошибку...
Re[5]: std::filesystem::copy_file и права
От: Chorkov Россия  
Дата: 11.07.25 09:22
Оценка: 6 (1) +3
Здравствуйте, B0FEE664, Вы писали:


BFE>Ну и вот задача: мне надо скопировать файл. Если таргет это symlink или каталог, то они должны быть удалены перед копированием. Мне надо знать пройдёт ли операция копирования до того, как таргет (symlink или каталог) будут удалены. Как это сделать не открывая исходный файл на чтение?


скопировать (под временным именем, в целевую папку) -> удалить старое -> переименовать.
Или с hardlink поиграть, но копирование в любом случае должно быть первое.

Копирование может не пройти и по причинам "сетевое соединение оборвалось" / "место на диске кончилось, хотя 5 миллисекунд назад оно было" и по 100500 других причин.
Re[3]: std::filesystem::copy_file и права
От: · Великобритания  
Дата: 11.07.25 10:27
Оценка:
Здравствуйте, B0FEE664, Вы писали:

ВМ>>ну попробуй из под юзера скопировать какой нибудь файл админа на который стоит запрет чтения от левых

BFE>С правами, кстати, ещё смешнее: права файла узнать можно, но вот узнать, может ли приложение открыть файл на чтение — нельзя.
Это бессмысленно всё равно. Ну допустим ты это как-то узнал до открытия файла. И что дальше? Какая разница-то? Что с этой информацией можно сделать полезного?
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[6]: std::filesystem::copy_file и права
От: B0FEE664  
Дата: 11.07.25 10:40
Оценка:
Здравствуйте, Chorkov, Вы писали:

BFE>>Ну и вот задача: мне надо скопировать файл. Если таргет это symlink или каталог, то они должны быть удалены перед копированием. Мне надо знать пройдёт ли операция копирования до того, как таргет (symlink или каталог) будут удалены. Как это сделать не открывая исходный файл на чтение?


C>скопировать (под временным именем, в целевую папку) -> удалить старое -> переименовать.

Думал сначала переименовать, а потом удалить таргет, но такой вариант лучше.

Наверное, даже, лучше так: скопировать с временным именем, переименовать таргет, переименовать скопированный файл, удалить переименованный таргет...

C>Или с hardlink поиграть, но копирование в любом случае должно быть первое.

Это завязываться на файловую систему...

C>Копирование может не пройти и по причинам "сетевое соединение оборвалось" / "место на диске кончилось, хотя 5 миллисекунд назад оно было" и по 100500 других причин.

Это известно. Ещё и таргет может создаваться, скажем, по таймеру...
И каждый день — без права на ошибку...
Re[4]: std::filesystem::copy_file и права
От: B0FEE664  
Дата: 11.07.25 10:44
Оценка:
Здравствуйте, ·, Вы писали:

ВМ>>>ну попробуй из под юзера скопировать какой нибудь файл админа на который стоит запрет чтения от левых

BFE>>С правами, кстати, ещё смешнее: права файла узнать можно, но вот узнать, может ли приложение открыть файл на чтение — нельзя.
·>Это бессмысленно всё равно. Ну допустим ты это как-то узнал до открытия файла. И что дальше? Какая разница-то? Что с этой информацией можно сделать полезного?
Тогда можно удалять таргет, например.
И каждый день — без права на ошибку...
Re[5]: std::filesystem::copy_file и права
От: · Великобритания  
Дата: 11.07.25 10:50
Оценка:
Здравствуйте, B0FEE664, Вы писали:

BFE>·>Это бессмысленно всё равно. Ну допустим ты это как-то узнал до открытия файла. И что дальше? Какая разница-то? Что с этой информацией можно сделать полезного?

BFE>Тогда можно удалять таргет, например.
Нельзя, конечно, если ты пишешь код с защитой от сбоев. А иначе... с ровно таким же успехом таргет можно удалять и без проверки.
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[6]: std::filesystem::copy_file и права
От: B0FEE664  
Дата: 11.07.25 14:04
Оценка:
Здравствуйте, ·, Вы писали:

BFE>>·>Это бессмысленно всё равно. Ну допустим ты это как-то узнал до открытия файла. И что дальше? Какая разница-то? Что с этой информацией можно сделать полезного?

BFE>>Тогда можно удалять таргет, например.
·>Нельзя, конечно, если ты пишешь код с защитой от сбоев. А иначе... с ровно таким же успехом таргет можно удалять и без проверки.
При работе с файловой системой от всех возможных сбоев защититься невозможно, насколько я понимаю, но вот ситуация с правами — она довольно распространённая и мне кажется логичным проверить возможность копирования до удаления таргета просто потому, что эта ситуация встречается часто по сравнению с другими сбоями. А это даже не сбой, а разумное поведение. По крайней мере я бы ожидал от, скажем, файлового менеджера, что такая проверка делается.
И каждый день — без права на ошибку...
Re[5]: std::filesystem::copy_file и права
От: m2user  
Дата: 11.07.25 14:33
Оценка:
BFE>Мне надо знать пройдёт ли операция копирования до того, как таргет (symlink или каталог) будут удалены. Как это сделать не открывая исходный файл на чтение?

Хм, тебе прниципиально нужно избежать "лишнего" открытия на чтение?
Так то, файловый дескриптор на чтение (оригинальный файл) и файловый дескриптор на запись/удаление (копия с временным именем) это самый очевидный способ определить есть ли достаточные права.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.