Показать сообщение отдельно
Старый 08.07.2009, 07:19   #4  
SRF is offline
SRF
Участник
MCBMSS
Axapta Retail User
 
376 / 562 (19) +++++++
Регистрация: 08.08.2007
Записей в блоге: 1
->
Цитата:
Сообщение от Arahnid Посмотреть сообщение
Прочла в документации по Win, что файлы наследуют доступ от папки (проверено опытным путем). Получается, что нельзя установить запрет на папку и оставить полный доступ на файлы в ней.
На самом деле это не совсем так, т.е. отсутствие прав доступа к папке, еще не говорит о том, что доступа нет к файлам в этой папке.

Цитата:
Сообщение от Arahnid Посмотреть сообщение
Может кто решал проблему: запрет открытия папки и при этом полный доступ на файлы в ней.
К сожалению, в X++ подобной задачи решать не приходилось, поэтому всё чем могу поделиться, так это кодом на C++ (компилировал в MVS 2005, MVS2008)(писал это года 3-4 назад, но насколько помню работает как на FAT32, так и на NTFS), в принципе можно обернуть в dll и использовать в AX, а возможно будет проще один раз выполнить и заблокировать директорию на совсем :

PHP код:
#include <windows.h>
#include <windowsx.h>
#include <sddl.h>
//---------------------------------------------------------------------------
bool CreateDACL(SECURITY_ATTRIBUTES *pSAwchar_t *szSD)
{
if (
pSA == NULL) return false;
return 
ConvertStringSecurityDescriptorToSecurityDescriptor(szSD,
SDDL_REVISION_1,
&(
pSA->lpSecurityDescriptor),
NULL);
};
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
void BlockDirectory(wchar_t *DirName)
{
wchar_t *sz1 _T("D:(D;;;;;BA)");
SECURITY_ATTRIBUTES sa;
sa.nLength sizeof(SECURITY_ATTRIBUTES);
sa.bInheritHandle false;
CreateDACL(&sasz1);
SetFileSecurity(DirName4sa.lpSecurityDescriptor);
};
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
void UnBlockDirectory(wchar_t *DirName)
{
wchar_t *sz1 _T("D:(A;;GA;;;BA)");
SECURITY_ATTRIBUTES sa;
sa.nLength sizeof(SECURITY_ATTRIBUTES);
sa.bInheritHandle false;
CreateDACL(&sasz1);
SetFileSecurity(DirName4sa.lpSecurityDescriptor);
};
//--------------------------------------------------------------------------- 
BlockDirectory() - блокирует директорию, UnBlockDirectory() - разблокирует директорию, параметр sz1 - это строковый формат прав, более подробно читайте в MSDN про Security Descriptor String Format(http://msdn.microsoft.com/en-us/libr...70(VS.85).aspx).

BlockDirectory() - закрывает директорию напрочь, забирая все права, но если вы точно знаете путь к файлу в этой директории, то можно легко его просмотреть и изменить.

P.S. Пример, есть каталог c:\1, в нем есть файл 1.txt, выполняем функцию BlockDirectory(), после этого вы не сможете попасть в данный каталог, но выполнив команду notepad c:\\1\\1.txt вы откроите данный файл.