2013-07-08 2 views
4

Windows/C++Сброс защиты файлов наследовать после операции

MoveFile() ищет некоторые рекомендации о том, как сбросить атрибуты безопасности на файл после того, как он был перемещен в новую папку.

Наш стандартный способ создания файлов (и загрузки с сервера) состоит в том, чтобы создать файл во временной папке, а затем, когда поток файлов опущен, файл добавляется. Как только загрузка будет завершена, мы переместим файл в конечный пункт назначения.

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

Итак, в конечном счете, я хотел бы выполнить операцию над файлом после его перемещения. Мое настоящее мышление заключается в том, что я должен получить атрибуты безопасности папки, в которую она входит, а затем применить к файлу после завершения перемещения.

ответ

2

Используйте SetNamedSecurityInfo с флагом UNPROTECTED_DACL_SECURITY_INFORMATION. Просто передайте пустой ACL, чтобы удалить записи, полученные от предыдущего родителя. Это будет выглядеть примерно так:

error = SetNamedSecurityInfo(
      path_to_file, 
      SE_FILE_OBJECT, 
      DACL_SECURITY_INFORMATION | UNPROTECTED_DACL_SECURITY_INFORMATION, 
      NULL, 
      NULL, 
      empty_acl, 
      NULL); 
4

Чтобы расширить ответ Гарри, вот полный код:

// blank acl used to restore permissions after a file move 
ACL g_null_acl = { 0 }; 
InitializeAcl(&g_null_acl, sizeof(g_null_acl), ACL_REVISION); 

DWORD error = SetNamedSecurityInfo(file_path, SE_FILE_OBJECT, 
    DACL_SECURITY_INFORMATION | UNPROTECTED_DACL_SECURITY_INFORMATION, 
    NULL, NULL, (PACL)&g_null_acl, NULL); 

Имейте в виду, что при вызове SetNamedSecurityInfo (в данном случае) требует SE_RESTORE_NAME привилегий, поэтому не могут быть вызваны из службы, работающей как сетевая служба (или локальная служба), так как у них есть limited permissions.

+0

'SE_SECURITY_NAME' требуется только в том случае, если вы меняете SACL. В этом случае мы только меняем DACL, поэтому он не нужен. Однако вам понадобятся либо соответствующие разрешения на уровне файлов, либо 'SE_RESTORE_NAME'. –

+0

@HarryJohnston, Обновлено, спасибо. –

+0

Возможно, стоит отметить, что при использовании этого метода ':: SetNamedSecurityInfo' не возвращает ERROR_SUCCESS. Кажется, что всегда возвращается 1008 (0x3f0): «Была сделана попытка ссылаться на токен, которого не существует». Кажется, все работает нормально. (Это было проверено на Win 7 SP1 x64.) –

Смежные вопросы