![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
Приветствую! Как можно получить доступ к секретным разделам реестра? К примеру:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\EMDMgmt На просторах инета вычитал что к подобным разделам есть доступ только у системы, но сделать это можно через LsaOpenPolicy/LsaRetrievePrivateData/LsaStorePrivateData, но про то как это сделать я ничего толкового не нашел. Может кто сталкивался с чем-то подобным? Или есть другой способ? |
|
#2
|
|||
|
|||
|
Regedit открывает. Соответсвенно, и любая программа может открыть.
Единсивенное что, возможно, придется работать с функциями API, т.к. потребуется собрать дескриптор безопасности для доступа к этой ветке. |
|
#3
|
||||
|
||||
|
Я так понимаю это в Семёрке. Ну или в Висте. В ХР нет же? Или есть что-то, чего RegEdit не показывает?
|
|
#4
|
|||
|
|||
|
Цитата:
Да, речь о Семерке. Проблема в том что смысла от Regestry.OpenKeyReadOnly нет, т.е. таким методом ключ не создать. Покопавшись в нете, я пришел к выводу, что для доступа к этому разделу (он такой далеко не единственный) нужны права системы (т.е. доступ есть только у системы), и получить (обойти) их как-то можно через функции LSA что в API. Возможно сразу не совсем понятно написал, но доступа нет программно, через regedit все это делается. |
|
#5
|
|||
|
|||
|
Цитата:
Собственно вопрос как это сделать? К сожалению не обладаю достаточными знаниями ![]() |
|
#6
|
||||
|
||||
|
У меня регэдит не нашел эту ветку. Win7 x64.
|
|
#7
|
|||
|
|||
|
А с правами админа запускать программу пробовали?
У меня 8ка, ключ такой есть и regedit его спокойно открывает. Программно не проверял, ибо лень. |
|
#8
|
|||
|
|||
|
Цитата:
Да с regedit все ок, а во программно ... . С админом запускал, и через manifest и через контекстное. |
|
#9
|
||||
|
||||
|
А вот это не о том?
Код:
procedure SetRegKeySecurity(KeyRoot : HKEY; KeyName : String);
var
Privs : IJwPrivilegeScope;
Key : HKEY;
KeySec : TJwSecureRegistryKey;
DACL : TJwDAccessControlList;
begin
JwInitWellKnownSIDs; //inits JwSecurityProcessUserSID
if RegOpenKeyEx(KeyRoot, PChar(KeyName), 0, KEY_ALL_ACCESS, Key) = ERROR_ACCESS_DENIED then
begin
Privs := JwGetPrivilegeScope([SE_TAKE_OWNERSHIP_NAME], pst_Enable);
if RegOpenKeyEx(KeyRoot, PChar(KeyName), 0, WRITE_OWNER, Key) <> 0 then
RaiseLastOSError;
try
TJwSecureRegistryKey.TakeOwnerShip(Key);
if RegOpenKeyEx(KeyRoot, PChar(KeyName), 0, WRITE_DAC, Key) <> 0 then
RaiseLastOSError;
KeySec := TJwSecureRegistryKey.Create(Key);
try
DACL := KeySec.DACL; //returns a cached DACL so we must not free it!
DACL.Add(TJwDiscretionaryAccessControlEntryAllow.Create(nil, [afContainerInheritAce], KEY_ALL_ACCESS, JwSecurityProcessUserSID));
KeySec.SetDACL(DACL);
finally
KeySec.Free;
end;
finally
RegCloseKey(Key)
end;
end;
end; |