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;