Какой надежный способ узнать, какие версии .NET установлены на производственном Windows Server?

99

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

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

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

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

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

Том Кидд
источник
1
Я изучал это некоторое время назад и не мог найти окончательного способа сделать это. Мне было бы интересно посмотреть, какие ответы мы получим.
Кев,
Возможный дубликат Как определить, какие версии .NET Framework и пакеты обновления установлены? - канонический вопрос (хоть и моложе на 17 дней).
Питер Мортенсен

Ответы:

54

Вам следует открыть IE на сервере, для которого вы ищете эту информацию, и перейти на этот сайт: http://www.hanselman.com/smallestdotnet/

Это все, что нужно.

На сайте есть скрипт, который просматривает UserAgent вашего браузера и определяет, какая версия (если есть) .NET Framework у вас установлена ​​(или не установлена), и отображает ее автоматически (а затем вычисляет общий размер, если вы выбрали для загрузки .NET Framework).

Вайбхав
источник
19
- если это производственный сервер, он может даже не иметь к нему доступа - просмотр случайных сайтов на prod-сервере - большой запрет - этот сайт предоставляет только самую высокую версию .Net; он хочет их всех
Фрэнси Пенов
1
Проблема, похоже, с таким подходом в том, что он только сообщает вам, какая у вас последняя версия. Я развертываю код в версиях 2.0, 3.0, 3.5 и (к сожалению) даже 1.1. Хотя цель состоит в том, чтобы со временем обновить все, на данный момент печальный факт заключается в том, что мне нужны все разные параллельные версии.
Том Кидд,
1
Хотя я согласен, что это решение может не подходить для производственных серверов, я проголосовал за него, потому что это, безусловно, самый простой и быстрый метод для машин разработки (на которых я часто его использовал). Текущая версия скрипта успешно обнаружила все разные версии .NET, которые я установил.
kmote
Строка пользовательского агента из предоставленного URL: Mozilla / 5.0 (совместимый; MSIE 10.0; Windows NT 6.1; WOW64; Trident / 6.0) . Ба-га-га, а какие версии .NET Framework установлены? Для достижения ожидаемого результата необходимо перевести IE в совместимый режим.
Mosc
1
Скотт Хансельман определенно зарекомендовал себя добросовестно, поэтому я бы не назвал это «случайным сайтом». (К тому же он делает доступным исходный код.) Но для этого приложения действительно требуется подключение к Интернету, которого часто не хватает узлам, запертым в клетке Фарадея.
Роберт Калхун
24

Вы можете программно проверить реестр и многое другое в соответствии с этой записью в блоге .

Ключ реестра, на который следует обратить внимание:

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP\...]
Эд Гиннес
источник
Я не могу сказать - это тоже относится к 1.1?
Том Кидд,
1
Я вижу детали 1.1 в этом разделе реестра в моей системе, поэтому я бы сказал, что он действительно охватывает 1.1
Найл Коннотон,
Да, заглянув в раздел ... \ NDP \ v4 \ Full \, то в версии, которую я увидел, у меня была v 4.5.5 ... TargetVersion установлена ​​на 4.0.0
Off The Gold
19

Нашел ответ отсюда :

Проверьте, какая версия .NET Framework установлена

Откройте командную строку и скопируйте и вставьте одну из следующих командных строк.

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

или

dir %WINDIR%\Microsoft.Net\Framework\v* /O:-N /B
К. Диас
источник
Именно то, что мне было нужно
PandaWood
13
4.5 и 4.5.1 устанавливаются вместо 4.0, поэтому такое решение может ввести в заблуждение. msdn.microsoft.com/en-us/library/5a4x27ek%28v=vs.110%29.aspx
Ник Патсарис,
15

Согласно ответу CodeTrawler , решение состоит в том, чтобы ввести следующее в окно проводника:

% systemroot% \ Microsoft.NET \ Framework

Затем ищите:

