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

Printed on: April 23, 2024 at 23:04 o'clock

Member: Pedant
Solution Pedant Jun 01, 2018 at 08:38:40 (UTC)
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 Jun 02, 2018 updated at 15:43:20 (UTC)
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
Member: mayho33
mayho33 Jun 06, 2018 updated at 14:30:29 (UTC)
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
Member: Pedant
Pedant Jun 06, 2018 at 14:51:49 (UTC)
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 Jun 06, 2018 updated at 15:43:44 (UTC)
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!
Member: mayho33
mayho33 Oct 19, 2018 updated at 07:50:49 (UTC)
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