Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 18.07.2011, 19:15   #1
spydark91
Форумчанин
 
Регистрация: 01.06.2011
Сообщений: 215
По умолчанию редактирование раздела HKEY_LOCAL_MACHINE

как редактировать раздел HKEY_LOCAL_MACHINE?
пытаюсь выполнить код
Код:
r:= TRegIniFile.Create();
      r.LazyWrite := false;
      r.RootKey:=HKEY_LOCAL_MACHINE;
      r.OpenKey('Software\Microsoft\Windows\CurrentVersion\Run',false);
      r.DeleteValue('LogMeIn Hamachi Ui');
      r.CloseKey;
      r.Free;
но ничего не происходит. с разделом currebt_user,например, все в порядке. юзаю вин7
spydark91 вне форума Ответить с цитированием
Старый 18.07.2011, 19:44   #2
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,434
По умолчанию

А за каким хреном, вообще лазить в системный раздел реестра?

Автозапуск? А CURRENT_USER мало?

что касается сабжа....
1. Проверить существует ли нужный нам ключь реестра.
2. Открыть ключь реестра(без создания если не существует) OpenReadOnly нам не подходит.
3. Проверить наличие нужной нам переменной в этом ключе реестра.
4. Делать что-то с этой переменной
...
закрыть ключь.

Последний раз редактировалось Человек_Борща; 18.07.2011 в 19:47.
Человек_Борща вне форума Ответить с цитированием
Старый 19.07.2011, 09:07   #3
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Цитата:
ничего не происходит
Проверок на ошибки нет.
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 19.07.2011, 10:35   #4
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

> юзаю вин7

не пустят вас под вистой/7 ковыряться в HKEY_LOCAL_MACHINE без UAC (и правильно сделают).
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 19.07.2011, 10:37   #5
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Вообще-то не пустят и в Win2000 и в WinXP (при тех же условиях).

Просто в 2000/XP по умолчанию пользователь работает как админ, в Vista/7 - как обычный пользователь.
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 19.07.2011, 10:50   #6
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

Админа тоже не пустят. Нужна именно эскалация прав через UAC.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 19.07.2011, 10:58   #7
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Админ без элевации это и есть обычный пользователь. Админ с ограничением прав суть ограниченный пользователь. Хотя это зависит от определений терминов.

Я лишь хотел указать, что ситуация в Vista/Win7 ничем не отличается от ситуации в Win2000/XP: админам - можно, ограниченным - нет. Если запустить этот код на Vista/Win7 под администратором (именно в смысле Win2000/XP) - он будет работать точно так же.
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 19.07.2011, 11:10   #8
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

> Админ с ограничением прав суть ограниченный пользователь.

а так как в висте/7 по-умолчанию все админы (не в смысле W2K/XP) такие, это и приводит к разрыву шаблона )
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 19.07.2011, 12:42   #9
HyperZen
Пользователь
 
Аватар для HyperZen
 
Регистрация: 20.07.2010
Сообщений: 45
По умолчанию

Подсказка: посмотри в сторону компонентов Jedi WSCL. Там все с примерами. Все работает прекрасно с любой веткой реестра и в Win7 тоже.
Код:
uses
  JwaWindows,
  JwsclToken,
  JwsclSecureObjects,
  JwsclPrivileges,
  JwsclAcl,
  JwsclDescriptor,
  JwsclTypes,
  JwsclConstants,
  JwsclKnownSid,
  JwsclUtils,
  JwsclStrings;

...

public
    procedure SetRegKeySecurity(KeyRoot : HKEY; KeyName : String);

implementation


// Устанавливаем разрешение на ветку реестра путем добавления нового пользователя
// с правами администратора (необходимо иметь права админа)
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
    //not necessary since KeySec.TakeOwnerShip(); does it on its own
    //But just show the power of interfaces
    //The privilege will be restored to inactive state when the procedure exists
    Privs := JwGetPrivilegeScope([SE_TAKE_OWNERSHIP_NAME], pst_Enable);

    //First open key for write owner
    if RegOpenKeyEx(KeyRoot, PChar(KeyName), 0, WRITE_OWNER, Key) <> 0 then
      RaiseLastOSError;

    try
      //take ownership - can fail with exception
      TJwSecureRegistryKey.TakeOwnerShip(Key);

      //we need to reopen the handle for further access
      if RegOpenKeyEx(KeyRoot, PChar(KeyName), 0, WRITE_DAC, Key) <> 0 then
        RaiseLastOSError;

      //because access is granted on handle creation we need to
      //recreate the object

      KeySec := TJwSecureRegistryKey.Create(Key);
      try
        DACL := KeySec.DACL; //returns a cached DACL so we must not free it!

        //add process user with full access
        //and also set inheritance (values don't have their own security.)
        DACL.Add(TJwDiscretionaryAccessControlEntryAllow.Create(nil, [afContainerInheritAce], KEY_ALL_ACCESS, JwSecurityProcessUserSID));
        //set DACL - may fail with exception
        KeySec.SetDACL(DACL);
      finally
        KeySec.Free;
      end;
    finally
      RegCloseKey(Key)
    end;
  end;
end;
Использование:
Код:
SetRegKeySecurity(HKEY_LOCAL_MACHINE, 'SYSTEM\ControlSet001\Control\Class\{36FC9E60-C465-11CF-8056-444553540000}');
ПС: но для твоих целей используй ветку, разрешенную в Винде по-умолчанию... (см. посты выше)
Плохого человека должно быть мало...

Последний раз редактировалось HyperZen; 19.07.2011 в 12:52.
HyperZen вне форума Ответить с цитированием
Старый 19.07.2011, 13:11   #10
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

Код:
DACL.Add(.. KEY_ALL_ACCESS.. )
верно, зачем звонить в звонок, заходить через дверь, если можно на танке заехать через стену )

Чтобы запросить UAC, достаточно в манифест добавить строчки

Код:
	      <requestedPrivileges>
	        	<requestedExecutionLevel level="requireAdministrator" uiAccess="false"/>
	      </requestedPrivileges>
и всё. Пользователь будет уведомлён, что прога хочет что-то страшное сделать с системой, и либо позволит ей это, либо нет. Все довольны.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Удаление раздела Ensoph PHP 2 18.11.2010 21:43
Работа с реестром. Не создаётся параметр в HKEY_LOCAL_MACHINE POPOV Общие вопросы Delphi 3 10.11.2010 14:07
HDD-востановление раздела!!! rxxx Компьютерное железо 3 22.07.2010 16:07
Windows7,не работает HKEY_LOCAL_MACHINE\SOFTWARE\Microso ft\Windows NT\CurrentVersion\Windows\AppInit_D LLs ассемблер123 Windows 0 22.04.2010 18:30