How can I read 64-bit registry key from a 32-bit process?

后端 未结 4 2015
轻奢々
轻奢々 2020-12-16 03:01

I\'ve been using the value of key MachineGuid from HKEY_LOCAL_MACHINE\\Software\\Microsoft\\Cryptography to uniquely identify hosts, but from 32-b

4条回答
  •  暖寄归人
    2020-12-16 03:29

    In my use of this registry key I went a step further. If the value didn't exist I created it: not in HKEY_LOCAL_MACHINE, that would require elevation, but in HKEY_CURRENT_USER. Anyone seeing the introduced key there is unlikely to realise that it's a dummy.

    function GetComputerGUID: String;
    var
      Reg: TRegistry;
      oGuid: TGUID;
      sGuid: String;
    begin
      Result := '';
      // Attempt to retrieve the real key
      Reg := TRegistry.Create(KEY_READ OR KEY_WOW64_64KEY);
      try
        Reg.RootKey := HKEY_LOCAL_MACHINE;
        if Reg.OpenKeyReadOnly('SOFTWARE\Microsoft\Cryptography') and Reg.ValueExists('MachineGuid') then
          Result := Reg.ReadString('MachineGuid');
        Reg.CloseKey;
      finally
        Reg.Free;
      end;
      // If retrieval fails, look for the surrogate
      if Result = '' then begin
        Reg := TRegistry.Create;
        try
          Reg.RootKey := HKEY_CURRENT_USER;
          if Reg.OpenKey('SOFTWARE\Microsoft\Cryptography', True) then begin
            if Reg.ValueExists('MachineGuid') then
              Result := Reg.ReadString('MachineGuid')
            else begin
              // If the surrogate doesn't exist, create it
              if CreateGUID(oGUID) = 0 then begin
                sGuid := Lowercase(GUIDToString(oGUID));
                Reg.WriteString('MachineGuid', Copy(sGuid, 2, Length(sGUID) - 2));
                Result := Reg.ReadString('MachineGuid');
              end;
            end;
          end;
          Reg.CloseKey;
        finally
          Reg.Free;
        end;
      end;
      if Result = '' then
        raise Exception.Create('Unable to access registry value in GetComputerGUID');
    end;
    

    That's a good point from @Remy Lebeau - TeamB though; I should mod the above code appropriately.

提交回复
热议问题