Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > ОС и железо
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

 
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 29.10.2011, 23:45
Asmoday74 Asmoday74 вне форума
Прохожий
 
Регистрация: 12.10.2010
Адрес: Челябинск
Сообщения: 22
Версия Delphi: XE2
Репутация: 893
По умолчанию Установка прав доступа к объекту в реестре

Столкнулся с такой задачей: В реестре имеется ключ, который нужно удалить. Права доступа следующие: система - read, Администраторы - read, Пользователи - read, TrustedInstaller - Full. Как я понимаю нужно стать владельцем объекта, затем установить для своего пользователя права на запись и лишь после этого удалить нужный объект. Однако столкнулся с тем что при попытке выполнения следующего кода получаю сообщение об ошибке.
Код:
function ChangeRegKeySecurity(AUser, ADomain: String; AKey: HKEY;
  APatch: String; AHideMessage: Boolean = True): Boolean;
var
  Key: HKEY;
  test: integer;
  pOwnerSid: PSid;
  lpDomain: PWideChar;
  cbDomain, cbSid: Cardinal;
  peUse: Cardinal;
  pSecDescr: PSECURITY_DESCRIPTOR;
  r: integer;
  mybuff: PWideChar;
begin
  Result := False;
  pSecDescr := PSECURITY_DESCRIPTOR
    (LocalAlloc(LPTR, SECURITY_DESCRIPTOR_MIN_LENGTH));
  LookupAccountName(PChar(ADomain), PChar(AUser), nil, cbSid, nil,
    cbDomain, peUse);
  GetMem(pOwnerSid, cbSid);
  GetMem(lpDomain, cbDomain * SizeOf(WideChar));
  if not LookupAccountNameW(PChar(ADomain), PChar(AUser), pOwnerSid, cbSid,
    lpDomain, cbDomain, peUse) then
  begin
    if not AHideMessage then
      MessageDlg('Указанный пользователь не найден!', mtError, [mbOK], 0);
    Exit;
  end;
  if InitializeSecurityDescriptor(@pSecDescr, SECURITY_DESCRIPTOR_REVISION) then
  begin
    if SetSecurityDescriptorOwner(@pSecDescr, pOwnerSid, True) then
    begin
      //Вот тут получаем ошибку об Access Denied      
      r := RegOpenKeyEx(AKey, PWideChar(APatch), 1, KEY_ALL_ACCESS, Key); 
      if r = ERROR_SUCCESS then
      begin
        r := RegSetKeySecurity(Key, OWNER_SECURITY_INFORMATION, @pSecDescr);
        if r <> ERROR_SUCCESS then
        begin
          if not AHideMessage then
            MessageDlg(SysErrorMessage(r), mtError, [mbOK], 0);
          Exit;
        end;
        RegCloseKey(Key);
        Result := True;
      end
      else
      begin
        if not AHideMessage then
          MessageDlg(SysErrorMessage(r), mtError, [mbOK], 0);
        Exit;
      end;
    end;
  end
  else
  begin
    if not AHideMessage then
      MessageDlg('Не могу инициализировать дескриптор безопасности!', mtError,
        [mbOK], 0);
  end;
end;
.....
  ChangeRegKeySecurity('TestUser','TEST-PC',HKEY_CLASSES_ROOT,'AppID\{CDCBCFCA-3CDC-436f-A4E2-0E02075250C2}',False);

TestUser - является администратором.

Собственно вопрос с каким ключем прав доступа выполнить RegOpenKeyEx.

Последний раз редактировалось Asmoday74, 29.10.2011 в 23:48.
Ответить с цитированием
 


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 23:57.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter