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