0

我有一个这样的注册表项 ACL 读取请求:

PACL dacl = NULL;
PSECURITY_DESCRIPTOR secDesc = NULL;
if (GetNamedSecurityInfoW(L"HKEY_CURRENT_USER\\SOFTWARE\\SomeSoftware\\SomeKey", SE_REGISTRY_KEY, DACL_SECURITY_INFORMATION, NULL, NULL, &dacl, NULL, &secDesc) != ERROR_SUCCESS)
{ /*... */ }

它失败并出现错误 87,无效参数。但是,如果我使用

HKEY handle;
DWORD Ret = RegOpenKeyExW(HKEY_CURRENT_USER, L"SOFTWARE\\SomeSoftware\\SomeKey", 0, KEY_ALL_ACCESS, &handle);
if (Ret != ERROR_SUCCESS) { /* ... */ }

DWORD secDescSize = 4096;
secDesc = LocalAlloc(LMEM_FIXED, secDescSize);
Ret = (DWORD)RegGetKeySecurity(handle, DACL_SECURITY_INFORMATION, secDesc, &secDescSize);
if (Ret != ERROR_SUCCESS) { /* ... */ }

RegOpenKey()RegGetKeySecurity()成功,并GetSecurityDescriptorDacl()在结果上运行RegGetKeySecurity()也可以。

此代码适用于SE_FILE_OBJECT和读取目录的 ACL。
此代码位于 64 位 Windows 10 Pro 的 32 位应用程序中的 32 位 DLL 中。我的目标是 XP 及更高版本,使用 Visual Studio 2019 Preview。

我在参数验证中可能遗漏了什么?

4

1 回答 1

1

L"HKEY_CURRENT_USER\\SOFTWARE\\SomeSoftware\\SomeKey"不是 的有效对象名称GetNamedSecurityInfoW()。阅读SE_OBJECT_TYPE文档以了解用于注册表项的正确格式:

SE_REGISTRY_KEY

表示注册表项。注册表项对象可以位于本地注册表中,例如CLASSES_ROOT \ SomePath或远程注册表中,例如 \\ ComputerName \ CLASSES_ROOT \ SomePath

注册表项的名称必须使用以下文字字符串来标识预定义的注册表项:“CLASSES_ROOT”、“CURRENT_USER”、“MACHINE”和“USERS”。

试试L"CURRENT_USER\\SOFTWARE\\SomeSoftware\\SomeKey"吧。

于 2021-05-26T02:30:21.883 回答