Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вывод списка прав текущего пользователя 
:(
    Опции темы
blondi
Дата 17.10.2006, 09:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 29.9.2006

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



Один из пунктов курсовой работы: вывод списка прав текущего пользователя. Если кто-то сможет мне помочь любой информацией этой теме, буду очень благодарна!
PM MAIL   Вверх
_hunter
Дата 17.10.2006, 10:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 9
Всего: 98



а что ты понимаеш под "списком прав"?


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
Nicholas_S
Дата 17.10.2006, 10:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 486
Регистрация: 12.10.2006
Где: Санкт-Петербург

Репутация: 2
Всего: 19



blondi, опиши чуть подробнее задачу, пожалуйста.
Если речь идет о получении прав доступа к любому из объектов системы с помощью таблиц доступа в Windows (например, этот пользователь имеет право на запись туда и не имеет сюда), то могу помочь. Единственное, что задача не особо тривиальная и код будет не в 5 строк.


--------------------
...все в мире относительно
PM   Вверх
Nicholas_S
Дата 18.10.2006, 22:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 486
Регистрация: 12.10.2006
Где: Санкт-Петербург

Репутация: 2
Всего: 19



Листинг программы ниже. Буду рад если это как-то поможет.

Код

  TACL_SIZE_INFORMATION = record
    AceCount     : DWord;
    AclBytesInUse: DWord;
    AclBytesFree : DWord;
  end;

  TACE_HEADER = record
    AceType : Byte;
    AceFlags: Byte;
    AceSize : Byte;
  end;

  TACCESS_ACE = record
    Header  : TACE_HEADER;
    Mask    : ACCESS_MASK;
    SidStart: DWord;
  end;

  TACL_RIGHTS = (aclRead, aclSave, aclExecute);
  TACL_DATA = record
    AccessType: Byte;
    Actions   : Cardinal;
    UserName  : String;
    DomainName: String;
  end;

const
    ACCESS_ALLOWED_ACE_TYPE = $00;
    ACCESS_DENIED_ACE_TYPE  = $01;

var
  aclsData: Array of TACL_DATA;

//
// Процедура формирует список прав для заданного файла в массиве aclsData
//
procedure GetDACLInfo();
  var i      : Integer;
      sid    : Pointer;
      sidNU  : SID_NAME_USE;
      bufLen : Cardinal;
      aclData: TACL_DATA;

      pDACL   : PACL;
      ace     : ^TACCESS_ACE;
      pSecDesc: PSECURITY_DESCRIPTOR;
      aclInfo : TACL_SIZE_INFORMATION;

      user, domain: Array[0..200] of Char;
      res: DWord;
begin
  SetLength(aclsData, 0);

  // Флаг SE_FILE_OBJECT указывает на то, что будет почать права доступа для файла.
  // Для других объектов как то сервисы и проч. см. WinAPI help
  res := GetNamedSecurityInfo(PChar(filename), SE_FILE_OBJECT, DACL_SECURITY_INFORMATION, nil, nil, PACL(@pDACL), nil, pSecDesc);
  if res<>0 then
  begin
    ShowMessage('Error getting DACL info!');
    Exit;
  end;

  if (pDACL=nil) or not GetAclInformation(pDACL^, @aclInfo, SizeOf(aclInfo), AclSizeInformation) then
  begin
    ShowMessage('Error getting ACL info!');
    Exit;
  end;

  for i:= 0 to aclInfo.AceCount-1 do
  begin
      // Получаем указатель на ACE запись
      if GetAce(pDACL^, i, Pointer(ace)) then
      begin
          sid    := PSID(@((ace)^.sidStart));
          bufLen := Length(user);
          if LookupAccountSid(nil, sid, user, bufLen, domain, bufLen, sidNU) then
          begin
              // Формируем масссив прав доступа
              with aclData do
              begin
                  UserName   := user;
                  DomainName := domain;
                  Actions    := ace^.Mask;
                  AccessType := ace^.Header.AceType;
              end;
              SetLength(aclsData, Length(aclsData)+1);
              aclsData[High(aclsData)] := aclData;
          end;
      end;
  end;

  // Процедура вывода прав доступа в объект TListView, содержащий 4 столбца: 
  // пользователь, домен, досступ, действие.
  // Пример процедуры приведен ниже.
  FillList();
end;

procedure TForm1.FillList;
  var i   : Integer;
      item: TListItem;
      acts, access: String;
begin
  list.Items.Clear;
  for i:= 0 to High(aclsData) do
  begin
      with list.Items.Add do
      begin
          Caption := aclsData[i].UserName;
          SubItems.Add(aclsData[i].DomainName);

          access := '';
          case aclsData[i].AccessType of
            ACCESS_ALLOWED_ACE_TYPE:  access := 'Разрешено';
            ACCESS_DENIED_ACE_TYPE:   access := 'Запрещено';
          end;

          if (access<>'') then
          begin
            SubItems.Add(access);
            acts := '';
            if (aclsData[i].Actions and $1)=1 then acts := acts + 'Чтение';
            if (aclsData[i].Actions and $2)=2 then acts := acts + 'Запись';
            if (aclsData[i].Actions and $4)=4 then acts := acts + 'Выполнение';
            SubItems.Add(acts);
          end;  
      end;
  end;
end;


Велкам  smile 


--------------------
...все в мире относительно
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема »


 




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


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

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