Odczytanie z rejestru produktid

0

Witam wszystkich

Proszę o pomoc w odczycie danych z rejestru. Nie mogę pobrać z rejestru productid, RegisteredOwner, CSDVersion. Gdy uruchamiam program pod windows 7 64bit, pola są puste. Tylko jako RegisteredOwner wyświetla "Użytkownik systemu Windows", chociaż w tej pozycji w rejestrze widnieje coś innego.
Wszystko natomiast działa poprawnie w XP. Nie wiem co robię źle. Poniżej kod.

var
  Reg: TRegistry;

begin

  form3.richedit1.lines.clear;

  Reg := TRegistry.Create;
  try
    Reg.RootKey := HKEY_LOCAL_MACHINE;

    Reg.OpenKeyReadOnly('SOFTWARE\Microsoft\Windows NT\CurrentVersion');

    form3.RichEdit1.Lines.Add('ProductId: '+Reg.ReadString('ProductId'));
    form3.RichEdit1.Lines.Add('RegisteredOwner: '+Reg.ReadString('RegisteredOwner'));
    form3.RichEdit1.Lines.Add('CSDVersion: '+Reg.ReadString('CSDVersion'));

  finally
    Reg.Free;
  end;

end;

dodanie znacznika <code class="delphi"> - furious programming

0

A testujesz ten kod na włączonym UAC, czy wyłączonym? Poza tym posiadasz prawa administratora, czy nie?

Na WinXP może działać, bo tam nie ma kontroli uzytkowników (przynajmniej nie takiej, jak w Vista+).

0

UAC wyłączony, uruchamiam na koncie admina.

1

No wiadomo, że jeśłi wyświetla jedną z danych to dostęp się powiódł. U mnie na Windows 7 Ultimate 64 bit wyświetla to:

ProductId: 
RegisteredOwner: olesio
CSDVersion: 

Ale zamiast pisać od razu na forum, mogłeś po prostu spojrzeć - choćby pod regedit - czy takie nazwy wartości istnieją. U mnie też one nie figurują. Trzeba by doczytac, kiedy takie wartości się tam znajdą. I pod jakimi systemami.

EDIT: pod XP faktycznie na VMce sprawdziłem, że takie wartości są. Trzeba by zagłębić się w MSDN gdzie sprawdza się takie dane pod nowszymi systemami od XP. Być może skoro już coś kodziśz, to nie polegaj na rejestrze. Ale na tym co zwrócą Tobie odpowiednie funkcje WinAPI do sprawdzania wersji oraz innych detali systemu.

2

Zakladam ze masz aplikacje 32 bitowa. Wtedy na Win 64 bit odczytasz SOFTWARE\Wow6432Node\Microsoft\Windows NT\CurrentVersion
zamiast SOFTWARE\Microsoft\Windows NT\CurrentVersion
Musisz zrobic wykrywanie OS 64 bitowego i wtedy robisz cos takiego

rejestr := TRegistry.Create(KEY_WRITE OR KEY_WOW64_64KEY);

i mozesz ju z poziomu 32 bitowej aplikacji odczytywac wartosci dla 64 bitowych aplikacji.

0

Witam

Mam Delphi 7 i podczas kompilacji wywala mi błąd przy KEY_WOW64_64KEY (niezdeklarowany identyfikator). Zbyt stary Delphi ?

W rejestrze w pozycji SOFTWARE\Microsoft\Windows NT\CurrentVersion są pozycje Productid, RegisteredOwner, CSDVersion, natomiast w SOFTWARE\Wow6432Node\Microsoft\Windows NT\CurrentVersion występuje tylko RegisteredOwner.

Nie ma jakieś innej metody żeby wydobyć produktid bez grzebania w rejestrze ?

0
procedure TForm1.Button1Click(Sender: TObject);
var
  Reg: TRegistry;
begin
  form1.richedit1.lines.clear;
  Reg := TRegistry.Create(KEY_READ OR $0100);
  try
    Reg.RootKey := HKEY_LOCAL_MACHINE;
    Reg.OpenKey('SOFTWARE\Microsoft\Windows NT\CurrentVersion', False);
    form1.RichEdit1.Lines.Add('ProductId: '+Reg.ReadString('ProductId'));
    form1.RichEdit1.Lines.Add('RegisteredOwner: '+Reg.ReadString('RegisteredOwner'));
    form1.RichEdit1.Lines.Add('CSDVersion: '+Reg.ReadString('CSDVersion'));
  finally
    Reg.Free;
  end;
end;
0

Nie mam w tej chwili dostępu do Delphi ale jak chcesz tylko odczytać klucz pod HKLM to w TRegistry jest właściwość coś w stylu OpenKeyReadOnly (lub coś podobnego) i to musisz ustawić na True wtedy bez problemu odczytasz potrzebne wartości z rejestru.

1 użytkowników online, w tym zalogowanych: 0, gości: 1