Guten Tag liebe Forenteilnehmer,
ich hoffe Ihr könnt mir helfen, da ich hier komplett auf dem Schlauch stehe!
Ich würde gerne mit C# eine zuvor gesichterte ntuser.dat - nach den installierten Druckern und später auch den Netzlaufwerken auslesen wollen.
Meine äußerst limitierten Fähigkeiten haben mich bislang das hier runterschreiben/runterkopieren lassen:
using System;
using System.IO;
using System.Windows.Forms;
using Microsoft.Win32;
namespace Registry_Auslesentest
{
public partial class Form1 : Form
{
private const string TempHiveName = "TempHive";
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
}
private void exportButton_Click(object sender, EventArgs e)
{
using (OpenFileDialog openFileDialog = new OpenFileDialog())
{
openFileDialog.Filter = "NTUSER.DAT files|NTUSER.DAT";
openFileDialog.Title = "Select the NTUSER.DAT file";
if (openFileDialog.ShowDialog() == DialogResult.OK)
{
string ntUserDatPath = openFileDialog.FileName;
try
{
// Load the hive
if (RegLoadKey(RegistryHive.Users, TempHiveName, ntUserDatPath) != 0)
{
textBox1.Text = "Failed to load the hive.";
return;
}
// Read a value from the loaded hive
using (RegistryKey key = Registry.Users.OpenSubKey(TempHiveName))
{
if (key != null)
{
string valueName = "SomeRegistryKey";
object value = key.GetValue(valueName);
if (value != null)
{
textBox1.Text = value.ToString();
}
else
{
textBox1.Text = $"Key '{valueName}' not found.";
}
}
else
{
textBox1.Text = "Failed to open the hive.";
}
}
// Unload the hive
if (RegUnLoadKey(RegistryHive.Users, TempHiveName) != 0)
{
textBox1.Text = "Failed to unload the hive.";
}
}
catch (Exception ex)
{
textBox1.Text = $"Error: {ex.Message}";
}
}
}
}
// PInvoke to load and unload registry hives
[System.Runtime.InteropServices.DllImport("advapi32.dll", SetLastError = true)]
public static extern int RegLoadKey(RegistryHive hKey, string lpSubKey, string lpFile);
[System.Runtime.InteropServices.DllImport("advapi32.dll", SetLastError = true)]
public static extern int RegUnLoadKey(RegistryHive hKey, string lpSubKey);
}
}
Hier bekomme ich immer "Failed to load the hive."
Natürlich habe ich auf die ntuser.dat Zugriff und es ist auch meine eigene, daher sollte es vermutlich keine Rechtethema sein.
Wenn mir jemand hier behilflich sein könnte, wäre ich sehr dankbar!
LG
Sascha
Dann scheint dieser Part
if (RegLoadKey(RegistryHive.Users, TempHiveName, ntUserDatPath) != 0)
{
textBox1.Text = "Failed to load the hive.";
nicht das zu liefern, was Du erwartest.
Verwende den Debugger, um zu sehen, was Du denkst was Du lädst - und was Du tatsächlich lädst.
Schaue ich mir Samples von Goole Suche nach win32 regloadkey ntuser.dat an, sehe ich auch andere Vorgehen und Keys.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
Hi,
danke für die Rückmeldung. Mit dem Debugger werde ich mich tiefer auseinandersetzen. Einige andere Beispiele habe ich auch ausprobiert und hatte keinen Erfolg. Hatte darauf gehofft, dass hier bereits irgendjemand einen funktionierenden Code-Snipsel rumfliegen hat.
Lass dir mal den Fehlercode ausgeben (anstatt nur auf != 0
) zu testen, s.a. unter "Rückgabewert" bei RegLoadKeyA.
Evtl. liegt es an fehlenden Berechtigungen (s. unter "Hinweise"), d.h. du mußt das Programm als Admin starten.
Hi,
habe das nun mal implementiert und die Meldung lautet nun:
Failed to load the hive. Error code: 0. D
Irgendwelche Ideen?
"Error code: 0" kann doch gar nicht sein, wenn du auf != 0
testest.
Wie sieht denn dein Code dafür aus?