mayho33
Goto Top

C-Sharp RegistryKey.OpenBaseKey() Redirection

Hallo @ Community,

ich versuche gerade ein Verständnis-Problem im Zusammenhang mit dem Auslesen von RegistryKeys unter HKCU zu lösen und hoffe auf eure Hilfe.

Das Problem:

Mit folgendem Code kann man explizit den auszulesenden Hive und die View der Registry festlegen:

static void Main(string args)
{
    Console.WriteLine("=======      64      ===========" + Environment.NewLine);  
    using (RegistryKey CurrentKey = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64).OpenSubKey(@"Software\Microsoft\Active Setup\Installed Components"))  
    {
        if (CurrentKey != null)
        {
            int i = 1;
            foreach (var subKey in CurrentKey.GetSubKeyNames())
            {
                Console.WriteLine(string.Format("{0}:   {1})", i,CurrentKey.Name + "\\" + subKey));  
                i++;
            }
        }
    }
    Console.WriteLine("=======      32      ===========" + Environment.NewLine);  
    using (RegistryKey CurrentKey = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry32).OpenSubKey(@"Software\Microsoft\Active Setup\Installed Components"))  
    {
        if (CurrentKey != null)
        {
            int i = 1;
            foreach (var subKey in CurrentKey.GetSubKeyNames())
            {
                Console.WriteLine(string.Format("{0}:   {1})", i, CurrentKey.Name + "\\" + subKey));  
                i++;
            }
        }
    }
}

Das funktionert einwandfrei bei z.B. HKLM, interessanterweise aber nicht bei HKCU (??). Ein Beispiel:

Unter "HKEY_CURRENT_USER\Software\Microsoft\Active Setup\Installed Components" gibt es einen fiktiven RegistryKey "__FAKE_FAKE_FAKE", nicht aber unter "HKEY_CURRENT_USER\WOW6432Node\Software\Microsoft\Active Setup\Installed Components"

Wendet man den obigen Code auf den CurrentUser-Hive an, so wird in beiden Ausgaben der FakeKey angezeigt. Offensichtlich springt hier die Redirection ein. Durch die explizite Angabe der RegistryView, sollte die Redirection aber deaktiviert sein (zumindest beschreibt MS das so)

siehe:
frage


Meine Fragen dazu:

  • Warum redirected MS unter HKCU obwohl dies explizit mittels Code deaktiviert ist?
  • Wie kann ich erzwingen, dass tatsächlich keine Redirection unter HKCU durchgeführt wird?

Vielen Dank für eure Unterstützung!

Beste Grüße Mayho

Content-Key: 375650

Url: https://administrator.de/contentid/375650

Ausgedruckt am: 29.03.2024 um 14:03 Uhr

Mitglied: Pedant
Lösung Pedant 01.06.2018 um 10:38:40 Uhr
Goto Top
Hallo Mayho,

Hive und View habe ich noch nicht benutzt.
Deinen Code kann ich auch nicht 1:1 compilieren.
(Der Compiler jammert an ein paar Stellen.)

Dein Problem habe ich entweder nicht verstanden oder kann es nicht nachvollziehen.
Mir wird ausschließlich der Zweiginhalt angezeigt, den ich ausgewählt habe, wenn ich "meinen" Code ausführe.
Zuerst kommt nur der Inhalt von
"Software\Microsoft\Active Setup\Installed Components"
und danch nur der Inhalt von
"Software\Wow6432Node\Microsoft\Active Setup\Installed Components".

using System;
using Microsoft.Win32;

