我听说 Windows 为 PC 创建了一个唯一的 key ,称为“MachineID”。我在注册表中找到了两个位置。只有位置“HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography”应该是正确的。我尝试通过此函数读取值:
Function GetMaschineID:string;
var
Reg : TRegistry;
//HKEY_CURRENT_USER\Software\Microsoft\MSNMessenger = {dd239a44-fa0d-43ff-a51c-5561d3e39de3}
//HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography = a06b0ee0-b639-4f55-9972-146776bcd5e4
begin
Reg := TRegistry.Create(KEY_READ);
try
Reg.Rootkey:=HKEY_LOCAL_MACHINE; //Hauptschlüssel
//Reg.RootKey:=HKEY_CURRENT_USER;
if Reg.OpenKey('SOFTWARE\Microsoft\Cryptography\',false) then //Unterschlüssel öffnen
//if Reg.OpenKey('Software\Microsoft\MSNMessenger\',false) then //Unterschlüssel öffnen
begin
Result:=Reg.ReadString('MachineGuid');
end;
finally
Reg.Free;
end;
end;
这个版本产生一个空字符串;您会看到注册表中的结果作为注释。 “hkey_Current_user”的第二个版本带来了预期的字符串结果。
我的代码有什么问题或注册表的某些部分是否受读保护?
最佳答案
可能的解释 1
对于 HKLM
你受制于registry redirection .您有一个 32 位进程并试图从注册表的 64 位 View 中读取一个键。默认情况下,您的 32 位进程被重定向到 32 位 View ,该 View (实现细节)位于 Wow6432Node
下。 .
使用 KEY_WOW64_64KEY
从 64 位 View 读取的访问标志。详见此处:How can I read 64-bit registry key from a 32-bit process?
可能的解释 2
您调用OpenKey
HKLM
下的键失败因为您正在请求写入权限,而标准用户没有对 HKLM
的写入权限.使用OpenKeyReadOnly
反而。
其他建议
至少你应该多调试一下。是否调用 Reg.OpenKey
成功还是失败?您应该已经调试到足以知道这一点。也许你做了但没有说。如果 Reg.OpenKey
失败,那么解释 2 最有可能。即使那样,您随后也可能会遇到其他问题。
另请注意,如果调用 Reg.OpenKey
,您的函数不会分配给函数结果变量,或引发错误。失败。我希望编译器会警告你。
关于delphi - 无法从注册表中读取 key ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31812189/