Mscorlib.dll

... и щелкните правой кнопкой мыши / перейдите на вкладку версии для каждого результата.

Джон Кейдж
источник
Кажется, это самый простой способ отличить версию 4 / 4.5+, в противном случае для обзора того, что установлено, у меня сработал ответ @K.Dias: dir% windir% \ microsoft.net \ framework \ v * / O : -N / B
Тимоти Ли Рассел
15

Способ Microsoft таков:

MSDN: Как определить , какие платформы .NET Framework версия установлена (который направляет вас к следующему разделу реестра: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP\...)

Другое дело, если вам нужна защита от дурака. Я бы не стал беспокоиться о копии папки framework. Если бы кто-то сделал это, я бы посчитал компьютер сломанным.

Самый надежный способ - написать небольшую программу, использующую каждую версию .NET и библиотеки, которые вам нужны, и запустить их.

Для метода без установки PowerBasic - отличный инструмент. Он создает небольшие исполняемые файлы exe. Он может автоматизировать проверки, описанные в статье MS KB выше.

Брюсэтк
источник
Этот метод больше не работает для версий 4.5.1 и выше
Скотт Солмер
@ Okuma.Scott - Я обновил ссылку на официальные инструкции MSDN.
kmote
3

Если на компьютере, который вы хотите проверить, установлен .NET SDK, вы можете использовать командную строку SDK и запустить программу CLRVer.exe.

Джим Девиль
источник
1
Есть ли какие-либо (лицензионные) проблемы с развертыванием только этого исполняемого файла? Здесь нет никаких зависимостей.
1
clrver бесполезен, потому что врет. Там написано 4.0. * Для 4.5 / 4.6
Роман Старков
1

Развертывание OneTouch выполнит все обнаружение и установку необходимых компонентов. Вероятно, лучше использовать готовое решение, чем пытаться накатить собственное. Попытка свернуть свой собственный может привести к проблемам, потому что все, что вы нажмете, может измениться с исправлением или пакетом обновления. Вероятно, у Microsoft есть эвристика для определения того, какая версия работает.

Орион Адриан
источник
1

Официальный способ обнаружения .NET 3.0 описан здесь.

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

Ошибочно, потому что для этого требуется, чтобы у вызывающей стороны были разрешения на доступ к реестру.

MSDN также упоминает способ обнаружения .NET 3.5 путем проверки строки User Agent:

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

Я думаю, что Microsoft следовало бы сделать лучше, чем это.

Джо
источник
1

Также см. Вопрос о переполнении стека. Как определить, какие версии .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 будет так дезинформированы?

анон
источник
1

Чтобы определить, поддерживает ли ваш сервер .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. Если ваш сервер поддерживает целевую платформу, тогда простая строка будет отображаться из вашего тривиального контроллера. В противном случае вы получите сообщение об ошибке следующего вида:

Пример неподдерживаемого .NET 4.5.2 на сервере

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

dave_k_smith
источник
1

Чтобы получить установленную версию 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
}
Металлический скелет
источник
последняя версия 4.7.2?
Kiquenet
0

Как ни странно, я написал код, чтобы сделать это, когда вышла 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;
}

источник
0

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

Бруно Коста
источник
0

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

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

Декан
источник
1
И это могло бы быть правильным путем, но "а что, если?" в моей голове говорит: «Что, если файлы есть, но Framework на самом деле не« установлена ​​», и какой-то невежественный администратор подумал, что копирование файлов - это способ сделать это?»
Том Кидд,
0

Если вы хотите найти версии до .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");

        }
    }
}

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

Ронни Петти
источник
Кстати, вы можете сделать Main как частный, например так: private static void Main (string [] args) {}
Ронни Петти
Это в значительной степени то, что Microsoft изложила в MSDN. msdn.microsoft.com/en-us/library/hh925568%28v=vs.110%29.aspx
Ронни Петти
0

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

Ким К.
источник