WinFuture-Forum.de: C# - Registrywerte Auslesen Und Verarbeiten - WinFuture-Forum.de

Zum Inhalt wechseln

Nachrichten zum Thema: Entwicklung
  • 2 Seiten +
  • 1
  • 2

C# - Registrywerte Auslesen Und Verarbeiten


#1 Mitglied ist offline   Hauner 

  • Gruppe: aktive Mitglieder
  • Beiträge: 2.294
  • Beigetreten: 03. Januar 05
  • Reputation: 0
  • Geschlecht:Männlich

geschrieben 02. Januar 2006 - 18:53

Liebe Community,

als ich neulich am Programmieren saß und stefanra gebeten habe, mein kleines Tool - und speziell diese neuen Funktionen - zu testen, hat er gesagt, dass das Auslesen und Verarbeiten von Registrywerten auf seinem Rechner nicht zu funktionieren scheint, obwohl die benötigten Werte vorhanden sind.

Dabei ist entscheidend, ob Microsoft Office und wenn ja, welches Office (v11 = 2003 oder v10 = XP) installiert ist. Um festzustellen, welche der beiden Versionen installiert ist, muss der Installationspfad von Office aus der Registry ausgelesen werden, der bei der Office-Installation dort angelegt wurde.

Dann findet eine Abfrage darauf statt, ob der ausgelesene Wert existiert. Wenn ja, ist die Überprüfung abgeschlossen und es wird entsprechender Text ausgegeben. Das Gleiche wird mit Dateien vorgenommen, deren Abfrage aber weniger kompliziert ist und nicht zu der hier beschriebenen Fehlerursache beiträgt.

Unserer Vermutung nach wird der Wert erst gar nicht richtig ausgelesen. Auf meinem System funktioniert alles reibungslos (Microsoft Office 2003 und XP installiert), auf stefanras dagegen so gut wie gar nix (Microsoft Office 2003 installiert).

Es wäre nett, wenn einer, der sich in C# auskennt, den im Anhang beigefügten Code mal genauer ansehen und mitteilen könnte, was nun daran falsch ist. Wir sind ihn mehrmals durchgegangen und konnten soweit keine Fehler feststellen. Das Einzige, wo wir uns unsicher waren, ist das Argument "default" beim Auslesen des Werts.

Mit freundlichen Grüßen,
Hauner & stefanra

Angehängte Datei(en)


Dieser Beitrag wurde von Hauner bearbeitet: 29. April 2007 - 12:12

0

Anzeige



#2 Mitglied ist offline   Talla 

  • Gruppe: aktive Mitglieder
  • Beiträge: 224
  • Beigetreten: 24. Februar 04
  • Reputation: 0
  • Wohnort:Esslingen

geschrieben 02. Januar 2006 - 19:13

Also bei mir funktioniert euer Code ohne Probleme.
Das default kann ja net des Problem sein, der Wert wird ja nur zurückgegeben wenn die Schlüssel nicht gefunden werden. Was heißt den bei euch "es funktioniert nicht"? Wird der Default wert zurückgegeben?
Heimat ist nicht immer dort, wo wir zur Welt kamen - Heimat ist wo wir lieben. *Ehm Welk
0

#3 Mitglied ist offline   Hauner 

  • Gruppe: aktive Mitglieder
  • Beiträge: 2.294
  • Beigetreten: 03. Januar 05
  • Reputation: 0
  • Geschlecht:Männlich

geschrieben 02. Januar 2006 - 19:22

Nein, ich glaube stefanra bekam eine Unhandled-Exeception angezeigt, nach einem Klick auf OK erschien aber die GUI. Allerdings stand bei "Microsoft Office 2003 - Installiert" ein "Nein". Eigentlich müsste da ein "Ja" stehen, weil er es ja installiert hat.

Bei mir funktioniert es problemlos, es wird viermal ein "Ja" angezeigt. Bei einem Tester funktionierte es auch (viermal ein "Nein"), und bei einem weiteren funktionierte es ebenso wenig wie bei Stefan.

@Talla: Welche Office-Pakete hast du installiert bzw. was wurde letztlich angezeigt?
0

#4 Mitglied ist offline   frontliner 

  • Gruppe: aktive Mitglieder
  • Beiträge: 235
  • Beigetreten: 28. September 04
  • Reputation: 0
  • Wohnort:Nürnberg

geschrieben 02. Januar 2006 - 19:35

hi, hatte ein ähnliches problem mit vb.net
bei mir lag es an den berechtigungen die registry auszulesen.
unter xp ging es und unter 2003 server gab es probleme
bis ich, testhalbe, leseberechtigungen vergeben habe.
0

