【问题标题】:Delete RegistryKey Win64/32删除 RegistryKey Win64/32
【发布时间】:2016-08-28 09:14:38
【问题描述】:

我正在尝试使用 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;

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

我该如何解决这个问题?

已编辑-----------

我尝试如下操作,但没有成功

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;

【问题讨论】:

    标签: delphi registry


    【解决方案1】:

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

    来自documentation

    要删除的子项不能有子项。要删除一个键及其所有子键,您需要枚举子键并单独删除它们。要递归删除键,请使用 RegDeleteTree 或 SHDeleteKey 函数。

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

    另一种常见的故障模式是命名的子键不存在。这将导致错误代码ERROR_PATH_NOT_FOUNDERROR_FILE_NOT_FOUND

    最后,我猜是真正的问题,您无法获得对密钥的删除权限。由于您使用的是备用注册表标志,我怀疑您正试图删除 HKLM 下的子项。您的进程需要足够的权限才能执行此操作。通常这意味着以提升的管理员用户身份运行。权限不足会得到ERROR_ACCESS_DENIED


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

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

    【讨论】:

    • 即使以管理员身份运行它也不会删除密钥,regedit own(也以管理员身份运行)返回以下错误:“无法删除所有指定的值”
    • 如果你找不到iRet的值,那就很难知道该说什么了。你确定你不可能获得那个值吗?
    • 这是一个值,而不是一个键。请不要再更改问题。
    • 没有。我的回答是准确的。您需要退后一步并随机停止黑客攻击。思考!了解键和值之间的区别。您正在尝试删除一个值。做一些研究。不要疯狂地连枷。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-09
    • 2011-09-11
    • 1970-01-01
    相关资源
    最近更新 更多