Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как узнать права пользователя на каталог или файл? 
:(
    Опции темы
chipset
Дата 7.4.2005, 22:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4071
Регистрация: 11.1.2003
Где: Seattle, US

Репутация: 27
Всего: 164



В общем вот. Сильно упрощенный пример того, как писать не надо ( попытка нарваться на комплимент ).
Итак. Создаем 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 тебя пошлет.
Удачи. 


--------------------
Цитата(Jimi Hendrix)
Well, I stand up next to a mountain
And I chop it down with the edge of my hand
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0544 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.