首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >用Delphi编写Windows Service应用程序的注册表

用Delphi编写Windows Service应用程序的注册表
EN

Stack Overflow用户
提问于 2018-08-27 02:27:54
回答 1查看 814关注 0票数 -1

我正在windows服务上工作,我需要在windows服务模式下写入注册表HKCU密钥,但我知道这是不可能的。

代码语言:javascript
复制
HKCU\Software\Microsoft\Windows\CurrentVer\Policies\Explorer\RestrictRun

我需要写这个键,如果我不能用windows服务写这个键,没有管理员权限我怎么写这个键呢?或者这是可能的?

实际上我可以在HKLM上写这个密钥,但它在这个密钥上不起作用。

代码语言:javascript
复制
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。

EN

回答 1

Stack Overflow用户

发布于 2018-08-27 03:18:28

您不需要管理员权限即可从用户自己的会话中运行的应用程序访问用户的HKEY_CURRENT_USER配置单元的大部分部分。但是,非管理员用户对HKCU\Software\Microsoft\Windows\CurrentVersion\Policies及其子项没有明确的写访问权限。因此,您需要管理员权限才能修改策略。

服务可以使用CreateProcessAsUser()在特定用户的会话中运行非服务应用程序,前提是该用户已经登录。该服务可以使用WTSEnumerateSessions()WTSQuerySessionInformation()来定位所需的用户会话,然后使用WTSQueryUserToken()来获取CreateProcessAsUser()所需的会话的用户令牌。

但是,如果服务想要直接访问用户的HKEY_CURRENT_USER配置单元,并且该服务不是以该用户的身份运行,则该服务必须首先模拟该用户,然后它可以调用RegOpenCurrentUser()来获取该用户的HKEY_CURRENT_USER配置单元的HKEY句柄。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52029161

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档