Показать сообщение отдельно
  #3  
Старый 30.10.2011, 00:54
Asmoday74 Asmoday74 вне форума
Прохожий
 
Регистрация: 12.10.2010
Адрес: Челябинск
Сообщения: 22
Версия Delphi: XE2
Репутация: 893
По умолчанию

Вобщем вопрос решил сам, выкладываю полностью рабочий код функций для смены прав доступа к ветке реестра. Поддержка начиная с Windows 2000.

Код:
function SetPrivilege(privilegeName: string; enable: boolean): boolean;
var
  tpPrev, tp: TTokenPrivileges;
  token: THandle;
  dwRetLen: DWord;
begin
  result := False;
  try
    OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY,
      token); // пполучаем маркер безопасности процесс- токен
    tp.PrivilegeCount := 1;
    if LookupPrivilegeValue(nil, pchar(privilegeName), tp.Privileges[0].LUID)
    then // получаем идентификатор привилегии - LUID
    begin
      if enable then
        tp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED
        // устанавливаем атрибуты привилегии
      else
        tp.Privileges[0].Attributes := 0;
      dwRetLen := 0;
      result := AdjustTokenPrivileges(token, False, tp, SizeOf(tpPrev), tpPrev,
        dwRetLen); // включаем или отключаем привилегию
    end;
  finally
    try
      CloseHandle(token);
    except
    end;
  end;
end;

function ChangeRegKeySecurity(AUser, ADomain: String; AKey: HKEY;
  APatch: String; AHideMessage: boolean = True): boolean;
var
  Key: HKEY;
  pOwnerSid: PSid;
  lpDomain: PWideChar;
  cbDomain, cbSid: Cardinal;
  peUse: Cardinal;
  pSecDescr: PSECURITY_DESCRIPTOR;
  r: integer;
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
      r := RegOpenKeyEx(AKey, PWideChar(APatch), 1,WRITE_OWNER, 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;

//Использование
procedure TForm1.Button1Click(Sender: TObject);
begin
  if not SetPrivilege('SeTakeOwnershipPrivilege', True) then
  begin
    MessageDlg('Не могу установить привилегию смены владельца!', mtError,
      [mbOK], 0);
    Exit;
  end;
  ChangeRegKeySecurity(
    'user', //Имя влядельца объекта
    'domain', //Домен или имя локального компьютера
    HKEY_CLASSES_ROOT, //Ветка рееестра
    'test', //Дополнительный путь
    False //Скрыть сообщения об ошибках
    );
end;
Ответить с цитированием