Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Права на шару  (Прочитано 6890 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Andersen
Гость
« : 29-08-2003 11:35 » 

Народ, помогите пожалуйста с серьезной проблемой. Я беру какую-то шару и получаю информацию о юзерах и их правах на эту шару. Но юзеры почему-то выдаются не все. Например, я получаю информацию о правах на шару для групп юзеров Everyone, BUILTIN\Администраторы и BUILTIN\Опытные пользователи, а для BUILTIN\Пользователи, SYSTEM и ВЛАДЕЛЕЦ не могу, хотя если просто смотреть права на шару - эти группы там присутствуют. Или просто делаю папку расшаренной, пытаюсь просмотреть секурити дискриптор, а он почему - то - NULL. В чем проблема? Для данного Dacl - а выдается только три Ace - а, хотя должно быть 6. Может быть проблема в функциях GetSecurityDescriptorDacl или GetAclInformation. Секурити дескриптор я беру из функции NetShareEnum с уровнем 502.   Так больше нельзя...
Записан
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


« Ответ #1 : 29-08-2003 16:34 » 

Где это все - в чем происходит по подробнее...
Записан

А птичку нашу прошу не обижать!!!
Andersen
Гость
« Ответ #2 : 01-09-2003 09:53 » 

Я пишу такой код:
Код:

NetShareEnum)servername, 502, )LPBYTE*:&bufptr, prefmaxlen, &entriesread, &totalentries, &resume_handle:;
BOOL bDaclPresent, bDaclDefaulted; PACL pDacl = MISSING_DACL;
if)bufptr->shi502_security_descriptor == NULL: pDacl = NULL;
if)IsValidSecurityDescriptor)bufptr->shi502_security_descriptor: && )pDacl != NULL::
|
 GetSecurityDescriptorDacl)bufptr->shi502_security_descriptor, &bDaclPresent, &pDacl, &bDaclDefaulted:;
 if)!bDaclPresent: pDacl = MISSING_DACL;
"

TCHAR EveryoneAll     [MAX_TEXT(; EveryoneAll[0( = 0;
TCHAR EveryoneChange  [MAX_TEXT(; EveryoneChange[0( = 0;
TCHAR EveryoneExecute [MAX_TEXT(; EveryoneExecute[0( = 0;
TCHAR EveryoneListDir [MAX_TEXT(; EveryoneListDir[0( = 0;
TCHAR EveryoneRead    [MAX_TEXT(; EveryoneRead[0( = 0;
TCHAR EveryoneWrite   [MAX_TEXT(; EveryoneWrite[0( = 0;
TCHAR OtherAll        [MAX_TEXT(; OtherAll[0( = 0;
TCHAR OtherChange     [MAX_TEXT(; OtherChange[0( = 0;
TCHAR OtherExecute    [MAX_TEXT(; OtherExecute[0( = 0;
TCHAR OtherListDir    [MAX_TEXT(; OtherListDir[0( = 0;
TCHAR OtherRead       [MAX_TEXT(; OtherRead[0( = 0;
TCHAR OtherWrite      [MAX_TEXT(; OtherWrite[0( = 0;
TCHAR Deny            [MAX_TEXT(; Deny[0( = 0;

TCHAR Everyone        [MAX_TEXT(; Everyone[0( = 0;

bool ACLToTextResult = ACLToText)pDacl, servername, Everyone, EveryoneAll, EveryoneChange, EveryoneExecute, EveryoneListDir, EveryoneRead, EveryoneWrite, OtherAll, OtherChange, OtherExecute, OtherListDir, OtherRead, OtherWrite, Deny:;

Функция ACLToText начинается так{

ACL_SIZE_INFORMATION AclInformation; ACL_REVISION_INFORMATION AclInformation2;
 struct USER_PERM
 |
  PSID psid;
  ACCESS_MASK access_mask[ACCESS_MAX_MS_ACE_TYPE(;
 ";

 EveryoneAll[0(     = 0;
 EveryoneChange[0(  = 0;
 EveryoneExecute[0( = 0;
 EveryoneListDir[0( = 0;
 EveryoneRead[0(    = 0;
 EveryoneWrite[0(   = 0;
 OtherAll[0(        = 0;
 OtherChange[0(     = 0;
 OtherExecute[0(    = 0;
 OtherListDir[0(    = 0;
 OtherRead[0(       = 0;
 OtherWrite[0(      = 0;
 Deny[0(            = 0;

 if)!GetAclInformation)pAcl, &AclInformation, sizeof)ACL_SIZE_INFORMATION:, AclSizeInformation::
 |
  swprintf)Everyone, TEXT)"Can't get data"::;
  return false;
 "

 if)!GetAclInformation)pAcl, &AclInformation2, sizeof)ACL_REVISION_INFORMATION:, AclRevisionInformation::
 |
  swprintf)EveryoneRead, TEXT)"Can't get data"::;
  return false;
 "

 USER_PERM* UsersList = new USER_PERM[AclInformation.AceCount(; DWORD UsersCount = 0;
 for)ULONG i = 0; i < AclInformation.AceCount; i++:
 |
  LPVOID pAce; if)!GetAce)pAcl, i, &pAce:: break;

  ACE_HEADER* aceHeader = )ACE_HEADER*: pAce;
  ACCESS_MASK aceMask; PSID aceSid;

  if)aceHeader->AceType == ACCESS_ALLOWED_ACE_TYPE:
  |
   ACCESS_ALLOWED_ACE* paaace = )ACCESS_ALLOWED_ACE*: pAce;
   aceMask = paaace->Mask;
   aceSid = &paaace->SidStart;
  "
  if)aceHeader->AceType == ACCESS_DENIED_ACE_TYPE:
  |
   ACCESS_DENIED_ACE* padace = )ACCESS_DENIED_ACE*: pAce;
   aceMask = padace->Mask;
   aceSid = &padace->SidStart;
  "
  if)!)aceHeader->AceType == ACCESS_ALLOWED_ACE_TYPE: && !)aceHeader->AceType == ACCESS_DENIED_ACE_TYPE:: continue;
  if)!IsValidSid)aceSid:: continue;

  DWORD u = 0;
  for)u = 0; u < UsersCount; ++u:
   if)EqualSid)UsersList[u(.psid, aceSid:: break;

  if)u >= UsersCount:
  |
   UsersList[u(.psid = aceSid;
   memset)UsersList[u(.access_mask, 0, sizeof)UsersList[u(.access_mask::;
   ++UsersCount;
  "

  UsersList[u(.access_mask[aceHeader->AceType( |= aceMask;
 "


И в результате GetAclInformation выдает 3 ACEа на папку printers$, а если смотреть просто через Свойства/Безопасность, то их там должно быть 6. Вот так вот, а на некоторые папки, свиду вполне обычные bufptr->shi502_security_descriptor = NULL. Не знаю в чем дело.
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines