这个问题是不是因为它是部署相关关系这么多节目。
我发现自己交谈了很多,在我的公司,他们的工作是维持我们的生产Windows服务器和它们部署我们的代码组。 对于法律与合规的原因,我没有直接的知名度还是让我可以告诉.NET的版本(S)的唯一途径是安装在任何人在任何服务器控制是通过方向我给该组。
到目前为止,所有的方法我能想到的告诉哪个版本(一个或多个)安装(检查管理工具匹配1.1或2.0,为您在“添加/删除程序”列表中的条目,检查的存在在c目录:\ WINDOWS \ Microsoft.NET)是有缺陷的(我已经看到至少一个机2.0,但管理工具下没有2.0项 - 这方法不能告诉你3.0+,“添加/删除程序”列表可以得到与现实同步,以及目录的存在并不一定意味着什么)。
由于我通常需要知道这些东西都是提前到位(发现,“哎呀,这一个不拥有所有的版本和服务包,您需要”并没有真正短的维护窗口正常工作),我有做检查“通过代理”因为我不能在服务器上得到直接,有什么万无一失的方法告诉.NET的版本(S)被安装在生产的Windows Server? 优选的一些内在的方式来做到这一点使用的是什么框架安装,因为它会更快,而不是需要某种实用程序来加载并且如果框架安装不正确,但它肯定会失败,仍然有地方文件的方法(即,有一个目录,然后将Gacutil.exe是inded存在,但该框架的这个版本是不是真的“安装”)
编辑:在没有一个很好的万无一失内在办法做到这一点内置在框架上,没有人知道一个好,重量轻,无需安装要求的程序,可以发现这一点的? 我能想象有人可以随便写一个,但如果已经存在,那会更好。
Answer 1:
你应该为你正在寻找此信息在服务器上打开IE浏览器,并去这个网站: http://www.hanselman.com/smallestdotnet/
这一切都需要。
该网站有一个脚本,看起来你的浏览器的“用户代理”,并计算出你有(或没有)安装.NET Framework的是什么版本(如果有的话),并自动显示它(然后计算出总的大小,如果你选择要下载.NET Framework)。
Answer 2:
您可以通过编程检查注册表和一些其他的东西按照这个博客条目 。
注册表项以看就是
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP\...]
Answer 3:
找到答案从这里 :
检查哪些.NET Framework版本安装
打开命令提示符,然后复制粘贴下面的命令行之一
dir %WINDIR%\Microsoft.Net\Framework\v*
要么
dir %WINDIR%\Microsoft.Net\Framework\v* /O:-N /B
Answer 4:
按照CodeTrawler的回答 ,解决的方法是输入以下到一个浏览器窗口:
%SYSTEMROOT%\ Microsoft.NET \框架
然后搜索:
mscorlib.dll中
......然后右键单击/转到版本选项卡每个结果。
Answer 5:
微软的方法是这样的:
MSDN:如何确定哪些.NET框架版本的安装位置 (这将引导您到以下注册表项: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP\...
)
如果你想万无一失这是另一回事。 我不会担心的框架文件夹的XCOPY。 如果有人这样做,我会考虑打破了电脑。
最简单的方法是编写使用和.NET的各个版本,你关心和运行它们的库的小程序。
对于没有安装方法, PowerBasic是一个很好的工具。 它创造了不小的运行时所需的exe。 它可以自动进行上述MS KB文章中描述的检查。
Answer 6:
http://www.asoft.be/prod_netver.html
用这种“好,重量轻,无需要安装的程序”
Answer 7:
如果要检查机器已经安装了.NET SDK,可以使用SDK命令提示符并运行该程序CLRVer.exe
。
Answer 8:
如何做到这一点,微软官方的回答是在知识库文章318785 。
Answer 9:
迈拓OneTouch部署将完成所有的检测和安装的先决条件的。 这也可能是最好的去与预制的解决方案比试图推出自己的。 试图推出自己可能会导致因为任何事情,你键入上可以与修补程序或服务包改变的问题。 可能微软有一些启发确定是哪个版本正在运行。
Answer 10:
检测.NET 3.0此处描述的正式途径
http://msdn.microsoft.com/en-us/library/aa480198.aspx
有缺陷的,因为它需要调用者具有注册表访问权限。
MSDN还提到了通过检查用户代理字符串检测.NET 3.5的技术:
http://msdn.microsoft.com/en-us/library/bb909885.aspx
我认为微软应该做比这更好的工作。
Answer 11:
此外,看到堆栈溢出的问题, 如何检测.NET框架版本和服务包安装什么? 其中也提到:
有一个微软官方回答这个问题在知识库文章[如何确定安装了哪些微软.NET Framework版本和服务包级别] [2]
文章编号:318785 - 最后修改:2008年11月7日 - 修订:20.1如何确定的.NET Framework版本的安装位置以及是否服务包已经应用。
不幸的是,它似乎并没有工作,因为mscorlib.dll
在2.0目录版本有一个2.0的版本,并没有mscorlib.dll
无论是在3.0或3.5版本的目录即使安装了3.5 SP1 ...为什么将微软官方的答案被这样误导?
Answer 12:
要确定您的服务器对.NET框架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 Framework 4.5.2。
Answer 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
}
Answer 14:
奇怪的是,我写了一些代码来做到这一点回来时,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;
}
Answer 15:
嗯,就像Dean说,你可以看一下注册表,并做他做了什么。 要检查,如果他真的安装了CLR的.NET Framework,你应该寻找MSCorEE.dll
在文件%SystemRoot%\System32
目录。
Answer 16:
这可能是找到了版本一个讨厌的方式,但我一直的印象是,所有的版本得到了安装在<root>:\WINDOWS\Microsoft.NET\Framework
。
这提供了文件夹,其名称v2.0.50727
我相信给出详细的版本信息。
Answer 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");
}
}
}
然后控制台的结果会告诉你安装了哪些版本和可用于您的部署使用。 此代码派上用场,也因为你有他们为随时保存的解决方案,您要检查它的未来。
Answer 18:
我走进Windows更新及望着更新历史记录,了解服务器修补是随时保持最新状态。 我扫描下来.NET更新而事实证明,我到底哪个版本已经有了更新,这让我得出结论安装了哪些版本。
Answer 19:
我发现这是非常有用的。 这里的源
文章来源: What's the foolproof way to tell which version(s) of .NET are installed on a production Windows Server?