Entwickler-Ecke

IO, XML und Registry - Datei in Registry einbinden (HKEY_LOCAL_MACHINE)


Tonix - Sa 07.03.09 12:16
Titel: Datei in Registry einbinden (HKEY_LOCAL_MACHINE)
Hallo
ich habe ein Frage
und zwar soll eine Datei die ich durch eine exe erstellt beim Systemstart automatisch Aufgerufen werden.
Deshalb möchte ich sie durch das Programm in die Regitry kopieren und zwar nach HKEY_LOCAL_MACGINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run

hier wird die Datei erstellt

C#-Quelltext
1:
using (StreamWriter sw = new StreamWriter("C:\\Dokumente und Einstellungen\\voigt\\desktop\\Meine_Datei.txt"))                    

Wie ich die Datei nun in dieses Verzeichnis bekomme weiß ich leider nicht
Probiert hab ich es mit

C#-Quelltext
1:
Registry.LocalMachine.                    

aber ein brauchbares Ergebnis hab ich nie erhalten.


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Diagnostics;
using Microsoft.Win32;


hat jemand ein Lösung für meine Problem oder weiß jemand wie ich eine Datei aufrufen kann OHNE sie in Autostart zu Verschieben. Das Programm sollte natürlich auch in der Lage sein das Auszuführen, denn der Eintrag soll nur durch das Programm erfolgen.

danke im Vorraus
mfg Tonix


jaenicke - Sa 07.03.09 12:29

user profile iconTonix hat folgendes geschrieben Zum zitierten Posting springen:
und zwar soll eine Datei die ich durch eine exe erstellt beim Systemstart automatisch Aufgerufen werden.
Deshalb möchte ich sie durch das Programm in die Regitry kopieren und zwar nach HKEY_LOCAL_MACGINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run
Du meinst du möchtest den Dateinamen und Pfad dort eintragen? ;-)

user profile iconTonix hat folgendes geschrieben Zum zitierten Posting springen:
Wie ich die Datei nun in dieses Verzeichnis bekomme weiß ich leider nicht
Das ist kein Verzeichnis sondern ein Registryschlüssel. Und dir sollte klar sein, dass du für den Zugriff auf HKEY_LOCAL_MACHINE Administratorrechte brauchst. Deshalb würde ich eher HKEY_CURRENT_USER empfehlen.

user profile iconTonix hat folgendes geschrieben Zum zitierten Posting springen:
Probiert hab ich es mit

C#-Quelltext
1:
Registry.LocalMachine.                    

aber ein brauchbares Ergebnis hab ich nie erhalten.
Was hast du denn damit probiert? Erstmal fängst du ja so an:

C#-Quelltext
1:
2:
3:
RegistryKey MyKey = Registry.CurrentUser.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Run");
if (MyKey != null)
  ...
An der Stelle hast du dann den Schlüssel geöffnet und kannst deinen Wert hineinschreiben. Mehr dazu findest du in der Dokumentation:
http://msdn.microsoft.com/en-us/library/microsoft.win32.registry.aspx


JüTho - Sa 07.03.09 13:34

Ich empfehle, auf den Eintrag in der Registry vollständig zu verzichten. Wenn Du als Pfad für eine solche Datei Environment.GetFolderPath(SpecialFolder.CommonApplicationData) oder LocalApplicationData angibst, kannst du die Suche Windows überlassen. Jürgen


Tonix - Sa 07.03.09 22:49

user profile iconJüTho hat folgendes geschrieben Zum zitierten Posting springen:
Wenn Du als Pfad für eine solche Datei Environment.GetFolderPath(SpecialFolder.CommonApplicationData) oder LocalApplicationData angibst, kannst du die Suche Windows überlassen. Jürgen


So ganz versteh ich das nie
wo kann ich es damit erreichen das die Datei automatisch beim Start geöffnet wird?


jaenicke - Sa 07.03.09 23:06

Ich vermute er hat das verwechselt mit der Speicherung des Pfades zu einer gespeicherten Datendatei oder so. Solch eine Datei wäre natürlich in den Anwendungsdaten gut aufgehoben.
Den Zusammenhang mit dem Thema habe ich vorhin jedenfalls auch nicht verstanden, aber ich denke einmal, dass er dazu noch etwas sagen wird. ;-)


Tonix - So 08.03.09 00:53

Und wie trage ich die Werte ein?
mit WriteLine?


jaenicke - So 08.03.09 03:39

Hast du eigentlich einmal in die Doku geschaut? Oder im Codeeditor geschaut welche Befehle es überhaupt gibt?

WriteLine gibt es in RegistryKey nicht, dafür SetValue, wie dir die Liste der Methoden zeigt:
http://msdn.microsoft.com/en-us/library/microsoft.win32.registrykey_methods.aspx


