29.10.2011, 23:45
|
Прохожий
|
|
Регистрация: 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.
|