it-swarm.com.de

Wie lässt sich kinderleicht feststellen, welche .NET-Version (en) auf einem produktiven Windows Server installiert sind?

Diese Frage hängt weniger mit der Programmierung als vielmehr mit der Bereitstellung zusammen.

Ich unterhalte mich viel mit der Gruppe in meinem Unternehmen, deren Aufgabe es ist, die Windows-Produktionsserver zu warten und unseren Code darauf bereitzustellen. Aus rechtlichen und Compliance-Gründen habe ich keine direkte Sichtbarkeit oder Kontrolle über die Server. Daher kann ich anhand der Anweisungen, die ich dieser Gruppe gebe, nur feststellen, welche .NET-Version (en) auf einer dieser Versionen installiert ist (sind).

Bisher habe ich mir alle Methoden ausgedacht, um festzustellen, welche Version (en) installiert sind (prüfen Sie, ob die Verwaltungsprogramme 1.1 oder 2.0 entsprechen, prüfen Sie, ob Einträge in der Liste "Software" vorhanden sind, und prüfen Sie, ob die vorhanden sind Verzeichnisse unter c:\Windows\Microsoft.NET) sind fehlerhaft (ich habe mindestens einen Computer mit 2.0, aber keinen 2.0-Einträgen unter Verwaltung gesehen - und diese Methode sagt Ihnen nichts über 3.0+, die Liste "Programme hinzufügen/entfernen" nicht mit der Realität synchronisiert werden kann und die Existenz der Verzeichnisse nicht unbedingt etwas bedeutet).

Da ich im Allgemeinen wissen muss, dass diese Dinge im Voraus vorhanden sind (und feststellen muss, dass "Hoppla, hier sind nicht alle benötigten Versionen und Service Packs enthalten", was bei kurzen Wartungsfenstern nicht wirklich gut funktioniert) Führen Sie die Überprüfung "per Proxy" durch, da ich nicht direkt auf die Server zugreifen kann. Wie lässt sich auf kinderleichte Weise feststellen, welche .NET-Version (en) auf einem produktiven Windows Server installiert sind? Verwenden Sie dazu vorzugsweise die vom Framework installierte Methode, da diese schneller ausgeführt werden kann und kein Hilfsprogramm zum Laden erforderlich ist. Eine Methode, die definitiv fehlschlägt, wenn die Frameworks nicht ordnungsgemäß installiert sind, aber noch Dateien vorhanden sind (d. H , es gibt ein Verzeichnis und gacutil.exe ist dort eingetragen, aber diese Version des Frameworks ist nicht wirklich "installiert")

EDIT: Kennt jemand ein gutes, leichtgewichtiges, nicht installierbares Programm, das dies herausfinden kann, da es keine gute idiotensichere Methode gibt, dies in das Framework (die Frameworks) zu integrieren? Ich kann mir vorstellen, dass jemand leicht einen schreiben könnte, aber wenn einer bereits existiert, wäre das noch besser.

99
Tom Kidd

Sie sollten IE auf dem Server, für den Sie diese Informationen suchen, öffnen und zu dieser Site gehen: http://www.hanselman.com/smallestdotnet/ =

Das ist alles was es braucht.

Die Site verfügt über ein Skript, das den "UserAgent" Ihres Browsers anzeigt und herausfindet, welche Version von .NET Framework (falls vorhanden) Sie installiert haben (oder nicht). Es wird automatisch angezeigt (und anschließend die Gesamtgröße berechnet, falls Sie dies ausgewählt haben) um das .NET Framework herunterzuladen).

54
Vaibhav

Sie können die Registrierung und einige andere Dinge programmgesteuert wie folgt überprüfen Blogeintrag .

Der zu betrachtende Registrierungsschlüssel lautet

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP\...]
24
Ed Guiness

Gefundene Antwort von hier :

Überprüfen Sie, welche .NET Framework-Version installiert ist

Öffnen Sie die Eingabeaufforderung und fügen Sie eine der folgenden Befehlszeilen ein

dir %WINDIR%\Microsoft.Net\Framework\v*

oder

dir %WINDIR%\Microsoft.Net\Framework\v* /O:-N /B
19
K.Dias

Der Microsoft-Weg ist folgender:

MSDN: So ermitteln Sie, welche .NET Framework-Versionen installiert sind (wodurch Sie zum folgenden Registrierungsschlüssel geleitet werden: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP\...)

Wenn Sie narrensicher sein wollen, ist das eine andere Sache. Ich würde mir keine Sorgen um eine Kopie des Framework-Ordners machen. Wenn jemand das tun würde, würde ich den Computer für kaputt halten.

