Показать сообщение отдельно
  #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.
Ответить с цитированием