Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Registry HK_LM ReadOnly ohne Adminrechte ? (https://www.delphipraxis.net/167012-registry-hk_lm-readonly-ohne-adminrechte.html)

DataCool 9. Mär 2012 09:38

Registry HK_LM ReadOnly ohne Adminrechte ?
 
Hallo Leute,

ich versuche gerade unter Win7 64Bit, einen Wert unter :
[SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\SpecialAccounts\UserLis t] zu Lesen.
Das ich ohne Admin-Rechte dort nicht Schreiben kann ist mir klar, aber Lesen sollte doch wohl gestattet sein ?!

Mein Code:
Delphi-Quellcode:
function HiddenUserAccountExist : Boolean;
const
   cRegKey = 'SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\SpecialAccounts\UserList';
   cKEY_WOW64_64KEY = $0100; // Notwendig, weil dieses Projekt noch unter D7 "läuft"

var Reg : TRegistry;
begin
  Result := False;
  Reg := TRegistry.Create(KEY_READ or cKEY_WOW64_64KEY);
  try
    Reg.RootKey := HKEY_LOCAL_MACHINE;
    Reg.Access := KEY_READ or cKEY_WOW64_64KEY; // normal zum Test manuell setzen, aber Access-Wert ist davor auch schon derselbe
    if Reg.KeyExists(cRegKey) then begin
      if Reg.OpenKeyReadOnly(cRegKey) then begin
      //if Reg.OpenKey(cRegKey,false) then begin // auch OpenKey Variate nützt nichts, denn KeyExists steigt vorher schon mit false aus
        Result := Reg.ValueExists('SomeUserName');
        Reg.CloseKey;
      end
      else begin
        OutputDebugString(PChar(SysErrorMessage(GetLastError)));
      end;
    end
    else
      OutputDebugString(PChar('"'+cRegKey+'" nicht vorhanden'));
      // Landet jetzt immer hier, obwohl der Key definitiv existiert ...
  finally
    Reg.Free;
  end;
end;
Habe ich irgendeinen Fehler den ich gerade übersehe ?
Oder ist LOCAL_MACHINE wirklich ohne Adminrechte nicht mehr verfügbar ?
Ich möchte doch "nur" überprüfen, ob ein bestimmer versteckter Benutzeraccount existiert ...

Greetz Data

Bummi 9. Mär 2012 09:53

AW: Registry HK_LM ReadOnly ohne Adminrechte ?
 
Kann es sein daß noch ein Reg.KeyExists fehlt?

DataCool 9. Mär 2012 10:08

AW: Registry HK_LM ReadOnly ohne Adminrechte ?
 
@Brummi:
Eigentlich war ich der Meinung das KeyExist nicht notwendig ist,
denn wenn der Key nicht existiert, darf das ganze ruhig fehlschlagen.
Zur Sicherheit habe ich es jetzt aber doch eingebaut, s. modifizierten Code oben.
Jetzt sagt er mir doch tatsächlich das der Key nicht existiert, obwohl dieser definitiv existiert,
habe hier mal eben den Registry-Schlüssel exportiert:
Code:
Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\SpecialAccounts\UserList]
"SomeUser"=dword:00000000
Werde ich langsam alt, bin ich blind oder was ist hier los ?

Danke & Gruß

Data

Bummi 9. Mär 2012 10:15

AW: Registry HK_LM ReadOnly ohne Adminrechte ?
 
Ich vermute Du willst einen 64-Bit Schlüssel mit einer 32-Bitanwendung lesen.
Schau mal ob Du damit was anfangen kannst
http://www.delphipraxis.net/155861-w...direction.html


[Edit]
Sorry für meine Dummheit ... Du benötigst wahrscheinlich
Delphi-Quellcode:
 Reg := TRegistry.Create(KEY_READ or KEY_WOW64_64KEY);
[/Edit]

CCRDude 9. Mär 2012 10:22

