删除RegistryKey Win64/32

-1 delphi registry

我试图删除使用Delphi的Windows密钥,但不成功,遵循我正在使用的代码

Function DeleteKeyAPI(hRoot: HKEY; sPath: String; IsReg64: BOOL): BOOL;
Var
  iRet: Integer;
Begin
  If IsReg64 Then
    iRet := RegDeleteKeyEx(hRoot, PChar(sPath), KEY_WOW64_64KEY, 0)
  Else
    iRet := RegDeleteKeyEx(hRoot, PChar(sPath), KEY_WOW64_32KEY, 0);

  If iRet = ERROR_SUCCESS Then
    Result := True
  Else
    Result := False;
End;
Run Code Online (Sandbox Code Playgroud)

在某些键中,我可以删除多个自己的Regedit我的访问被拒绝错误

我该如何解决这个问题?

编辑-----------------------

我尝试按如下方式做,但没有成功

function SHDeleteKey(key: HKEY; pszSubKey: LPCTSTR): DWORD; stdcall;

implementation

{$R *.dfm}

function SHDeleteKey; external 'shlwapi.dll' name 'SHDeleteKeyA';

procedure TForm1.FormCreate(Sender: TObject);
begin
  SHDeleteKey(HKEY_LOCAL_MACHINE, 'SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Run\AdobeCS6ServiceManager');
end;
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

Dav*_*nan 5

您应该检查价值iRet以了解更多信息.这是一个Win32错误代码,它将提供失败原因的更多详细信息.

文档:

要删除的子项不能包含子项.要删除密钥及其所有子密钥,您需要枚举子密钥并单独删除它们.要以递归方式删除密钥,请使用RegDeleteTree或SHDeleteKey函数.

这是一种常见的故障模式,即您尝试删除的子项本身具有子项.我不确定错误代码是什么ERROR_DIR_NOT_EMPTY.

另一种常见的故障模式是命名子密钥不存在.那会导致错误代码ERROR_PATH_NOT_FOUND或者可能ERROR_FILE_NOT_FOUND.

最后,我猜是真正的问题,你无法获得密钥的删除权限.由于您使用备用注册表标志,我怀疑您正在尝试删除HKLM下的子项.您的流程需要足够的权限才能执行此操作.通常,这意味着作为提升的管理员用户运行.ERROR_ACCESS_DENIED如果您没有足够的权利,您将获得.


关于您的编辑,AdobeCS6ServiceManager是一个值而不是一个键.你需要的功能是RegDeleteValue.阅读注册表以了解这些术语的含义:https://msdn.microsoft.com/en-us/library/windows/desktop/ms724182.aspx

此外,您提出一个问题RegDeleteKeyEx然后编辑以显示调用的代码是令人失望的SHDeleteKey.请尽量坚持原来的问题.

  • 不,我的答案是准确的.你需要退后一步,随意停止攻击.认为!了解密钥和值之间的区别.您正在尝试删除值.做一些研究.不要疯狂地连枷. (7认同)
  • 这是一个价值而不是关键.请不要再次更改问题. (2认同)