Am einfachsten ist es, ein kleines Programm zu schreiben, das jede .NET-Version und die von Ihnen gewünschten Bibliotheken verwendet und ausführt.

Für eine No-Install-Methode ist PowerBasic ein ausgezeichnetes Werkzeug. Es entstehen kleine, keine Laufzeit benötigte Exes. Es könnte die im obigen MS KB-Artikel beschriebenen Überprüfungen automatisieren.

15
bruceatk

Gemäß Antwort von CodeTrawler besteht die Lösung darin, Folgendes in ein Explorer-Fenster einzugeben:

% systemroot%\Microsoft.NET\Framework

Dann suchen Sie nach:

Mscorlib.dll

... und klicken Sie mit der rechten Maustaste auf die Registerkarte "Version" für jedes Ergebnis.

15
Jon Cage

http://www.asoft.be/prod_netver.html

Verwenden Sie dieses "gute, leichtgewichtige Programm, für das keine Installation erforderlich ist"

7
thin

Die offizielle Antwort von Microsoft dazu finden Sie in KB-Artikel 318785 .

3
Code Trawler

Wenn auf dem zu überprüfenden Computer das .NET SDK installiert ist, können Sie eine SDK-Eingabeaufforderung verwenden und das Programm CLRVer.exe Ausführen.

3
Jim Deville

Um die installierte Dotnet-Version zu erhalten,
Erstellen Sie eine Konsolen-App. Füge diese Klasse hinzu Führe das aus

using Microsoft.Win32;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication2
{
    public class GetDotNetVersion
    {
        public static void Get45PlusFromRegistry()
        {
            const string subkey = @"SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full\";
            using (RegistryKey ndpKey = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry32).OpenSubKey(subkey))
            {
                if (ndpKey != null && ndpKey.GetValue("Release") != null)
                {
                    Console.WriteLine(".NET Framework Version: " + CheckFor45PlusVersion((int)ndpKey.GetValue("Release")));
                }
                else
                {
                    Console.WriteLine(".NET Framework Version 4.5 or later is not detected.");
                }
            }
        }

        // Checking the version using >= will enable forward compatibility.
        private static string CheckFor45PlusVersion(int releaseKey)
        {
            if (releaseKey >= 394802)
                return "4.6.2 or later";
            if (releaseKey >= 394254)
            {
                return "4.6.1";
            }
            if (releaseKey >= 393295)
            {
                return "4.6";
            }
            if ((releaseKey >= 379893))
            {
                return "4.5.2";
            }
            if ((releaseKey >= 378675))
            {
                return "4.5.1";
            }
            if ((releaseKey >= 378389))
            {
                return "4.5";
            }
            // This code should never execute. A non-null release key shoul
            // that 4.5 or later is installed.
            return "No 4.5 or later version detected";
        }
    }
    // Calling the GetDotNetVersion.Get45PlusFromRegistry method produces 
    // output like the following:
    //       .NET Framework Version: 4.6.1
}
1

Die OneTouch-Bereitstellung übernimmt die vollständige Erkennung und Installation der erforderlichen Komponenten. Es ist wahrscheinlich am besten, eine vorgefertigte Lösung zu wählen, als zu versuchen, eine eigene zu erstellen. Der Versuch, eine eigene Version zu erstellen, kann zu Problemen führen, da sich mit einem Hotfix oder Service Pack alles, was Sie eingeben, ändern kann. Wahrscheinlich verfügt Microsoft über eine Heuristik, mit der ermittelt werden kann, welche Version ausgeführt wird.

1
Orion Adrian

Lesen Sie auch die Frage zum Stapelüberlauf Wie kann festgestellt werden, welche .NET Framework-Versionen und Service Packs installiert sind?, in der auch Folgendes erwähnt wird:

Eine offizielle Antwort von Microsoft auf diese Frage finden Sie im Knowledge Base-Artikel [So ermitteln Sie, welche Versionen und Service Pack-Versionen von Microsoft .NET Framework installiert sind] [2]

Artikel-ID: 318785 Geändert am: Montag, 7. November 2008 Version: 20.1 Ermitteln, welche Versionen von .NET Framework installiert sind und ob Service Packs angewendet wurden.

Leider scheint es nicht zu funktionieren, da die mscorlib.dll Version im 2.0-Verzeichnis hat eine 2.0-Version, und es gibt kein mscorlib.dll Version in den Verzeichnissen 3.0 oder 3.5, obwohl 3.5 SP1 installiert ist ... Warum sollte die offizielle Microsoft-Antwort so falsch sein?

1
anon

So ermitteln Sie die Unterstützung Ihres Servers für . NET Framework 4.5 und höher Versionen (getestet bis 4.5.2): Wenn Sie keinen Registrierungszugriff auf den Server haben, aber über eine App verfügen Veröffentlichen Sie Rechte für diesen Server, erstellen Sie eine MVC 5-App mit einem einfachen Controller wie folgt:

using System.Web.Mvc;

namespace DotnetVersionTest.Controllers
{
    public class DefaultController : Controller
    {
        public string Index()
        {
            return "simple .NET version test...";
        }
    }
}

Gehen Sie dann in Ihrer Web.config die gewünschten .NET Framework-Versionen im folgenden Abschnitt durch und ändern Sie die targetFramework -Werte wie gewünscht:

<system.web>
    <customErrors mode="Off"/>
    <compilation debug="true" targetFramework="4.5.2"/>
    <httpRuntime targetFramework="4.5.2"/>
</system.web>

Veröffentlichen Sie jedes Ziel auf Ihrem Server und navigieren Sie zu <app deploy URL>/Default. Wenn Ihr Server das Zielframework unterstützt, wird die einfache Zeichenfolge von Ihrem einfachen Controller angezeigt. Wenn nicht, erhalten Sie eine Fehlermeldung wie die folgende:

Example of unsupported .NET 4.5.2 on server

In diesem Fall unterstützt mein Zielserver .NET Framework 4.5.2 noch nicht.

1
dave_k_smith

Die offizielle Methode zur Erkennung von .NET 3.0 wird hier beschrieben

http://msdn.Microsoft.com/en-us/library/aa480198.aspx

Fehlerhaft, da der Aufrufer Registrierungszugriffsberechtigungen haben muss.

MSDN erwähnt auch eine Technik zum Erkennen von .NET 3.5 durch Überprüfen der Benutzeragentenzeichenfolge:

http://msdn.Microsoft.com/en-us/library/bb909885.aspx

Ich denke, Microsoft hätte einen besseren Job machen sollen.

1
Joe

Ich bin zu Windows Update gegangen und habe mir den Update-Verlauf angesehen, da ich wusste, dass die Server-Patches auf dem neuesten Stand sind. Ich habe nach .NET-Updates gesucht und festgestellt, in welchen Versionen Updates vorhanden waren, sodass ich feststellen konnte, welche Versionen installiert waren.

0
Kim K.

Nun, wie Dean sagte, können Sie sich die Registrierung ansehen und das tun, was er getan hat. Um zu überprüfen, ob CLR .NET Framework wirklich installiert ist, sollten Sie nach dem MSCorEE.dll Datei in der %SystemRoot%\System32 Verzeichnis.

0
Bruno Costa

Ich fand das ziemlich nützlich. Hier ist das Quelle

enter image description here

0
Michael Bahig

Wenn Sie Versionen vor .NET 4.5 suchen möchten, verwenden Sie Code für eine Konsolenanwendung. So was:

using System;
using System.Security.Permissions;
using Microsoft.Win32;

namespace findNetVersion
{
    class Program
    {
        static void Main(string[] args)
        {
            using (RegistryKey ndpKey = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine,
                     RegistryView.Registry32).OpenSubKey(@"SOFTWARE\Microsoft\NET Framework Setup\NDP\"))
            {
                foreach (string versionKeyName in ndpKey.GetSubKeyNames())
                {
                    if (versionKeyName.StartsWith("v"))
                    {

                        RegistryKey versionKey = ndpKey.OpenSubKey(versionKeyName);
                        string name = (string)versionKey.GetValue("Version", "");
                        string sp = versionKey.GetValue("SP", "").ToString();
                        string install = versionKey.GetValue("Install", "").ToString();
                        if (install == "") //no install info, must be later version
                            Console.WriteLine(versionKeyName + "  " + name);
                        else
                        {
                            if (sp != "" && install == "1")
                            {
                                Console.WriteLine(versionKeyName + "  " + name + "  SP" + sp);
                            }
                        }
                        if (name != "")
                        {
                            continue;
                        }
                        foreach (string subKeyName in versionKey.GetSubKeyNames())
                        {
                            RegistryKey subKey = versionKey.OpenSubKey(subKeyName);
                            name = (string)subKey.GetValue("Version", "");
                            if (name != "")
                                sp = subKey.GetValue("SP", "").ToString();
                                install = subKey.GetValue("Install", "").ToString();
                            if (install == "") //no install info, ust be later
                                Console.WriteLine(versionKeyName + "  " + name);
                            else
                            {
                                if (sp != "" && install == "1")
                                {
                                    Console.WriteLine("  " + subKeyName + "  " + name + "  SP" + sp);
                                }
                                else if (install == "1")
                                {
                                    Console.WriteLine("  " + subKeyName + "  " + name);
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}

Andernfalls finden Sie .NET 4.5 oder höher, indem Sie Folgendes abfragen:

private static void Get45or451FromRegistry()
{
    using (RegistryKey ndpKey = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine,
       RegistryView.Registry32).OpenSubKey(@"SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full\"))
    {
        int releaseKey = (int)ndpKey.GetValue("Release");
        {
            if (releaseKey == 378389)

                Console.WriteLine("The .NET Framework version 4.5 is installed");

            if (releaseKey == 378758)

                Console.WriteLine("The .NET Framework version 4.5.1  is installed");

        }
    }
}

Das Konsolenergebnis zeigt Ihnen dann, welche Versionen installiert und für die Verwendung mit Ihren Bereitstellungen verfügbar sind. Dieser Code ist auch nützlich, da Sie sie als gespeicherte Lösungen haben, wenn Sie sie in Zukunft überprüfen möchten.

0
Ronnie Petty

Es ist wahrscheinlich eine fiese Art, Versionen herauszufinden, aber ich hatte immer den Eindruck, dass alle Versionen auf <root>:\WINDOWS\Microsoft.NET\Framework Installiert wurden.

Dadurch werden Ordner mit Namen wie v2.0.50727 Versehen, die meines Erachtens detaillierte Versionsinformationen enthalten.

0
Dean

Seltsamerweise habe ich etwas Code geschrieben, um dies zu tun, als 1.1 herauskam (was war das vor sieben Jahren?) Und es ein wenig optimiert, als 2.0 herauskam. Ich habe es mir seit Jahren nicht mehr angesehen, da wir unsere Server nicht mehr verwalten.

Es ist nicht narrensicher, aber ich poste es trotzdem, weil ich es humorvoll finde. Dies ist in .NET einfacher und in Power Shell noch einfacher.

bool GetFileVersion(LPCTSTR filename,Word *majorPart,Word *minorPart,Word *buildPart,Word *privatePart)
{
    DWORD dwHandle;
    DWORD dwLen = GetFileVersionInfoSize(filename,&dwHandle);
    if (dwLen) {
        LPBYTE lpData = new BYTE[dwLen];
        if (lpData) {
            if (GetFileVersionInfo(filename,0,dwLen,lpData)) {
                UINT uLen;  
                VS_FIXEDFILEINFO *lpBuffer;  
                VerQueryValue(lpData,_T("\\"),(LPVOID*)&lpBuffer,&uLen);  
                *majorPart = HIWORD(lpBuffer->dwFileVersionMS);
                *minorPart = LOWORD(lpBuffer->dwFileVersionMS);
                *buildPart = HIWORD(lpBuffer->dwFileVersionLS);
                *privatePart = LOWORD(lpBuffer->dwFileVersionLS);
                delete[] lpData;
                return true;
            }
        }
    }
    return false;
}

int _tmain(int argc,_TCHAR* argv[])
{
    _TCHAR filename[MAX_PATH];
    _TCHAR frameworkroot[MAX_PATH];
    if (!GetEnvironmentVariable(_T("systemroot"),frameworkroot,MAX_PATH))
        return 1;
    _tcscat_s(frameworkroot,_T("\\Microsoft.NET\\Framework\\*"));
    WIN32_FIND_DATA FindFileData;
    HANDLE hFind = FindFirstFile(frameworkroot,&FindFileData);
    if (hFind == INVALID_HANDLE_VALUE)
        return 2;
    do {
        if ((FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) &&
            _tcslen(FindFileData.cAlternateFileName) != 0) {
            _tcsncpy_s(filename,frameworkroot,_tcslen(frameworkroot)-1);
            filename[_tcslen(frameworkroot)] = 0;
            _tcscat_s(filename,FindFileData.cFileName);
            _tcscat_s(filename,_T("\\mscorlib.dll"));
            Word majorPart,minorPart,buildPart,privatePart;
            if (GetFileVersion(filename,&majorPart,&minorPart,&buildPart,&privatePart )) {
                _tprintf(_T("%d.%d.%d.%d\r\n"),majorPart,minorPart,buildPart,privatePart);
            }
        }
    } while (FindNextFile(hFind,&FindFileData) != 0);
    FindClose(hFind);
    return 0;
}
0
user287466