#5 Mitglied ist offline   Talla 

  • Gruppe: aktive Mitglieder
  • Beiträge: 224
  • Beigetreten: 24. Februar 04
  • Reputation: 0
  • Wohnort:Esslingen

geschrieben 02. Januar 2006 - 19:40

Also lesen muss natürlich erlaubt sein, sonst ist klar das es ne Exception gibt, aber der genaue Wortlaut der Exception hilft viel weiter. Vielleicht kannst die mal posten. Hab halt nur das Office 2003 zeugs mal rübergepastet und alle ausgaben schnell in ne Messagebox gegeben, da kam halt zweimal ja und dann die Version, weiß net mehr genau welche, ist aber office 2003 sp2 :P
Heimat ist nicht immer dort, wo wir zur Welt kamen - Heimat ist wo wir lieben. *Ehm Welk
0

#6 Mitglied ist offline   Hauner 

  • Gruppe: aktive Mitglieder
  • Beiträge: 2.294
  • Beigetreten: 03. Januar 05
  • Reputation: 0
  • Geschlecht:Männlich

geschrieben 02. Januar 2006 - 19:47

@frontliner & Talla: OK, vielen Dank erstmal. :)
stefanra sagte, die Exception-Meldung beinhalte nichts Entsprechendes, was wichtig sein könnte. Und wie vergebe ich Leserechte? Muss das von meiner Applikation aus geschehen oder muss der Nutzer da manuell an der Systemkonfiguration schrauben?

Andere Programme greifen doch auch auf die Registry zu, oder etwa nicht? Deshalb hat's mich erst ein bisschen verwundert. :P
0

#7 Mitglied ist offline   Talla 

  • Gruppe: aktive Mitglieder
  • Beiträge: 224
  • Beigetreten: 24. Februar 04
  • Reputation: 0
  • Wohnort:Esslingen

geschrieben 02. Januar 2006 - 19:50

Am besten ist immer selber auf Permission prüfen, gibt ja die Möglichkeit in C# das mit Attributen zu machen, oder mit Funktionen aus dem System.Security Namespace. Trotzdem wäre die Exception interessant, am besten abfangen im Code und die gesamte Exception mit Innerexception, CallStack usw. mal posten. Vielleicht liegt der Fehler ja auch woanders.

Mal nen Beispiel zu den Permission:
Nen einfaches beliebiges natives Programm kannst du von nem Netzlaufwerk starten, bei nem .Net Programm wird das aufgrund der Security Permissions fehlschlagen! Setzt du dagegen in deinem .Net Programm die entsprechende Permission gehts, wenn der ausführende User die entsprechenden Rechte hat :P

Dieser Beitrag wurde von Talla bearbeitet: 02. Januar 2006 - 19:53

Heimat ist nicht immer dort, wo wir zur Welt kamen - Heimat ist wo wir lieben. *Ehm Welk
0

#8 Mitglied ist offline   frontliner 

  • Gruppe: aktive Mitglieder
  • Beiträge: 235
  • Beigetreten: 28. September 04
  • Reputation: 0
  • Wohnort:Nürnberg

geschrieben 02. Januar 2006 - 19:54

gute frage ich hab es bei dem einen eintrag manuell gemacht.
mehr kann ich nicht sagen, mir hat es damit gereicht
und mit der registry kenne ich mich auch nicht so gut aus.

ich hab mit regedit die registry geöffnet und bei dem entsprechenden eintrag -> rechte maustaste -> Berechtigungen
0

#9 Mitglied ist offline   Hauner 

  • Gruppe: aktive Mitglieder
  • Beiträge: 2.294
  • Beigetreten: 03. Januar 05
  • Reputation: 0
  • Geschlecht:Männlich

geschrieben 02. Januar 2006 - 19:56

@Talla: Und wie würde das in C#-Code aussehen, eine Permission eines Registrywerts setzen?
0

#10 Mitglied ist offline   Talla 

  • Gruppe: aktive Mitglieder
  • Beiträge: 224
  • Beigetreten: 24. Februar 04
  • Reputation: 0
  • Wohnort:Esslingen

geschrieben 02. Januar 2006 - 20:02

Mal nen Ausschnitt aus der MSDN:

using System;
using System.Security.AccessControl;
using System.Security.Principal;
using System.Security;
using Microsoft.Win32;

