Какой надежный способ определить, какая версия (версии) .NET установлена ​​на производственном Windows Server? - PullRequest
99 голосов
/ 26 сентября 2008

Этот вопрос связан не столько с программированием, сколько с развертыванием.

Я часто разговариваю с группой в моей компании, чья работа заключается в том, чтобы поддерживать наши рабочие серверы Windows и развертывать на них наш код. По юридическим причинам и причинам соответствия, я не имею прямой видимости или какого-либо контроля над серверами, поэтому единственный способ узнать, какие версии .NET установлены на любой из них, - это указания, которые я даю этой группе.

Пока что все способы, которые я могу придумать, чтобы сказать, какая версия (версии) установлены (проверьте, соответствуют ли средства администрирования, соответствующие 1.1 или 2.0, проверьте записи в списке «Установка и удаление программ», проверьте наличие наличие каталогов в c: \ Windows \ Microsoft.NET) имеет недостатки (я видел по крайней мере одну машину с 2.0, но без записей 2.0 в административных инструментах - и этот метод ничего не говорит о 3.0+, «Добавить / Удалить» Список программ может не совпадать с реальностью, и наличие каталогов не обязательно означает что-либо).

Учитывая то, что мне, как правило, нужно знать, что все это уже готово (обнаружение, что "к сожалению, у этого нет всех необходимых вам версий и пакетов обновления", не очень хорошо работает с короткими окнами обслуживания) и Я должен выполнить проверку «по доверенности», так как я не могу получить доступ к серверам напрямую, какой надежный способ определить, какая версия (версии) .NET установлена ​​на производственном Windows Server? Желательно какой-то встроенный способ сделать это, используя то, что устанавливает фреймворк, так как это будет быстрее и не потребует какой-либо утилиты для загрузки, а также метод, который определенно потерпит неудачу, если фреймворки не установлены должным образом, но все еще имеют файлы (например есть каталог, в который вставлен gacutil.exe, но эта версия фреймворка на самом деле не "установлена")

РЕДАКТИРОВАТЬ: В отсутствие хорошего надежного встроенного способа сделать это встроенным в Framework (s), кто-нибудь знает хорошую, легкую, не требующую установки программу, которая может найти это из? Я могу представить, что кто-то мог бы легко написать один, но если бы он уже существовал, это было бы еще лучше.

Ответы [ 19 ]

1 голос
/ 07 октября 2016

Чтобы получить установленную версию dotnet,
Создайте консольное приложение. Добавить этот класс Запустите это

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 голос
/ 29 мая 2014

Чтобы определить поддержку вашего сервера для .NET Framework 4.5 и более поздних версий (протестировано с помощью 4.5.2): Если у вас нет доступа к реестру на сервере , но приложение публикует права на этот сервер, создает приложение MVC 5 с тривиальным контроллером, например:

using System.Web.Mvc;

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

Затем в вашем файле Web.config просмотрите нужные версии .NET Framework в следующем разделе, изменив значения targetFramework по желанию:

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

Опубликуйте каждую цель на своем сервере, затем перейдите к <app deploy URL>/Default. Если ваш сервер поддерживает целевой фреймворк, то простая строка будет отображаться на вашем простом контроллере. Если нет, вы получите сообщение об ошибке, подобное следующему:

Example of unsupported .NET 4.5.2 on server

Так что в этом случае мой целевой сервер еще не поддерживает .NET Framework 4.5.2.

1 голос
/ 22 июня 2010

Кроме того, см. Вопрос переполнения стека Как определить, какие версии .NET Framework и пакеты обновления установлены? , в котором также упоминается:

Официальный ответ Microsoft на этот вопрос содержится в статье базы знаний [Как определить, какие версии и уровни пакетов обновления для Microsoft .NET Framework установлены] [2]

Идентификатор статьи: 318785 - Последний обзор: 7 ноября 2008 г. - Редакция: 20.1 Как определить, какие версии .NET Framework установлены и были ли установлены пакеты обновления.

К сожалению, он не работает, потому что версия mscorlib.dll в каталоге 2.0 имеет версию 2.0, а версия mscorlib.dll отсутствует в каталогах 3.0 или 3.5, даже если установлен 3.5 SP1. .. Почему официальный ответ Microsoft так дезинформирован?

0 голосов
/ 28 июня 2018

Я нашел это весьма полезным. вот источник

enter image description here

0 голосов
/ 28 июля 2016

Я зашел в Центр обновления Windows и посмотрел историю обновлений, зная, что исправления на сервере обновляются. Я просмотрел обновления .NET, и он показал мне, какие именно версии имели обновления, что позволило мне определить, какие версии были установлены.

0 голосов
/ 29 ноября 2013

Если вы хотите найти версии до .NET 4.5, используйте код для консольного приложения. Как это:

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);
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}

В противном случае вы можете найти .NET 4.5 или более позднюю версию, выполнив запрос следующим образом:

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");

        }
    }
}

Тогда результат консоли скажет вам, какие версии установлены и доступны для использования в ваших развертываниях. Этот код также пригодится, потому что он у вас есть в качестве сохраненных решений для тех случаев, когда вы хотите проверить его в будущем.

0 голосов
/ 31 января 2009

Ну, как сказал Дин, вы можете посмотреть реестр и сделать то, что он сделал. Чтобы проверить, действительно ли у него установлен CLR .NET Framework, вам нужно найти файл MSCorEE.dll в каталоге %SystemRoot%\System32.

0 голосов
/ 26 сентября 2008

Вероятно, это неприятный способ узнать версии, но у меня всегда было впечатление, что все версии были установлены на <root>:\WINDOWS\Microsoft.NET\Framework.

Это обеспечивает папки с именами, такими как v2.0.50727, которые, я полагаю, дают подробную информацию о версии.

0 голосов
/ 22 апреля 2010

Как ни странно, я написал некоторый код, чтобы сделать это, когда вышел 1.1 (что это было, семь лет назад?) И немного подправил его, когда вышла 2.0. Я не смотрел на это годами, так как мы больше не управляем нашими серверами.

Это не надежно, но я все равно выкладываю, потому что нахожу это с юмором; в том, что это проще сделать в .NET и еще проще в Power Shell.

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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...