Полезное для программистов:

Фриланс
Новости
Статьи
   
Рубрики:

Error. Page cannot be displayed. Please contact your service provider for more details. (27)


Как узнать права пользователя на каталог или файл?

Поиск:
В общем вот. Сильно упрощенный пример того, как писать не надо ( попытка нарваться на комплимент ).
Итак. Создаем Dialog-проект в Visual C++. Вставляем туды CListBox (m_List) и кнопку "Выбор файла". Делаем процедуру обработки нажатия и пишем там следующее:

Исходный код:
Код

void CNT_FileSecurityAttrDlg::OnSelectFile()
{
CFileDialog fdDlg(true, NULL, NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT | OFN_ENABLESIZING, NULL, this);
if (fdDlg.DoModal() != IDOK)
return;

PACL paclDACL;
PSECURITY_DESCRIPTOR psdSecurity;
if (GetNamedSecurityInfo( fdDlg.GetPathName().GetBuffer(0),
SE_FILE_OBJECT, //SE_LMSHARE,
DACL_SECURITY_INFORMATION,
NULL,
NULL,
&paclDACL,
NULL,
&psdSecurity
) != ERROR_SUCCESS)
{
LPVOID lpMsgBuf;
FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_SYSTEM |
FORMAT_MESSAGE_IGNORE_INSERTS,
NULL,
GetLastError(),
0,
(LPTSTR) &lpMsgBuf,
0,
NULL);
AfxMessageBox((LPTSTR)lpMsgBuf);
return;
}

LPVOID pACE;
BYTE bACEType;
ACCESS_ALLOWED_ACE *ACE;
CString Mask, Tmp;
m_List.ResetContent();
for (int i = 0; i < paclDACL->AceCount; i++)
{
if (!GetAce(paclDACL, i, &pACE))
AfxMessageBox("Ошибка GetAce()!");
bACEType = ((ACE_HEADER*)pACE)->AceType;
if (bACEType!= ACCESS_ALLOWED_ACE_TYPE &&
bACEType!= ACCESS_DENIED_ACE_TYPE)
AfxMessageBox(_T("ActiveDirectory доделывайте сами :)."));
else
{
ACE = (ACCESS_ALLOWED_ACE*)pACE;
for (int j = 0; j < 32; j++)
{
Tmp.Format(_T("%u"), ((ACE->Mask >> j) & 1) );
Mask += Tmp;
}
m_List.AddString(Mask);
Mask.Empty();
Tmp.Empty();

char Name[100], Domain[100];
DWORD NameSize = 100, DomainSize = 100;
SID_NAME_USE SidType;
PSID pSID = (PSID)&(((ACCESS_ALLOWED_ACE*)pACE)->SidStart);
if (!LookupAccountSid(NULL,
pSID,
Name, &NameSize,
Domain, &DomainSize,
&SidType))
{
LPVOID lpMsgBuf;
FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_SYSTEM |
FORMAT_MESSAGE_IGNORE_INSERTS,
NULL,
GetLastError(),
0,
(LPTSTR) &lpMsgBuf,
0,
NULL);
AfxMessageBox((LPTSTR)lpMsgBuf);
}//if
else m_List.AddString(Name);
}//else
} //for
}




Глюки возможны, но не приветствуются
Инструкция по применению.
Выбрать файл в диалоге, получить список попарно, строка - права доступа (в бинарном виде, лень парсинг делать), строка - имя владельца этих прав.
Для каталогов тоже работает, но в стандартном диалоге их выбор не предусмотрен.
Одна тонкость - если хочешь получить ACL для файла, не забудь иметь на это право - иначе security тебя пошлет.
Удачи.
Автор: Dicobraz






Просмотров: 3036

 

 

Новые статьи:


Популярные:
  1. Как сделать цикличным проигрывание MIDI-файла?
  2. Создание AVI файла из рисунков
  3. Как устройство "отключить в данной конфигурации"?
  4. Kто в данный момент присоединен через Сеть?
  5. Как узнать количество доступной памяти?
  6. Как реализовать в RichEdit разноцветный текст?
  7. Как скрыть свое приложение от ProcessViewer
  8. Как программно нажать/скрыть/показ кнопку "Start"?
  9. Модуль работы с ресурсами в PE файлах
10. Функции вызова диалоговых окон выбора
11. Проверка граматики средствами Word'а из Delphi.
12. Модуль для упрощенного вызова сообщений
13. Функции для записи и чтение своих данных в, ЕХЕ- файле
14. Рекурсивный просмотр директорий
15. Network Traffic Monitor
16. Разные модули
17. Универсальная функция для обращения к любым экспортируем функциям DLL
18. Библиотека от VladS
19. Протектор для UPX'а
20. Еще об ICQ, сообщения по контакт листу?
21. Использование открытых интерфейсов
22. Теория и практика использования RTTI
23. Работа с TApplication
24. Примеры использования Drag and Drop для различных визуальных компонентов
25. Что такое порт? Правила для работы с портами
26. Симфония на клавиатуре
27. Загрузка DLL
28. Исправление автоинкремента
29. Взаимодействие с чужими окнами
30. Проверить дубляжи в столбце


 

 

 
 
На главную