public class Example
{
	public static void Main()
	{
		const string TestKey = "TestKey3927";
		RegistryKey cu = Registry.CurrentUser;

		string user = Environment.UserDomainName + 
			"\\" + Environment.UserName;

		// Create a security object that grants no access.
		RegistrySecurity mSec = new RegistrySecurity();

		// Add a rule that grants the current user the right
		// to read and enumerate the name/value pairs in a key, 
		// to read its access and audit rules, to enumerate
		// its subkeys, to create subkeys, and to delete the key. 
		// The rule is inherited by all contained subkeys.
		//
		RegistryAccessRule rule = new RegistryAccessRule(user, 
		   RegistryRights.ReadKey | RegistryRights.WriteKey 
			   | RegistryRights.Delete, 
		   InheritanceFlags.ContainerInherit, 
		   PropagationFlags.None, 
		   AccessControlType.Allow
		);
		mSec.AddAccessRule(rule);

		// Add a rule that allows the current user the right
		// right to set the name/value pairs in a key. 
		// This rule is inherited by contained subkeys, but
		// propagation flags limit it to immediate child 
		// subkeys.
		rule = new RegistryAccessRule(user, 
			RegistryRights.ChangePermissions, 
			InheritanceFlags.ContainerInherit, 
			PropagationFlags.InheritOnly | 
				PropagationFlags.NoPropagateInherit, 
			AccessControlType.Allow);
		mSec.AddAccessRule(rule);

		// Display the rules in the security object.
		ShowSecurity(mSec);

		// Create the test key using the security object.
		//
		RegistryKey rk = cu.CreateSubKey(TestKey, 
			RegistryKeyPermissionCheck.ReadWriteSubTree, mSec);

		// Create a child subkey and a grandchild subkey, 
		// without security.
		RegistryKey rkChild = rk.CreateSubKey("ChildKey", 
			RegistryKeyPermissionCheck.ReadWriteSubTree);
		RegistryKey rkGrandChild = 
			rkChild.CreateSubKey("GrandChildKey", 
				RegistryKeyPermissionCheck.ReadWriteSubTree);

		Show(rk);
		Show(rkChild);
		Show(rkGrandChild);

		rkGrandChild.Close();
		rkChild.Close();
		rk.Close();

		cu.DeleteSubKeyTree(TestKey);
	}

	private static void Show(RegistryKey rk)
	{
		Console.WriteLine(rk.Name);
		ShowSecurity(rk.GetAccessControl());
	}

	private static void ShowSecurity(RegistrySecurity security)
	{
		Console.WriteLine("\r\nCurrent access rules:\r\n");

		foreach( RegistryAccessRule ar in security.GetAccessRules(true, true, typeof(NTAccount)) )
		{

			Console.WriteLine("		User: {0}", ar.IdentityReference);
			Console.WriteLine("		Type: {0}", ar.AccessControlType);
			Console.WriteLine("	  Rights: {0}", ar.RegistryRights);
			Console.WriteLine(" Inheritance: {0}", ar.InheritanceFlags);
			Console.WriteLine(" Propagation: {0}", ar.PropagationFlags);
			Console.WriteLine("   Inherited? {0}", ar.IsInherited);
			Console.WriteLine();
		}

	}
}

/* This code example produces output similar to following:

Current access rules:

		User: TestDomain\TestUser
		Type: Allow
	  Rights: SetValue, CreateSubKey, Delete, ReadKey
 Inheritance: ContainerInherit
 Propagation: None
   Inherited? False

		User: TestDomain\TestUser
		Type: Allow
	  Rights: ChangePermissions
 Inheritance: ContainerInherit
 Propagation: NoPropagateInherit, InheritOnly
   Inherited? False

HKEY_CURRENT_USER\TestKey3927

Current access rules:

		User: TestDomain\TestUser
		Type: Allow
	  Rights: SetValue, CreateSubKey, Delete, ReadKey
 Inheritance: ContainerInherit
 Propagation: None
   Inherited? False

		User: TestDomain\TestUser
		Type: Allow
	  Rights: ChangePermissions
 Inheritance: ContainerInherit
 Propagation: NoPropagateInherit, InheritOnly
   Inherited? False

HKEY_CURRENT_USER\TestKey3927\ChildKey

Current access rules:

		User: TestDomain\TestUser
		Type: Allow
	  Rights: SetValue, CreateSubKey, Delete, ReadKey
 Inheritance: ContainerInherit
 Propagation: None
   Inherited? True

		User: TestDomain\TestUser
		Type: Allow
	  Rights: ChangePermissions
 Inheritance: None
 Propagation: None
   Inherited? True

HKEY_CURRENT_USER\TestKey3927\ChildKey\GrandChildKey

Current access rules:

		User: TestDomain\TestUser
		Type: Allow
	  Rights: SetValue, CreateSubKey, Delete, ReadKey
 Inheritance: ContainerInherit
 Propagation: None
   Inherited? True
 */

