Какой надежный способ определить, какие версии .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
... и щелкните правой кнопкой мыши/перейдите на вкладку версии для каждого результата.
Ответ 6
http://www.asoft.be/prod_netver.html
Используйте эту "хорошую, легкую, не требующую установки программу"
Ответ 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, и он показал мне, какие версии имели обновления, что позволило мне заключить, какие версии были установлены.