среда, 13 июля 2011 г.

Как узнать размер папки?

Как узнать размер папки, к которой нет доступа - спросил меня коллега. Проблема в том, что при попытке сделать это привычным способом - правой кнопкой мыши, возвращается значение 0. Но при этом, сказал он, бекап ведь работает нормально. Такая себе инженерная задачка.
На самом деле тут все достаточно просто. Есть две привилегии: SeBackupPrivilege и SeRestorePrivilege. Наличие этих привилегий в токене процесса дает возможность этому процессу обходить стандартные списки доступа к файлам. Что делать? Проще всего - создать пользователя и добавить его в группу Backup Operators. Согласно настройкам в групповых политиках, эта группа получает эти привилегии. Однако тут есть тонкий момент. Новый механизм integrity level не дает добавить эти привилегии в токен любого процесса. Даже если запустить процесс, который будет  обращаться к таким файлам, от имени пользователя из группы Backup Operators с ходу ничего не получится. Нужно запускать процесс с повышенными привилегиями (elevated privileges). В этом случае все начинает работать.

1 комментарий:

Ростислав комментирует...

Привет! Вот добрался до размеров. Запустил эксплорер. Права есть, привилегии есть, а доступа нет.
Основная проблема заключается в том, что большинство приложений, запущенных даже с повышенными привилегиями и получившие привилегии SeBackupPrivilege и SeRestorePrivilege (в Windows 2003 IntegrityLevel нет, а ситуация та же - доступа нет) не имеют доступа к папкам для просмотра размера. Все потому, что эти привилегии есть, но они отключены (Disabled). Включает их само приложение (Ntbackup к примеру запускается сразу с включенными привилегиями, файловые менеджеры - нет). Возможно есть штатные методы смены состояния. Глубоко не рыл. Поменял состояние токена процесса API функцией AdjustTokenPrivilegesvileges. Заработало. Вот такие ньюансы.