Який неправдоподібний спосіб сказати, які версії (-ів) .NET встановлені на виробництві Windows Server?


99

Це питання пов'язане не стільки з програмуванням, скільки з пов'язаним з розгортанням.

Мені здається, що я багато спілкуюся з групою в моїй компанії, завданням якої є підтримка наших виробничих серверів Windows та розгортання на них коду. З юридичних причин та дотримання вимог я не маю прямої видимості чи контролю над серверами, тому єдиний спосіб я можу визначити, яку версію (-ів) .NET встановлено на будь-якому з них - через вказівки, які я даю цій групі.

Поки всі методи, які я можу придумати, щоб сказати, яка версія (-и) встановлена ​​(перевірте, чи є утиліти Адміністративні засоби, що відповідають 1.1 або 2.0, перевірте записи в списку "Додати / видалити програми", перевірте наявність існування каталоги в розділі c: \ Windows \ Microsoft.NET) є помилковими (я бачив принаймні одну машину з версією 2.0, але не вводив 2.0 в розділі Адміністративні інструменти - і цей метод нічого не говорить про 3.0+, список "Додати / видалити програми" може вийти із синхронізації з реальністю, а існування каталогів не обов'язково нічого означає).

Зважаючи на те, що я, як правило, повинен знати, що ці речі знаходяться заздалегідь (виявивши, що "ой, ця версія не має всіх потрібних вам версій та пакетів обслуговування" не дуже добре працює з короткими вікнами технічного обслуговування), і я повинен зробіть перевірку "через проксі", оскільки я не можу потрапити безпосередньо на сервери, який безглуздий спосіб сказати, які версії (-ів) .NET встановлені на виробництві Windows Server? Переважно якийсь внутрішній спосіб зробити це, використовуючи те, що встановлюється фреймворк, оскільки це буде швидше і не потрібна якась утиліта для завантаження, а також метод, який точно не вдасться, якщо рамки не встановлені належним чином, але все-таки є файли на місці (тобто , там є каталог і gacutil.exe зазначається там, але ця версія фреймворку насправді не "встановлена")

РЕДАКТУВАННЯ: За відсутності хорошого непростого внутрішнього способу зробити це вбудованим у Рамки (рамки), хтось знає про хорошу, легку програму, яка не потрібна для встановлення, яка може це дізнатись? Я можу уявити, що хтось міг би легко написати його, але якщо такий вже існує, це було б навіть краще.


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

Рядок User Agent із наданої URL-адреси: Mozilla / 5.0 (сумісний; MSIE 10.0; Windows NT 6.1; WOW64; Trident / 6.0) . Так, які версії .NET Framework встановлені? Для досягнення очікуваного результату потрібно переключити IE в сумісний режим.
Моск

1
Скотт Гензельман, безумовно, встановив добросовісність, тому я б не називав це "випадковим сайтом". (Плюс він надає вихідний код доступним.) Але для цього додатка потрібне підключення до Інтернету, у якого хостинги клітки із заблокованою в Фарадеєм часто відсутні.
Роберт Калхун

24

Ви можете програмно перевірити реєстр та кілька інших речей відповідно до цієї записи в блозі .

Ключ реєстру, на який слід звернути увагу, є

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

Я не можу сказати - чи це також охоплює 1,1?
Том Кідд,

1
Я можу побачити 1.1 деталі під цим ключем реєстру в моїй системі, тому я б сказав, що він охоплює 1.1
Niall Connaughton

Так, дивлячись на ... \ 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
Nick Patsaris

15

Відповідно до відповіді CodeTrawler , рішення полягає в тому, щоб ввести наступне у вікно провідника:

% systemroot% \ Microsoft.NET \ Framework

Потім шукайте:

Mscorlib.dll

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


Це здається найпростішим способом розмежувати версію 4 / 4.5+, інакше для огляду того, що встановлено, @ K.Dias відповів на мене: dir% windir% \ microsoft.net \ frame \ v * / O : -N / B
Тімоті Лі Рассел

15

Спосіб Microsoft полягає в наступному:

MSDN: Як визначити , які платформи .NET Framework версія встановлена (який направляє вас до наступного розділу реєстру: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP\...)

Якщо ви хочете безглуздо, це вже інша річ. Я б не хвилювався з приводу xcopy рамкової папки. Якщо хтось зробив це, я вважав би комп’ютер зламаним.

Найбільш нерозумним способом було б написати невелику програму, яка використовує кожну версію .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.


1

Щоб отримати встановлену версію dotnet,
створіть додаток Console. Додайте цей клас Запуск цього

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?
Кікенет

0

Як не дивно, я написав якийсь код, щоб зробити це назад, коли вийшов 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;
}

0

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


0

Можливо, це неприємний спосіб знайти версії, але я завжди мав враження, що всі версії встановлені <root>:\WINDOWS\Microsoft.NET\Framework .

Це надає папкам такі імена, які, як v2.0.50727я вважаю, дають детальну інформацію про версію.


1
І це може бути правильний шлях, але "що робити, якщо?" в моїй голові сказано, "що, якщо файли є, але Рамка насправді не" встановлена ​​", і якийсь неосвічений адміністратор думав, що це копіювання файлів?"
Том Кідд,

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 як приватну, як це: приватна статична void Main (string [] args) {}
Ronnie Petty

Це майже все, як Microsoft виклала на MSDN. msdn.microsoft.com/en-us/library/hh925568%28v=vs.110%29.aspx
Ronnie Petty

0

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


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.