什么是万无一失的方法告诉.NET的版本(S)被安装在生产的Windows Server?(What&

2019-07-17 12:02发布

这个问题是不是因为它是部署相关关系这么多节目。

我发现自己交谈了很多,在我的公司,他们的工作是维持我们的生产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?