JüTho - So 08.03.09 10:49

Hallo,

vielleicht habe ich die Frage falsch interpretiert. Ich hatte das Problem vor allem darin gesehen, dass die Datei sicher erkannt und gefunden wird.

Eine Datei, die fest für ein Programm benutzt werden soll, kann doch eine Namen erhalten, den sich das Programm selbst ausdenkt und merkt. Wenn eine solche Datei in dem von mir genannten Verzeichnis CommonApplicationData gespeichert wird, ist sie eindeutig identifizierbar und kann automatisch (beim FormClosing) gespeichert und (bei FormLoad oder in program.cs) geladen werden.

Hinweis wegen der geäußerten Zweifel an meiner obigen Antwort: Ich habe noch niemals eine Datei in der Registry gespeichert, sondern immer nur einen Dateinamen. Meine Antwort sollte darauf hinweisen, dass auch das unter NET nicht erforderlich oder sinnvoll ist.

Wenn das Problem dagegen im "Öffnen" oder "Ausführen" oder "Laden" besteht, dann gilt meine Antwort natürlich nur insoweit, dass damit der Fundort der Datei geklärt ist. Was und wie damit gearbeitet werden soll, ist natürlich eine ganz andere Frage, die aber mit der Registry nach meinem Verständnis nichts zu tun hat.

Jürgen


jaenicke - So 08.03.09 11:13

Es geht um keines der von dir genannten Themen. ;-)

Es geht einfach nur darum, dass die Datei beim Start des Rechners aufgerufen werden soll.
user profile iconTonix hat folgendes geschrieben Zum zitierten Posting springen:
und zwar soll eine Datei die ich durch eine exe erstellt beim Systemstart automatisch Aufgerufen werden.
Deshalb möchte ich sie durch das Programm in die Regitry kopieren und zwar nach HKEY_LOCAL_MACGINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run
Das Kopieren ist zwar der falsche Begriff, aber trotzdem war mir ja klar was gemeint ist, insbesondere bei dem genannten Registryschlüssel.

Wenn das Öffnen durch das Programm selbst geschehen soll, dann wären da sicherlich noch die Anwendungsdaten oder so als Speicherort sinnvoll, aber das ist ja ein Nebenproblem. In den entsprechenden Registryschlüssel eingetragen werden muss so oder so etwas.


jaenicke - So 08.03.09 16:16

Es ist nicht so sinnvoll per PN zu fragen, weil spätere Leser des Threads davon dann nichts haben. ;-)
Außerdem wirst du auch vielleicht schneller eine Antwort bekommen, weil auch andere antworten können.
user profile iconTonix per PN (Ausschnitt) hat folgendes geschrieben:
mit RegistryKey MyKey = Registry.CurrentUser.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Run"); öffne ich den Key soweit ist mir das klar
einen SubKey muss ich doch ansich nicht erstellen, oder, denn ich will ja das die Werte dirket in RUN eingetragen werden.
Als Wert muss ich doch nur den Pfad der Datei eintragen dich beim Start geöffnet werden soll
und das versteh ich leider gar nicht
wie kann ich mit SetValue die Pfad als Wert eintragen??
Auch wegen deinem Nachsatz:
Es gibt bei Microsoft die oben bereits verlinkte Dokumentation, die ziemlich gut sortiert ist. Sehr oft sind auch Beispiele dabei, so auch in diesem Fall:
http://msdn.microsoft.com/en-us/library/2kk9bxk9.aspx

Für dich sieht das dann also so ungefähr aus:

C#-Quelltext
1:
2:
3:
RegistryKey MyKey = Registry.CurrentUser.OpenSubKey(@"Software\Microsoft\Windows\CurrentVersion\Run"true);
if (MyKey != null)
  MyKey.SetValue("Meine coole Autostartdatei"@"c:\test.txt");
An Stelle der Datei musst du natürlich die Datei eintragen, die du meinst. Ggf. kannst du auch deine eigene Exe dort angeben mit dieser Datei als Parameter, je nachdem was du möchtest.


Tonix - So 08.03.09 17:22

Ok soweit isses mir jetzt klar
aber trotz dem Nutzung von CurrentUser sagt mir VisualC# das ich keine Rechte hab obwohl ich Admin bin


jaenicke - So 08.03.09 17:26

Hast du auch das true in der ersten Zeile in OpenSubKey ergänzt wie in dem neuen Quelltext von mir? Sonst wird die Registry nämlich nur zum Lesen geöffnet, das ist mir erst vorhin aufgefallen als ich für den Link nochmal in die Doku geschaut habe. ;-)


Tonix - So 08.03.09 17:33

vielen vielen Dank
bisten Held^^

mfg tonix