Delphi Write Registry для приложения-службы Windows - PullRequest
0 голосов
/ 26 августа 2018

Я работаю над службой Windows, и мне нужно записать ключи реестра HKCU в режиме службы Windows, но я знаю, что это невозможно.

HKCU\Software\Microsoft\Windows\CurrentVer\Policies\Explorer\RestrictRun

Мне нужно написать этот ключ, если я не могу сделать это сСлужба Windows, как я могу написать на этот ключ без прав администратора?или это возможно?

На самом деле я могу написать этот ключ на HKLM, но он не работает на этом ключе.

procedure CreatePolicy(AppName: string);
var
  Reg: TRegistry;
Begin
  Reg := TRegistry.Create;
  try
    Reg.RootKey := HKEY_CURRENT_USER;
    if Reg.OpenKey
      ('Software\Microsoft\Windows\CurrentVersion\Policies\Explorer', True) then
      Reg.WriteInteger('RestrictRun', 1);
    if Reg.CreateKey('RestrictRun') then
      if Reg.OpenKey('RestrictRun', True) then
        Reg.WriteString(AppName, AppName);
  except
    Reg.CloseKey;
    Reg.Free;
  end;
  Reg.CloseKey;
  Reg.Free;
end

Моя версия Delphi - XE7.

1 Ответ

0 голосов
/ 26 августа 2018

Вам не нужны права администратора для доступа к большинству разделов куста HKEY_CURRENT_USER пользователя из приложения, которое выполняется в его сеансе.Тем не менее, пользователи без прав администратора не имеют права на запись специально для HKCU\Software\Microsoft\Windows\CurrentVersion\Policies и его подразделов.Итак, вы застряли, требуя прав администратора для изменения политик.

Служба может использовать CreateProcessAsUser() для запуска не обслуживающего приложения в сеансе конкретного пользователя, если этот пользователь уже зарегистрированв. Служба может использовать WTSEnumerateSessions() и WTSQuerySessionInformation(), чтобы найти нужный сеанс пользователя, а затем использовать WTSQueryUserToken() для получения токена пользователя сеанса.это необходимо для CreateProcessAsUser().

Однако, если служба хочет напрямую получить доступ к кусту HKEY_CURRENT_USER пользователя, и если служба не работает от имени этого пользователя, то сначала служба должна выдать себя за этого пользователя, а затемможно позвонить RegOpenCurrentUser(), чтобы получить HKEY дескриптор для HKEY_CURRENT_USER улья пользователя.

...