Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Как узнать права пользователя на каталог или файл?


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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)