namespace RegAusgabe
{
class Program
	{
	static void Main(string args)
		{
		Console.WriteLine("=======	  64	  ===========" + Environment.NewLine);  
		RegistryKey CurrentKey1 = Registry.CurrentUser.OpenSubKey("Software\\Microsoft\\Active Setup\\Installed Components", false);  
		if (CurrentKey1 != null)
			{
			int i = 1;
			foreach (var subKey in CurrentKey1.GetSubKeyNames())
				{
				Console.WriteLine(string.Format("{0}:   {1})", i,CurrentKey1.Name + "\\" + subKey));  
				i++;
				};
			};
		Console.WriteLine("");  
		Console.WriteLine("=======	  32	  ===========" + Environment.NewLine);  
		RegistryKey CurrentKey2 = Registry.CurrentUser.OpenSubKey("Software\\Wow6432Node\\Microsoft\\Active Setup\\Installed Components", false);  
		if (CurrentKey2 != null)
			{
			int i = 1;
			foreach (var subKey in CurrentKey2.GetSubKeyNames())
				{
				Console.WriteLine(string.Format("{0}:   {1})", i,CurrentKey2.Name + "\\" + subKey));  
				i++;
				};
			};
		}
	}
}

Gruß Frank
Mitglied: 136166
136166 02.06.2018 aktualisiert um 17:43:20 Uhr
Goto Top
Ganz einfach, für den Software-Key in HKCU findet im Gegensatz zu HKLM kein Redirection statt, diese sind Shared und die einzelnen Keys müssen einzeln angesprochen werden (Wie Pedant es macht). Siehe:
Registry Keys Affected by WOW64
HKEY_CURRENT_USER	Shared	Shared
    SOFTWARE	Shared	Shared
Mitglied: mayho33
mayho33 06.06.2018 aktualisiert um 16:30:29 Uhr
Goto Top
Hi Pedant,

welches Zielframework verwendest du? Bin nicht sicher, aber um Hive und View verwenden zu können, muss du mindestend Dot.Net 3.5 verwenden.

Ist aber egal! Deine Variante macht was ich will! Danke! face-smile

@136166
Ganz einfach, für den Software-Key in HKCU findet im Gegensatz zu HKLM kein Redirection statt,

Ist es nicht umgekehrt? Im HKCU findet eine Redirection statt und im HKLM nicht. Zumindest ist das so in meinem Beispiel. Die Frage warum MS das eben genau so macht bleibt zwar offen, aber Pedants Beispiel funktioniert. Das ist für mich mal das Wichtigste.


Danke jedenfalls für eure Unterstützung! Jetzt geht's an Automatismen umschreiben face-sad

Grüße Mayho
Mitglied: Pedant
Pedant 06.06.2018 um 16:51:49 Uhr
Goto Top
Hallo Mayho,

Zitat von @mayho33:
welches Zielframework verwendest du?
Im Projekt war eingestellt als
Zielframework: .NET Framework 3.5

Die Umgebung ist:
Microsoft Visual Studio Community 2015 - Version 14.0.24720.00 Update 1
Microsoft .Net Framework - Version 4.7.030.56

Gruß Frank
Mitglied: 136166
136166 06.06.2018 aktualisiert um 17:43:44 Uhr
Goto Top
Zitat von @mayho33:
@136166
Ganz einfach, für den Software-Key in HKCU findet im Gegensatz zu HKLM kein Redirection statt,

Ist es nicht umgekehrt? Im HKCU findet eine Redirection statt und im HKLM nicht.
Nein, les den Link da steht's unmissverständlich!
Mitglied: mayho33
mayho33 19.10.2018 aktualisiert um 09:50:49 Uhr
Goto Top
Hi @ All

Der Thread ist zwar schon seit einiger Zeit geschlossen. Mir geht MS' Inkonsistenz aber sowas von auf die Nerven, dass ich den Post von @136166 trotzdem nochmal kommentieren möchte.

@136166
Nein, les den Link da steht's unmissverständlich!
Registry Keys Affected by WOW64

Ja! Da steht es ganz eindeutig. Hier aber steht es auch ganz eindeutig Was also stimmt nun?:

https://docs.microsoft.com/en-us/dotnet/api/microsoft.win32.registryview ...


MS nervt einfach! Die widersprechen tlw. um 180°

Grüße!

Mayho