AW: Registry HK_LM ReadOnly ohne Adminrechte ?
 
Die ganze Redirection ist aber etwas übertrieben für diesen Fall. Hier reicht es für den Zugriff auf den 64-bit-Teil eigentlich, das Property Access anzupassen (Stichwort KEY_WOW64_64KEY). Wenn ich mich recht erinnere, hatte OpenKeyReadOnly da auch noch Bugs. Eventuell also lieber OpenKey und vorher Access := KEY_READ or KEY_WOW64_64KEY (o.ä.).

DataCool 9. Mär 2012 10:43

AW: Registry HK_LM ReadOnly ohne Adminrechte ?
 
habe obrigen Sourcecode nochmals angepasst, leider immer noch erfolglos.
Besonders zu erwähnen ist vielleicht die Entwicklung unter D7 bei diesem Projekt.
Des Weiteren tritt das Problem wahrscheinlich nur auf meiner Entwicklungsmaschine W7 64Bit auf,
produktiv brauche ich definitiv im Moment nur Zugriff auf 32Bit XP-Registry.
Trotzdem würde ich der Ursache gerne auf den Grund gehen.

Ich komme im obrigen Code ja gar nicht zum OpenKey / OpenKeyReadOnly,
der Aufruf Reg.KeyExist schläfgt immer fehl ....

Noch Ideen ?

Danke & Gruß

Data

DataCool 9. Mär 2012 11:02

AW: Registry HK_LM ReadOnly ohne Adminrechte ?
 
Habe jetzt selber die Lösung gefunden,
wenn mann TRegistry nicht benutzt und dann die schon oben genannten Tipps berücksichtigt,
dann klappt's auch mit dem Nachbarn ;-)

Delphi-Quellcode:
function HiddenUserAccountExist : Boolean;
const
   cRegKey = 'SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\SpecialAccounts\UserList';
   cKEY_WOW64_64KEY = $0100;  // <--- für ältere Delphi Versionen

var aKey : HKEY;
    dwType : DWORD;
    dwLen : DWORD;
    iRes  : Integer;
begin
  Result := False;
  iRes := RegOpenKeyEx(HKEY_LOCAL_MACHINE, cRegKey, 0, KEY_READ or cKEY_WOW64_64KEY, aKey);
  if iRes = ERROR_SUCCESS then begin
    try
      Result := RegQueryValueEx(aKey,'SomeUser', nil, @dwType, nil, @dwLen) = ERROR_SUCCESS;
    finally
      RegCloseKey(aKey);
    end;
  end;
end;
Danke nochmal an alle die sich beteilgt haben,

Greetz Data

Popov 9. Mär 2012 11:12

AW: Registry HK_LM ReadOnly ohne Adminrechte ?
 
Nur mal so als Nachtrag: auch bei der Registry kann man genau wie bei Dateien Berechtigungen vergeben. Ob man also lesen oder schreiben kann, kann man ermitteln in dem man einfach auf Berechtigungen klickt.

Das sollte zwar kaum passieren, aber man kann auch sich selbst, ohne Adminrechte, Rechte entziehen. Und was ich kann, kann aber auch jedes böse Programm. Sollte zwar kaum passieren, aber wer weiß. Also zuerst gucken, kostet nichts.

generic 9. Mär 2012 12:28

AW: Registry HK_LM ReadOnly ohne Adminrechte ?
 
Zitat:

Zitat von DataCool (Beitrag 1155571)
Delphi-Quellcode:

  Reg := TRegistry.Create(KEY_READ or cKEY_WOW64_64KEY);

Bei manchen Delphi-Versionen gab es glaube ich ein Bug, welcher eine Maske auf die Parameter angewendet hat. Dadurch ist dann das Wow64* verloren gegangen.

Bei D2007 habe ich keine Probleme gehabt (in Software-UpToDate),
einen Key nur lesend in 64bit zu öffnen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:25 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz