Autor Beitrag
Klabautermann
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Veteran
Beiträge: 6366
Erhaltene Danke: 60

Windows 7, Ubuntu
Delphi 7 Prof.
BeitragVerfasst: Do 28.08.03 15:58 
Hallo,

ähnlich wie dieser Kollege habe ich Probleme beim Arbeiten in der Regestry unter HKEY_LOCAL_MACHINE.

Ich versuche dort im Unterschlüssel Software einen neuen Schlüssel anzulegen, leider schlägt dies Fehl.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
VAR
    Reg : tRegistry;
begin
    Reg := tRegistry.Create;
    Reg.RootKey := HKEY_LOCAL_MACHINE;
    Reg.CreateKey('\Sorfware\MeinSchluessel');

In der Create Key Zeihle wird eine Exception mit der Meldung:
Zitat:
Erzeugung von Schlüssel 'Schlüsselname' mislungen.


Was mache ich falsch?

Gruß
Klabautermann


Zuletzt bearbeitet von Klabautermann am Fr 29.08.03 11:11, insgesamt 1-mal bearbeitet
Klabautermann Threadstarter
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Veteran
Beiträge: 6366
Erhaltene Danke: 60

Windows 7, Ubuntu
Delphi 7 Prof.
BeitragVerfasst: Do 28.08.03 16:08 
Hallo noch mal.

Ich habe gerade in der Online Hilfe diesen Passuns gefunden:

Delphi 7 Hilfe hat folgendes geschrieben:
Alle erzeugten Schlüssel haben die Zugriffsebene KEY_ALL_ACCESS. Wenn Sie Schlüssel mit eingeschränktem Zugriff wünschen, müssen Sie die Windows-API direkt aufrufen.

Haben Schlüssel unter HKEY_LOCAL_MACHINE generell eine andere Zugriffsebene als KEY_ALL_ACCESS?
Das währe zumindest Plausiebel.

Gruß
Björn
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Do 28.08.03 16:09 
Das schreibt meine Hilfe dazu:
Zitat:

CreateKey creates only non-volatile keys. If you need to create volatile keys on Windows NT, you must call the Windows API directly.

CreateKey creates keys with a security access of KEY_ALL_ACCESS. If you need to create keys with more restricted access, you must call the Windows API directly.

Alternativ probier mal OpenKey.
Klabautermann Threadstarter
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Veteran
Beiträge: 6366
Erhaltene Danke: 60

Windows 7, Ubuntu
Delphi 7 Prof.
BeitragVerfasst: Do 28.08.03 16:21 
Hallo,
Luckie hat folgendes geschrieben:
Alternativ probier mal OpenKey.

das hatte ich zuerst, das selbe Problem.

Dann muss ich wohl mal die richtigen API Befehle raussuchen.

Es sei denn jemand hat einen andern Tip für mich *hoff*.

Gruß
Klabautermann
kongreddgrass
ontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic starofftopic star
Beiträge: 238

Win 98, Win 2000, Win Xp Prof.,Linux 8.2 Prof
Delphi 6
BeitragVerfasst: Do 28.08.03 17:55 
Kann es sein, das man etwas in die uses-Klauses einbinden muss.
Ich rede blind.

Gruß
Mike

_________________
o.o
kongreddgrass
ontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic starofftopic star
Beiträge: 238

Win 98, Win 2000, Win Xp Prof.,Linux 8.2 Prof
Delphi 6
BeitragVerfasst: Do 28.08.03 18:08 
Hallo nochmal
ich hab grad das NittyGrittyDelphi6Buch.
Da steht *puh*

Werte in die Registry schreiben
Um werte in die Registry zu schreiben, muss ein Schlüssel geöffnet sein. Sie öffnen einen Schlüssel mit der Methode Open Key. Übergeben werden einmal der Name des Schlüssel, der geöffnet werden soll, und eine boolesche Variable, die angibt, ob der zu öffnende Schlüssel angelegt werden soll, falls er nicht exisiert.

wenn Sie einen Schlüssel definitiv nur anlegen wollen, können Sie die Methode Create Key benutzen. Um einen Schlüssel zu löschen, benutzen Sie die Methode Delete Key. Beide Methoden geben einen booleschen Wert zurück, der den Erfolg der Operation signalisiert.
.....Blablabla....Das folgende Listing zeigt, wie sie Werte in die Registry schreiben:

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
procedure InsertValueToRegistry;
var
    Reg : TRegistry;
begin
   Reg : TRegistry.Create;
   try
     Reg.RootKey := HKEY_CURRENT_USER;
     if OpenKey('TestKey', TRUE) then
        WriteString('TestString','Dies ist ein Test');
finally
    CloseKey;
    Reg.Free;
  end;
end;





Hoffe das Hilft dir.
Und wenn das hilft, dann bedanke dich nicht bei mir, sondern bei Frank Eller.

Gruß
Mike

_________________
o.o
Klabautermann Threadstarter
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Veteran
Beiträge: 6366
Erhaltene Danke: 60

Windows 7, Ubuntu
Delphi 7 Prof.
BeitragVerfasst: Do 28.08.03 18:42 
Hallo,

danke für den versuch kongreddgrass. Aber wie gesagt das Problem hängt an dem Hauptschlüssel. Wenn ich die Zeile
ausblenden Delphi-Quelltext
1:
Reg.RootKey := HKEY_LOCAL_MACHINE;					

in
ausblenden Delphi-Quelltext
1:
Reg.RootKey := HKEY_CURRENT_USER;					

ändere funktioniert das ganze. Allerding muss ich auf HKEY_LOCAL_MACHINE zugreifen.
Da es aber im User schlüssel klappt, scheidet eine grobe fehlbedinung (vergessen einen Schlüssel zu öffnen) aus. Wahrscheinlich liegt es tatsächlich an der zugriffsberechtigung, auch wenn ich das ganze noch nicht verstehe.

Gruß
Klabautermann
kongreddgrass
ontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic starofftopic star
Beiträge: 238

Win 98, Win 2000, Win Xp Prof.,Linux 8.2 Prof
Delphi 6
BeitragVerfasst: Do 28.08.03 18:56 
Ich denke mal dass du am Anfang selber in die Registry eingreifen musst.
Starte Ausführen: regedit
Dann gehe links zu Hkey_Local_Machine
Dann klicke es an
Links müsstes du FullLogging doppelklicken
Dann den Wert auf Yes stellen.

ABER MACH VORHER EIN BACKUP, IST MIR NUR SO AUFGEFALLEN

Gruß
Mike

_________________
o.o
Terra23
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 872

Win 8
Delphi 7
BeitragVerfasst: Do 28.08.03 20:54 
Hallo Klabautermann.

Also ich weiß nicht, ob es vielleicht am Betriebssystem liegen kann, aber ich kann ohne Probleme in den RootKey "HKEY_LOCAL_MACHINE" schreiben.

Ich habe einfach mal ein Label mit dem Text "Schlüssel für die Registry" und einen Button. Auf den Button habe ich anhand deiner Beschreibung folgendes gelegt:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
Datei:=TRegistry.Create;
Datei.RootKey:=HKEY_LOCAL_MACHINE;
Datei.OpenKey('\Software\Mein neuer Schluessel', True);
Datei.WriteString('Testwert', Label1.Caption);
Datei.Free;


Und bei mir funktioniert es. Wenn ich die Registry dann aufrufe, dann steht unter "HKEY_LOCAL_MACHINE\Software" der Ordner "Mein neuer Schluessel" und in diesem findet sich dann die Angabe "Testwert" mit dem Wert "Schlüssel für die Registry". Ohne Scheiß, ich habe alles so gemacht, nichts manipuliert.

_________________
Hasta La Victoria Siempre
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Do 28.08.03 21:11 
Ich hab´s auch probiert, und bei mir geht´s auch - wenn ich Admin bin. Das dürfte wohl dein Geheimnis sein, @Terra. Wenn du allerdings auf einem 9x-System arbeitest - ab in die Ecke! :mrgreen: Wenn´s XP ist, dann vermute ich mal, du arbeitest mit dem Benutzer, den du nach der Installation angeben musst. Und der bekommt standardmäßig Admin-Rechte. Aber egal.

Ach, da steht´s ja:
Zitat:
Terra23
Power-Member

Win98 SE
D7 Enterprise


@Klabautermann:
PSDK (RegCreateKeyEx) hat folgendes geschrieben:
When you call the RegOpenKeyEx function, the system checks the requested access rights against the key's security descriptor. If the user does not have the correct access to the registry key, the open operation fails. If an administrator needs access to the key, the solution is to enable the SE_TAKE_OWNERSHIP_NAME privilege and open the registry key with WRITE_OWNER access. For more information, see Enabling and Disabling Privileges.

Der Tipp, es mit dem Recht SE_TAKE_OWNERSHIP_NAME zu versuchen, funktioniert nur bei Admins. Habe es eben als User probiert.

Übrigens:
Zitat:
aben Schlüssel unter HKEY_LOCAL_MACHINE generell eine andere Zugriffsebene als KEY_ALL_ACCESS?

Die Zugriffsebene bestimmst du, nicht das System! Borland hat es in dem Fall zu gut gemeint und öffnet
ausblenden Delphi-Quelltext
1:
reg := TRegistry.Create;					

standardmäßig mit KEY_ALL_ACCESS. Das System vergleicht nur, ob die angestrebten Rechte zu deinem Benutzertyp passen und verweigert notfalls die Mitarbeit (s. PSDK-Auszug). Aus dem Grund gibt es die überladene (sagt man das so?) Funktion
ausblenden Delphi-Quelltext
1:
reg := TRegistry.Create(KEY_READ);					

bei der du das Zugriffsrecht (KEY_READ, in dem Fall) selbst bestimmen kannst. Zum Anlegen eines Schlüssels brauchst du min. KEY_CREATE_SUB_KEY. Aber das liegt wieder an den Benutzerrechten.

Du hast leider nicht verraten, ob du als Admin arbeitest. Wenn, und es geht trotzdem nicht, dann bin ich im Moment leider auch ratlos. :oops:

Gruß.
Klabautermann Threadstarter
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Veteran
Beiträge: 6366
Erhaltene Danke: 60

Windows 7, Ubuntu
Delphi 7 Prof.
BeitragVerfasst: Do 28.08.03 21:37 
Hallo,

kongreddgrass hat folgendes geschrieben:
Ich denke mal dass du am Anfang selber in die Registry eingreifen musst.

Das ist leinder nicht möglich, da es hier um Automatisierungen geht, von welchen der User nichts wissen soll. Genauere erklährung weiter unten.

Terra23 hat folgendes geschrieben:
Also ich weiß nicht, ob es vielleicht am Betriebssystem liegen kann,

Ja, es kann, da NT Systeme im gegensatz zu 9xern eine Rechteverwaltung haben.

MathiasSimmack hat folgendes geschrieben:
Du hast leider nicht verraten, ob du als Admin arbeitest. Wenn, und es geht trotzdem nicht, dann bin ich im Moment leider auch ratlos.

Ja bei meinen Tests bin ich das, das spätere Programm wird wenn ich das richtig sehe auch Admin Rechte haben.
Ich schätze da muss ich mal ein wenig weiter ausholen:
Es geht um folgendes: Einer unserer Kunden möchte häufig seine Rechner neu installieren. Dies geschieht indem ein Image auf diese zurückgeschrieben wird. Also der Kunde Legt eine CD mit dem Image und einem Mini-Linux System ein, das Linux System Bootet und schreibt das Image zurück. So wird verhindert das die Rechner zu sehr vermüllen. Das Problem ist nun, das einige Programme instelliert sind, die Informationen zur Rechnerposition im Netzwerk benötigen. Das fängt z.B. mint dem einfachen Rechnernamen an. Da nicht für jeden Rechenr eine eigene CD erstellt werden soll und das Linux image nicht alle Daten einpflegen kann schreibe ich an einem Service, der die nötigen Daten vor dem ersten Einlogen setzen soll. Das beschränkt sich im wesentlichen auf das schreiben einiger Regestry Einträge unter HKEY_LOCAL_MACHINE. Ein Eintrag wird dort auch von dem Programm selbst angelegt. Und genau an der Stelle habe ich meine Probleme.

MathiasSimmack hat folgendes geschrieben:
Ich hab´s auch probiert, und bei mir geht´s auch - wenn ich Admin bin.

Der Account auf dem ich es entwickelt habe hat Admin Rechte, ich habe es aber auch als Administrator höchst persönlich getestet.
Es ist Fakt, das ich die einträge im Regestry Editor, erzeugen und ändern kann über die tRegestry Komponente unter Delphi (7) bekomme ich die oben angegebene wenig ausagekräftige Fehlermeldung.

MathiasSimmack hat folgendes geschrieben:
Der Tipp, es mit dem Recht SE_TAKE_OWNERSHIP_NAME zu versuchen, funktioniert nur bei Admins. Habe es eben als User probiert.

Den Service sollte ich doch mit Admin Rechten laufen lassen könen. Dann müsste es also einsetzbar sein - hoffendlich. (Zu testzwecken habe ich den Code momentan in einer normalen Anwendung, welche von Admin ausgeführt wird).

MathiasSimmack hat folgendes geschrieben:
Die Zugriffsebene bestimmst du, nicht das System! Borland hat es in dem Fall zu gut gemeint und öffnet

Sourcecode:
reg := TRegistry.Create;

standardmäßig mit KEY_ALL_ACCESS. Das System vergleicht nur, ob die angestrebten Rechte zu deinem Benutzertyp passen und verweigert notfalls die Mitarbeit (s. PSDK-Auszug). Aus dem Grund gibt es die überladene (sagt man das so?) Funktion

Sourcecode:
reg := TRegistry.Create(KEY_READ);

bei der du das Zugriffsrecht (KEY_READ, in dem Fall) selbst bestimmen kannst. Zum Anlegen eines Schlüssels brauchst du min. KEY_CREATE_SUB_KEY. Aber das liegt wieder an den Benutzerrechten.

Den überladenen Konstruktor habe ich auch gesehen aber damit kann ich meine Rechte ja im Grunde nur runterstufen, da ich sie aber voll brauche um Werte anzulegen und zu ändern macht das keinen Sinn. Die Funktion CreateKey ignoriert diese Einstellung übrigens.

Danke für die Tipps, ich hoffe sie bringen mcih weiter an die Lösung, dass wird morgen wohl ein längerer Tag :(.

Gruß
Klabautermann

PS: Es geht übrigens um ein W2k System.
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Do 28.08.03 22:35 
Klabautermann hat folgendes geschrieben:
Es ist Fakt, das ich die einträge im Regestry Editor, erzeugen und ändern kann über die tRegestry Komponente unter Delphi (7) bekomme ich die oben angegebene wenig ausagekräftige Fehlermeldung.

Ich hoffe mal nicht, dass es ein Problem in Delphi 7 ist, denn wenn ich mein Glück mit Admin-Rechten versuche (und Delphi 5), kann ich so einen Schlüssel ja anlegen.
Und weil du selbst schreibst, er steckt unter "Software", dürfte es wohl auch keiner von denen sein, auf denen Windows die Finger drauf hat.


@Terra: Darfst wieder aus der Ecke rauskommen. :)
Klabautermann Threadstarter
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Veteran
Beiträge: 6366
Erhaltene Danke: 60

Windows 7, Ubuntu
Delphi 7 Prof.
BeitragVerfasst: Fr 29.08.03 09:58 
MathiasSimmack hat folgendes geschrieben:
Ich hoffe mal nicht, dass es ein Problem in Delphi 7 ist, denn wenn ich mein Glück mit Admin-Rechten versuche (und Delphi 5), kann ich so einen Schlüssel ja anlegen.

Ich habe das Experimental-Programm gerade mal mit D5 übersetzt. Da kommt der selbe Fehler. Übrigens das verwenden vom OpenKey('BlaBla', TRUE); schlägt genau so fehl.

Könntest du mir mal dein Beispiel inklusive Source & Kompilat schicken, damit ich sehen ob es hier läuft und wenn es läuft was ich übersehen habe?

MathiasSimmack hat folgendes geschrieben:
Und weil du selbst schreibst, er steckt unter "Software", dürfte es wohl auch keiner von denen sein, auf denen Windows die Finger drauf hat.

Eben ich total perplex das ich da nciht dran rumspielen darf :(.

Gruß
Klabautermann
Klabautermann Threadstarter
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Veteran
Beiträge: 6366
Erhaltene Danke: 60

Windows 7, Ubuntu
Delphi 7 Prof.
BeitragVerfasst: Fr 29.08.03 11:10 
Arrrg user defined image,

ich hasse solche Fehler.

Guckt euch mal den Schlüssel den ich anlegen will genauer an:

Zitat:
Reg.CreateKey('Sorfware\MeinSchluessel');


Da sitze ich mal wieder Stunden davor und sehe es nicht.

Danke euch allen für die Hilfe. Jetzt wo ich das ganze verbessert habe geht es auch user defined image.

Gruß
Klabautermann
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Fr 29.08.03 12:04 
Du weißt, was du zu tun hast? Ab in die Ecke und :autsch:
chris_davidi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 76

Windows 98 SE
Delphi 3
BeitragVerfasst: Fr 29.08.03 14:15 
*loooool*
Terra23
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 872

Win 8
Delphi 7
BeitragVerfasst: Fr 29.08.03 14:24 
*aus der Ecke kommt*

@Mathias: Ich wäre gern früher gekommen, aber ich habe PC-Probs (siehe OffTopic).

@Klabautermann: Ja, manchmal steckt der Fehler im Detail. Dann muss ja vielleicht bei dem Kollegen der Fehler auch da irgendwo stecken. :-)

Schön, daß auch Mods unfehlbar sind. :rofl:

_________________
Hasta La Victoria Siempre
Klabautermann Threadstarter
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Veteran
Beiträge: 6366
Erhaltene Danke: 60

Windows 7, Ubuntu
Delphi 7 Prof.
BeitragVerfasst: Fr 29.08.03 14:34 
Hi,
Terra23 hat folgendes geschrieben:
@Klabautermann: Ja, manchmal steckt der Fehler im Detail. Dann muss ja vielleicht bei dem Kollegen der Fehler auch da irgendwo stecken. :-)

Jaja, das Problem bei solchen Fehlern ist, das man etwas zeieinhalbmillionen mal drauf guckt :shock: und es nicht bemerkt.

Terra23 hat folgendes geschrieben:
Schön, daß auch Mods unfehlbar sind. :rofl:

Nein, unfehlbar sind nur die Admins ;).

Gruß
Klabautermann