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

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

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

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

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

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

Ответ 1

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

Это все, что требуется.

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

Ответ 2

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

Ключ реестра, который нужно посмотреть,

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP\...]

Ответ 3

Найден ответ от здесь:

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

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

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

или

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

Ответ 4

Способ Microsoft:

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

Если вы хотите, чтобы это была другая вещь. Я бы не стал беспокоиться о xcopy папки фреймворка. Если бы кто-то сделал это, я бы подумал, что компьютер сломан.

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

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

Ответ 5

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

% SystemRoot%\Microsoft.NET\Framework

Затем выполните поиск:

mscorlib.dll

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

Ответ 7

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

Ответ 8

Официальный ответ Microsoft о том, как это сделать, находится в KB статье 318785.

Ответ 9

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

Ответ 10

Официальный способ обнаружения .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 должна была бы работать лучше, чем это.

Ответ 11

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

Ответ 12

Чтобы определить поддержку вашего сервера для версий .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.

Ответ 13

Чтобы получить установленную версию 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
}

Ответ 14

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

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

Ответ 15

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

Ответ 16

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

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

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

Ответ 17

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

        }
    }
}

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

Ответ 18

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