Heimat ist nicht immer dort, wo wir zur Welt kamen - Heimat ist wo wir lieben. *Ehm Welk
0

#11 Mitglied ist offline   Hauner 

  • Gruppe: aktive Mitglieder
  • Beiträge: 2.294
  • Beigetreten: 03. Januar 05
  • Reputation: 0
  • Geschlecht:Männlich

geschrieben 02. Januar 2006 - 20:12

Aha, vor dem Code hab ich Respekt. :)
Und welche Teile brauche ich da, um meine Registrywerte auszulesen? :P
0

#12 Mitglied ist offline   Talla 

  • Gruppe: aktive Mitglieder
  • Beiträge: 224
  • Beigetreten: 24. Februar 04
  • Reputation: 0
  • Wohnort:Esslingen

geschrieben 02. Januar 2006 - 20:17

Der ist doch schön kommentiert :P
Geh einfach mal den Code von oben nach unten durch.
Erst wird ein RegistrySecurity Objekt erzeugt, im folgenden Abschnitt werden die Permissions zum Lesen und durchwandern eingefügt, dann folgt nen Abschnitt wo auch Schreibrechte vergeben werden, und dann wird das gane nochmal getestet.
Heimat ist nicht immer dort, wo wir zur Welt kamen - Heimat ist wo wir lieben. *Ehm Welk
0

#13 Mitglied ist offline   Hauner 

  • Gruppe: aktive Mitglieder
  • Beiträge: 2.294
  • Beigetreten: 03. Januar 05
  • Reputation: 0
  • Geschlecht:Männlich

geschrieben 03. Januar 2006 - 18:04

Funktioniert so auch nicht. Ich habe diesen Code vor das Auslesen eines Werts in der Registry gesetzt.
RegistryKey cu = Registry.CurrentUser;
string user = Environment.UserDomainName + "\\" + Environment.UserName;
RegistrySecurity mSec = new RegistrySecurity();
RegistryAccessRule rule = new RegistryAccessRule(user,
RegistryRights.ReadKey | RegistryRights.WriteKey
| RegistryRights.Delete,
InheritanceFlags.ContainerInherit,
PropagationFlags.None,
AccessControlType.Allow
);
mSec.AddAccessRule(rule);
Es funktioniert weder bei stefanra, noch bei tobiasndw. Stefan bekommt folgende Fehlermeldung angezeigt: "Object reference not set to an instance of an object.". Außerdem steht viermal ein "Nein". Bei mir funktioniert alles problemlos.

Wenn ich in den Auslesebefehl Folgendes einfüge (steht im Codebeispiel),
RegistryKeyPermissionCheck.ReadWriteSubTree
streicht er mir das RegistryKeyPermissionCheck als Fehler an.

Was soll ich machen? Weiß einer, was des Problems Lösung sein könnte?
0

#14 Mitglied ist offline   Talla 

  • Gruppe: aktive Mitglieder
  • Beiträge: 224
  • Beigetreten: 24. Februar 04
  • Reputation: 0
  • Wohnort:Esslingen

geschrieben 03. Januar 2006 - 20:56

Er sagt dir doch die Zeile wo die Exception auftritt, welche ist das denn? Habt ihr alle identische Framework Versionen? Der von mir gezeigte Quellcode dürfte nur unter 2.0 laufen :)
Heimat ist nicht immer dort, wo wir zur Welt kamen - Heimat ist wo wir lieben. *Ehm Welk
0

#15 Mitglied ist offline   stefanra 

  • Gruppe: aktive Mitglieder
  • Beiträge: 6.199
  • Beigetreten: 13. September 04
  • Reputation: 1

geschrieben 03. Januar 2006 - 21:18

Leider hat Hauner kein Update mehr hier gepostet. Nachdem ihn Witi unterstützt hat, ist jetzt der Fehler gefunden und besagte Anwendung funktioniert problemlos auch auf meinem System.

Ich denke, ich kann mich in seinem Namen für die Hilfestellung hier im Forum bedanken.
0

Thema verteilen:


  • 2 Seiten +
  • 1
  • 2

1 Besucher lesen dieses Thema
Mitglieder: 0, Gäste: 1, unsichtbare Mitglieder: 0