Benutzer mit den meisten Antworten
Win 2008 64-Bit Server, Registry-Auslesen Probleme

Frage
-
Hallo Forum,
ich hatte auf einem Win 2003 Server 32-Bit ein Stück Code, der die Anzahl der Sql-Instanzen überprüft.
Das funktionierte einwandfrei, alerdings auf einem Win 2008 64-Bit Server klappt es nicht mehr.
Der Code:
public static void CheckRegistryIfAnotherSQLInstanceExists()//bereits eine SQL-Instanz vorhanden? { try { RegistryKey rk = Registry.LocalMachine.OpenSubKey("HKEY_LOCAL_MASCHINE\\SOFTWARE\\Microsoft\\Microsoft SQL Server"); string[] instanzNames = (string[])rk.GetValue("InstalledInstances"); if (instanzNames.Length > 0) { Console.WriteLine("ok"); } rk.Close(); } catch (Exception e) { string response = e.Message; Console.WriteLine(response); } }
Den gesuchten Registry-Key gibt es auf dem Server.
Danke für Eure Hilfe
- Bearbeitet Purclot Donnerstag, 22. September 2011 14:53
Antworten
-
Hallo,
Bin mir nicht ganz sicher, was Du mit "angeblich das Objekt 'rs' ist null" meinst (vielleicht meinst Du "rk")?
Versuch doch mal folgendes (ab .NET 4.0):var hklm = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64); var rk = hklm.OpenSubKey("SOFTWARE\\Microsoft\\Microsoft SQL Server");
Welche Frameworkversion (3.5/4.0, 32/64bit)?
Hast Du eine 32bit-Installation auf einem 64bit-Server?
Kompilierst Du für "Any CPU". Dann würdest Du auf 32bit-Systemen auf die 32bit-Registry bzw. auf 64bit-Systemen auf die 64bit-Registry (also nicht über Wow6432Node) zugreifen?Nicht zu empfehlen, aber als letzten Rettungsring: Wenn Du kein .NET 4.0 laufen hast, könntest Du evtl. "Wow6432Node" beim Zugriff auf die Registry im Code verdrahten, um von einem 64bit-System auf die 32bit Registry zuzugreifen (umgekehrt nicht möglich). Weitere Möglichkeiten über P/Invoke (RegOpenKeyEx).
s.a. Enumerating local 64 bit and 32 bit instances of SQL Server:
http://www.simple-talk.com/community/blogs/james/archive/2006/11/02/3948.aspxs.a. Dateispeicherorte für Standard- und benannte Instanzen von SQL Server:
http://msdn.microsoft.com/de-de/library/ms143547.aspxVielleicht einfacher (unter Ausschluss nichtlokaler Server): Aufzählen von SQL Server-Instanzen (ADO.NET):
http://msdn.microsoft.com/de-de/library/a6t1z9x2.aspxGruß
Marcel- Als Antwort markiert Purclot Freitag, 23. September 2011 10:22
-
Hallo P.,
In Windows Server 2008 ist im 32-bit-Hive der RegistryKey: HKLM\Software\Wow6432Node vom RegEnumKeyEx
versteckt. Das verhindert einen Rekursions-Bug:[32-bit and 64-bit Application Data in the Registry]
http://msdn.microsoft.com/en-us/library/windows/desktop/ms724072.aspx
http://msdn.microsoft.com/en-us/library/ms724072.aspxInsofern eh besser über .NET Klassen machen - also etwa:
[c# - Check if SQL server (any version) is installed? - Stack Overflow]
http://stackoverflow.com/questions/2381055/check-if-sql-server-any-version-is-installed[FAQ: Detecting SQL Server 2005 using WMI - SQL Server Express WebLog - Site Home - MSDN Blogs]
http://blogs.msdn.com/b/sqlexpress/archive/2006/07/29/682254.aspx[HOW TO DETECT SQL SERVER INSTANCES / FEATURES INSTALLED ON A MACHINE - Microsoft SQL Server Tips & Tricks - Site Home - MSDN Blogs]
http://blogs.msdn.com/b/sqlserverfaq/archive/2009/03/07/how-to-detect-sql-server-instances-features-installed-on-a-machine.aspx[Aufzählen von SQL Server-Instanzen (ADO.NET)]
http://msdn.microsoft.com/de-de/library/a6t1z9x2.aspx
ciao Frank- Als Antwort markiert Purclot Freitag, 23. September 2011 10:22
Alle Antworten
-
Hallo,
Bin mir nicht ganz sicher, was Du mit "angeblich das Objekt 'rs' ist null" meinst (vielleicht meinst Du "rk")?
Versuch doch mal folgendes (ab .NET 4.0):var hklm = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64); var rk = hklm.OpenSubKey("SOFTWARE\\Microsoft\\Microsoft SQL Server");
Welche Frameworkversion (3.5/4.0, 32/64bit)?
Hast Du eine 32bit-Installation auf einem 64bit-Server?
Kompilierst Du für "Any CPU". Dann würdest Du auf 32bit-Systemen auf die 32bit-Registry bzw. auf 64bit-Systemen auf die 64bit-Registry (also nicht über Wow6432Node) zugreifen?Nicht zu empfehlen, aber als letzten Rettungsring: Wenn Du kein .NET 4.0 laufen hast, könntest Du evtl. "Wow6432Node" beim Zugriff auf die Registry im Code verdrahten, um von einem 64bit-System auf die 32bit Registry zuzugreifen (umgekehrt nicht möglich). Weitere Möglichkeiten über P/Invoke (RegOpenKeyEx).
s.a. Enumerating local 64 bit and 32 bit instances of SQL Server:
http://www.simple-talk.com/community/blogs/james/archive/2006/11/02/3948.aspxs.a. Dateispeicherorte für Standard- und benannte Instanzen von SQL Server:
http://msdn.microsoft.com/de-de/library/ms143547.aspxVielleicht einfacher (unter Ausschluss nichtlokaler Server): Aufzählen von SQL Server-Instanzen (ADO.NET):
http://msdn.microsoft.com/de-de/library/a6t1z9x2.aspxGruß
Marcel- Als Antwort markiert Purclot Freitag, 23. September 2011 10:22
-
Hallo P.,
In Windows Server 2008 ist im 32-bit-Hive der RegistryKey: HKLM\Software\Wow6432Node vom RegEnumKeyEx
versteckt. Das verhindert einen Rekursions-Bug:[32-bit and 64-bit Application Data in the Registry]
http://msdn.microsoft.com/en-us/library/windows/desktop/ms724072.aspx
http://msdn.microsoft.com/en-us/library/ms724072.aspxInsofern eh besser über .NET Klassen machen - also etwa:
[c# - Check if SQL server (any version) is installed? - Stack Overflow]
http://stackoverflow.com/questions/2381055/check-if-sql-server-any-version-is-installed[FAQ: Detecting SQL Server 2005 using WMI - SQL Server Express WebLog - Site Home - MSDN Blogs]
http://blogs.msdn.com/b/sqlexpress/archive/2006/07/29/682254.aspx[HOW TO DETECT SQL SERVER INSTANCES / FEATURES INSTALLED ON A MACHINE - Microsoft SQL Server Tips & Tricks - Site Home - MSDN Blogs]
http://blogs.msdn.com/b/sqlserverfaq/archive/2009/03/07/how-to-detect-sql-server-instances-features-installed-on-a-machine.aspx[Aufzählen von SQL Server-Instanzen (ADO.NET)]
http://msdn.microsoft.com/de-de/library/a6t1z9x2.aspx
ciao Frank- Als Antwort markiert Purclot Freitag, 23. September 2011 10:22
-
Hallo Marcel, hallo Frank,
vielen Dank für Eure Hilfe. Hmm, der Weg über die Registry ist ziemlich mühselig, ich nehme also die .NET-Lösung.
Was verwirrt ist der Fakt, dass es auf dem Win 2008 64-Bit Server durchaus den Registry-Key HKLM\Software\Microsoft\Microsoft SQL Server\InstalledInstances gibt (also nicht im WoW64-Node), nur abfragen kann man ihn nicht..
Wie auch immer, vielen Dank.
P.