Ну уверен что пишу в правильный форум, но тем не менее.
Пишем группу продуктов на Delphi, C++/MFC, VB6 для некоторой консервативной индустрии. В связи с правилами в этой индустрии, пользователям запрещено удалять файлы. (Там есть исключения, но это отдельная история). Когда программы и пользователи работали под Windows XP, нам удалось найти набор allow & deny rights на удаление, создание, модификацию файлов, так что стандартными средствами (Windows Explorer) файлы удаляться не могут, а наши программы создают и обновляют файлы без проблем. Теперь, когда начался массированный переход на Windows 7/8 оказалось что тот найденный набор allow & deny rights больше не работает.
Для тех кто не знает, обычная программа на Delphi и MFC пишет приблизительно так: если пользователь сказал сохранить данные в новый файл c:\xyz\a.abc, то программа создает "временный" файл c:\xyz\a.$$$, производит сохранение данных, и, наконец, если запись завершилась успешно, переименовывает a.$$$ в a.abc. В случае перезаписи файла a.abc после модификации данных, уже существующий файл a.abc удаляется, а "временный" файл a.$$$ переименовывается в a.abc.
(Кстати, стандартный notepad из Windows тоже работает приблизительно так-же)
В описанной процедуре встречается удаление файлов которое под новыми версиями Windows больше не работает. К глубокому сожалению, из-за кривых ручек тестера проблему обнаружили совсем недавно.
Вопрос: кто встречался с задачей запрета на удаление файлов и как ее решил.
Здравствуйте, AlexanderDz, Вы писали:
AD>Вопрос: кто встречался с задачей запрета на удаление файлов и как ее решил.
Извините, не уловил задачу. У вас задача, запредить удалять файлы из вашей программы? или ваша программа не может сохранить файл так как под правами юзер, под которым она запущена, запрещенные удаление файлов?
Здравствуйте, Tourist, Вы писали:
T>Здравствуйте, AlexanderDz, Вы писали:
AD>>Вопрос: кто встречался с задачей запрета на удаление файлов и как ее решил.
T>Извините, не уловил задачу. У вас задача, запредить удалять файлы из вашей программы? или ваша программа не может сохранить файл так как под правами юзер, под которым она запущена, запрещенные удаление файлов?
А разве можно запретить программе удалять файлы? Никогда про это не слышал. Я думал что это только пользователям или группам.
Да, мои программы ломаются потому что у пользователя который их выполняет, нет прав на удаление файлов.
Кстати, конечно мои пользователи *не* являются членами группы администраторов.
Напишите/закажите простой kernel-mode FS filter, который будет блокировать попытки удаления файлов в заданных директориях, если только они не исходят от одной из программ в белом списке.
Re: Запретить удаление файлов пользователям но не навредить
Здравствуйте, AlexanderDz, Вы писали:
AD>Для тех кто не знает, обычная программа на Delphi и MFC пишет приблизительно так: если пользователь сказал сохранить данные в новый файл c:\xyz\a.abc, то программа создает "временный" файл c:\xyz\a.$$$, производит сохранение данных, и, наконец, если запись завершилась успешно, переименовывает a.$$$ в a.abc. В случае перезаписи файла a.abc после модификации данных, уже существующий файл a.abc удаляется, а "временный" файл a.$$$ переименовывается в a.abc.
1. Создавать временный файл в специально отведенном для этого месте в системе, т.е. в Temporary folder? Папка для временных файлов должна (by design) позволять удалять файлы из нее. Вместо переименования a.$$$ в a.abc, просто переписывать содержимое a.$$$ в a.abc (т.е. файл a.abc не удалять)
2. Ну или программу пускать от имени другого пользователя, который имеет права на удаление файлов из нужных программе директорий.
P.S. Мне, правда, не нравится ни тот, ни другой вариант
Здравствуйте, bazis1, Вы писали:
B>Напишите/закажите простой kernel-mode FS filter, который будет блокировать попытки удаления файлов в заданных директориях, если только они не исходят от одной из программ в белом списке.
Замечательная идея! Спасибо за совет!
Правда есть проблема с записью файлов на сетевой диск. Это означает что на всех компьютерах с которых доступен сетевой диск/каталог, должен быть установлен этот драйвер. Если на компьютере нет этого драйвера, то можно все и драйвер от этого не защитит — его-же просто нет. Но, надеюсь, тогда сетевые администраторы согласятся предоставить доступ к сетевому каталогу только с компьютеров с драйверами.
Этого всего не надо будет если драйвер работающий на файл сервере получит информацию о программе которая будет выполнять файловую операцию. Это возможно? Что-то мне слабо верится.
Re: Запретить удаление файлов пользователям но не навредить программам
AD>Для тех кто не знает, обычная программа на Delphi и MFC пишет приблизительно так: если пользователь сказал сохранить данные в новый файл c:\xyz\a.abc, то программа создает "временный" файл c:\xyz\a.$$$, производит сохранение данных, и, наконец, если запись завершилась успешно, переименовывает a.$$$ в a.abc. В случае перезаписи файла a.abc после модификации данных, уже существующий файл a.abc удаляется, а "временный" файл a.$$$ переименовывается в a.abc.
В %TEMP% писать временные файлы. Или и оттуда нельзя удалять?
Жизнь не обязана доставлять удовольствие. Достаточно отсутствия страданий.
Re[2]: Запретить удаление файлов пользователям но не навредить
Здравствуйте, Буравчик, Вы писали:
Б>Здравствуйте, AlexanderDz, Вы писали:
AD>>Для тех кто не знает, обычная программа на Delphi и MFC пишет приблизительно так: если пользователь сказал сохранить данные в новый файл c:\xyz\a.abc, то программа создает "временный" файл c:\xyz\a.$$$, производит сохранение данных, и, наконец, если запись завершилась успешно, переименовывает a.$$$ в a.abc. В случае перезаписи файла a.abc после модификации данных, уже существующий файл a.abc удаляется, а "временный" файл a.$$$ переименовывается в a.abc.
Б>1. Создавать временный файл в специально отведенном для этого месте в системе, т.е. в Temporary folder? Папка для временных файлов должна (by design) позволять удалять файлы из нее. Вместо переименования a.$$$ в a.abc, просто переписывать содержимое a.$$$ в a.abc (т.е. файл a.abc не удалять)
Б>2. Ну или программу пускать от имени другого пользователя, который имеет права на удаление файлов из нужных программе директорий.
Б>P.S. Мне, правда, не нравится ни тот, ни другой вариант
Вариант 1 мне не нравится потому что надо изменять все программы. Так-же будет головная боль со списком последних использованных файлов. Решаемо, но не хочется. Еще проблема — файлы могут быть большими. Их перезапись может быть дорогой операцией.
Вариант 2 не подходит абсолютно так как стандартный диалог FileOpen есть не что иное как модифицированный Windows Explorer, который позволяет переименование и удаление.
Я думал использовать The COM Elevation Moniker но там тоже придется модифицировать программы — перенести процедуры записи файлов в Com object работающий с другими правами. Там еще будет головная боль что-бы создать группу с правами. Но, это решаемо.
Re[2]: Запретить удаление файлов пользователям но не навредить программам
Здравствуйте, s_aa, Вы писали:
AD>>Для тех кто не знает, обычная программа на Delphi и MFC пишет приблизительно так: если пользователь сказал сохранить данные в новый файл c:\xyz\a.abc, то программа создает "временный" файл c:\xyz\a.$$$, производит сохранение данных, и, наконец, если запись завершилась успешно, переименовывает a.$$$ в a.abc. В случае перезаписи файла a.abc после модификации данных, уже существующий файл a.abc удаляется, а "временный" файл a.$$$ переименовывается в a.abc.
_>В %TEMP% писать временные файлы. Или и оттуда нельзя удалять?
Здравствуйте, AlexanderDz, Вы писали:
AD>Здравствуйте, bazis1, Вы писали:
B>>Напишите/закажите простой kernel-mode FS filter, который будет блокировать попытки удаления файлов в заданных директориях, если только они не исходят от одной из программ в белом списке.
AD>Замечательная идея! Спасибо за совет!
AD>Правда есть проблема с записью файлов на сетевой диск. Это означает что на всех компьютерах с которых доступен сетевой диск/каталог, должен быть установлен этот драйвер. Если на компьютере нет этого драйвера, то можно все и драйвер от этого не защитит — его-же просто нет. Но, надеюсь, тогда сетевые администраторы согласятся предоставить доступ к сетевому каталогу только с компьютеров с драйверами.
AD>Этого всего не надо будет если драйвер работающий на файл сервере получит информацию о программе которая будет выполнять файловую операцию. Это возможно? Что-то мне слабо верится.
А не проще тогда расшарить без прав на удаление + сделать некий сервис на сервере, который по отдельному протоколу будет принимать запросы на удаление файлов от вашей программы? Соответственно, DeleteFile() в программе заменяем удаленным вызовом, и готово. То же самое можно сделать локально — user-mode сервис, сидящий от LocalSystem, по какому-нибудь xmlrpc принимающий запросы от вашей программы на удаление файлов, которые средствами Api из-под этого аккаунта удалить нельзя.
Здравствуйте, bazis1, Вы писали:
... B>>>Напишите/закажите простой kernel-mode FS filter, который будет блокировать попытки удаления файлов в заданных директориях, если только они не исходят от одной из программ в белом списке.
AD>>Замечательная идея! Спасибо за совет!
AD>>Правда есть проблема с записью файлов на сетевой диск. Это означает что на всех компьютерах с которых доступен сетевой диск/каталог, должен быть установлен этот драйвер. Если на
...
B>А не проще тогда расшарить без прав на удаление + сделать некий сервис на сервере, который по отдельному протоколу будет принимать запросы на удаление файлов от вашей программы? Соответственно, DeleteFile() в программе заменяем удаленным вызовом, и готово. То же самое можно сделать локально — user-mode сервис, сидящий от LocalSystem, по какому-нибудь xmlrpc принимающий запросы от вашей программы на удаление файлов, которые средствами Api из-под этого аккаунта удалить нельзя.
Не все пользователи готовы писать на сетевой диск. Некоторые хотят локально. А еще один специальный сервис, специальная шара, специальный сервер — общее усложнение системы. Причем, все это вне области нашей экспертизы. Нам очень не хочется заниматься file management. Это ответственность пользователей и их IT department.
Без прав на удаление не получается потому что при перезаписи файлов стандартные процедуры Delphi и C++/MFC производят удаление файлов которое запрещать не нужно. Увы, контроль должен быть более тонкий.
Здравствуйте, AlexanderDz, Вы писали: B>>А не проще тогда расшарить без прав на удаление + сделать некий сервис на сервере, который по отдельному протоколу будет принимать запросы на удаление файлов от вашей программы? Соответственно, DeleteFile() в программе заменяем удаленным вызовом, и готово. То же самое можно сделать локально — user-mode сервис, сидящий от LocalSystem, по какому-нибудь xmlrpc принимающий запросы от вашей программы на удаление файлов, которые средствами Api из-под этого аккаунта удалить нельзя.
AD>Не все пользователи готовы писать на сетевой диск. Некоторые хотят локально. А еще один специальный сервис, специальная шара, специальный сервер — общее усложнение системы. Причем, все это вне области нашей экспертизы. Нам очень не хочется заниматься file management. Это ответственность пользователей и их IT department.
AD>Без прав на удаление не получается потому что при перезаписи файлов стандартные процедуры Delphi и C++/MFC производят удаление файлов которое запрещать не нужно. Увы, контроль должен быть более тонкий.
Не кривое решение тут может быть только одно — запускать вашу программу под отдельным аккаунтом, у которого есть нужные права. Все остальное — полумеры из области DRM.
Здравствуйте, bazis1, Вы писали:
B>Здравствуйте, AlexanderDz, Вы писали: B>>>А не проще тогда расшарить без прав на удаление + сделать некий сервис на сервере, который по отдельному протоколу будет принимать запросы на удаление файлов от вашей программы? Соответственно, DeleteFile() в программе заменяем удаленным вызовом, и готово. То же самое можно сделать локально — user-mode сервис, сидящий от LocalSystem, по какому-нибудь xmlrpc принимающий запросы от вашей программы на удаление файлов, которые средствами Api из-под этого аккаунта удалить нельзя.
AD>>Не все пользователи готовы писать на сетевой диск. Некоторые хотят локально. А еще один специальный сервис, специальная шара, специальный сервер — общее усложнение системы. Причем, все это вне области нашей экспертизы. Нам очень не хочется заниматься file management. Это ответственность пользователей и их IT department.
AD>>Без прав на удаление не получается потому что при перезаписи файлов стандартные процедуры Delphi и C++/MFC производят удаление файлов которое запрещать не нужно. Увы, контроль должен быть более тонкий. B>Не кривое решение тут может быть только одно — запускать вашу программу под отдельным аккаунтом, у которого есть нужные права. Все остальное — полумеры из области DRM.
Нет, тоже не получается. Стандартный FileOpen диалог есть ни что иное как упрощенный Windows Explorer который может удалять и переименовывать каталоги. Через этот диалог пользователь исполняющий программу с правами специально пользователя может сделать все. Через драйвер можно "покопаться" в адресном пространстве клиентского процесса и посмотреть — а не активен ли сейчас FileOpen диалог. Если да, то операции удаления запретить.
Здравствуйте, AlexanderDz, Вы писали:
AD>Нет, тоже не получается. Стандартный FileOpen диалог есть ни что иное как упрощенный Windows Explorer который может удалять и переименовывать каталоги. Через этот диалог пользователь исполняющий программу с правами специально пользователя может сделать все. Через драйвер можно "покопаться" в адресном пространстве клиентского процесса и посмотреть — а не активен ли сейчас FileOpen диалог. Если да, то операции удаления запретить.
Мне шестое чувство подсказывает, что подобные вещи должны быть отключаемы через group policy. Самому гуглить лень.
Здравствуйте, AlexanderDz, Вы писали:
AD>Стандартный FileOpen диалог есть ни что иное как упрощенный Windows Explorer который может удалять и переименовывать каталоги.
Напиши свой диалог выбора файла. Если, кроме как с твой программой, пользователю ни с чем больше работать не надо на этой машине, то для нужного пользователя замени в реестре запуск explorer.exe на запуск твоей программы. Как вариант — написать программу, которая будет запускаться вместо explorer.exe и, в зависимости от требуемых действий, будет запускать либо твой софт, либо стандартный эксплорер.
Здравствуйте, bazis1, Вы писали:
B>Здравствуйте, AlexanderDz, Вы писали:
AD>>Нет, тоже не получается. Стандартный FileOpen диалог есть ни что иное как упрощенный Windows Explorer который может удалять и переименовывать каталоги. Через этот диалог пользователь исполняющий программу с правами специально пользователя может сделать все. Через драйвер можно "покопаться" в адресном пространстве клиентского процесса и посмотреть — а не активен ли сейчас FileOpen диалог. Если да, то операции удаления запретить. B>Мне шестое чувство подсказывает, что подобные вещи должны быть отключаемы через group policy. Самому гуглить лень.
Увы, увы, увы... Мне не удалось найти как запретить удаление/переименование в FileOpen диалоге. А идея очень заманчивая...
Здравствуйте, AleksandrN, Вы писали:
AN>Здравствуйте, AlexanderDz, Вы писали:
AD>>Стандартный FileOpen диалог есть ни что иное как упрощенный Windows Explorer который может удалять и переименовывать каталоги.
AN>Напиши свой диалог выбора файла. Если, кроме как с твой программой, пользователю ни с чем больше работать не надо на этой машине, то для нужного пользователя замени в реестре запуск explorer.exe на запуск твоей программы. Как вариант — написать программу, которая будет запускаться вместо explorer.exe и, в зависимости от требуемых действий, будет запускать либо твой софт, либо стандартный эксплорер.
Можно написать и свой FileOpen диалог. Но тогда надо будет перелопатить с пяток продуктов и которые пишутся уже лет 15 и там заменить все FileOpen на свой диалог... Это не реалистично.
Увы, на компьютеры могут быть установлены программы других производителей.
Здравствуйте, Tourist, Вы писали:
T>Здравствуйте, AlexanderDz, Вы писали:
AD>>Увы, на компьютеры могут быть установлены программы других производителей.
T>А нельзя посмотреть как программы других производителей решают эту же проблему? или им не надо сохранять файлы на диск?
Точно неизвестно. Но похоже что они сохраняют копию файлов в базе данных. Тогда приходится писать программы которые проверяют на наличие файлов которые не удалены и не изменены. А если это произошло, то надо файлы восстановить. Другая проблема что база данных может быть очень большой. Тогда придется писать программу которая будет обслуживать эту базу данных — удаление уже устаревших данных в архив, контрольная копия базы данных и т.д.
В результате этого всего будет написано много строк кода. А судя по прошлому опыту, если код написан и поставлен клиенту, то потом очень трудно избавиться от сопровождения этого кода на годы.
Re: Запретить удаление файлов пользователям но не навредить программам
Здравствуйте, AlexanderDz, Вы писали:
AD>Вопрос: кто встречался с задачей запрета на удаление файлов и как ее решил.
Стандартное решение: выносим часть, которая требует повышенных прав в сервис (службу windows), запускаем службу от имени специально заведённого пользователя, раздаём этому пользователю права, остальным обрезаем.
Если машина в AD, то можно повесить на все сервисы свой domain login или вообще ad service account (начиная с 2008 R2, если ничего не забыл). Вот тут есть описание всех вариантов.
Как бонус:
1. Можно навесить аудит windows индивидуально на этот логин и распечатывать все действия с ФС красивым отчётом.
2. Никто не докопается "а почему работает cmd /k del myFile"? Особенно неприятно, если этот момент обнаружит СБ предприятия
3. Не надо никаких извратов с драйверами-фильтрами ФС и подписью под x64. Оверкилл же.
Re[2]: Запретить удаление файлов пользователям но не навредить программам
Здравствуйте, Sinix, Вы писали:
S>Здравствуйте, AlexanderDz, Вы писали:
AD>>Вопрос: кто встречался с задачей запрета на удаление файлов и как ее решил.
S>Стандартное решение: выносим часть, которая требует повышенных прав в сервис (службу windows), запускаем службу от имени специально заведённого пользователя, раздаём этому пользователю права, остальным обрезаем.
...
Категорически согласен. У меня (моей организации) стандартная проблема и у нее есть стандартное решение. Увы, в стандратных условиях. Но, можно ли назвать условия стандартными если такой реорганизации надо будет подвергнуть несколько проектов на VB6 и Delphi?
Re[3]: Запретить удаление файлов пользователям но не навреди
Здравствуйте, AlexanderDz, Вы писали:
AD>Здравствуйте, Sinix, Вы писали:
S>>Здравствуйте, AlexanderDz, Вы писали:
AD>>>Вопрос: кто встречался с задачей запрета на удаление файлов и как ее решил.
S>>Стандартное решение: выносим часть, которая требует повышенных прав в сервис (службу windows), запускаем службу от имени специально заведённого пользователя, раздаём этому пользователю права, остальным обрезаем.
AD>...
AD>Категорически согласен. У меня (моей организации) стандартная проблема и у нее есть стандартное решение. Увы, в стандратных условиях. Но, можно ли назвать условия стандартными если такой реорганизации надо будет подвергнуть несколько проектов на VB6 и Delphi?
Однако! Ну если перенести операции записи файлов в сервис связано с большими затратами, то можно перехватить Win32 вызовы CreateFile, WriteFile, CloseFile, DeleteFile, MoveFile и т.д. и перенести их сервис работающий под правами специального пользователя.
Тогда и не надо будет "высшего пилотажа" с file system filter. А то пока все отладишь BSOD насмотришься до посинения
Какие тут могут быть засады? Что надо использовать для перехвата Win API — кажется mhook?
Здравствуйте, bazis1, Вы писали:
B>Здравствуйте, AlexanderDz, Вы писали:
AD>>Здравствуйте, bazis1, Вы писали:
B>>>Напишите/закажите простой kernel-mode FS filter, который будет блокировать попытки удаления файлов в заданных директориях, если только они не исходят от одной из программ в белом списке.
AD>>Замечательная идея! Спасибо за совет!
AD>>Правда есть проблема с записью файлов на сетевой диск. Это означает что на всех компьютерах с которых доступен сетевой диск/каталог, должен быть установлен этот драйвер. Если на компьютере нет этого драйвера, то можно все и драйвер от этого не защитит — его-же просто нет. Но, надеюсь, тогда сетевые администраторы согласятся предоставить доступ к сетевому каталогу только с компьютеров с драйверами.
AD>>Этого всего не надо будет если драйвер работающий на файл сервере получит информацию о программе которая будет выполнять файловую операцию. Это возможно? Что-то мне слабо верится. B>А не проще тогда расшарить без прав на удаление + сделать некий сервис на сервере, который по отдельному протоколу будет принимать запросы на удаление файлов от вашей программы? Соответственно, DeleteFile() в программе заменяем удаленным вызовом, и готово. То же самое можно сделать локально — user-mode сервис, сидящий от LocalSystem, по какому-нибудь xmlrpc принимающий запросы от вашей программы на удаление файлов, которые средствами Api из-под этого аккаунта удалить нельзя.
...
AD>Однако! Ну если перенести операции записи файлов в сервис связано с большими затратами, то можно перехватить Win32 вызовы CreateFile, WriteFile, CloseFile, DeleteFile, MoveFile и т.д. и перенести их сервис работающий под правами специального пользователя.
AD>Тогда и не надо будет "высшего пилотажа" с file system filter. А то пока все отладишь BSOD насмотришься до посинения
AD>Какие тут могут быть засады? Что надо использовать для перехвата Win API — кажется mhook?
Увы, увы... Таки попал в засаду. Наши продукты защищены продуктом SafeNet, в который встроена защита от перехватывания Windows API.
Тогда получается только фильтр файловой системы. К счастью, самому его кажется писать не надо — есть куча компаний которая предлагает драйверы выполняющие требуемые функции. Проще купить.