99

この質問は、プログラミングに関連するものではなく、展開に関連するものです。

実稼働 Windows サーバーを維持し、コードを展開することを仕事とする会社のグループと、私はよく話していることに気づきました。法律およびコンプライアンス上の理由から、私はサーバーを直接見ることも制御することもできないため、どのバージョンの .NET がサーバーにインストールされているかを知る唯一の方法は、そのグループに指示を与えることです。

これまでのところ、インストールされているバージョンを確認するために考えられるすべての方法 (1.1 または 2.0 に一致する管理ツールを確認する、[プログラムの追加と削除] リストのエントリを確認する、 c:\Windows\Microsoft.NET の下のディレクトリ) には欠陥があります (少なくとも 1 台のマシンで 2.0 がインストールされているのを見たことがありますが、管理ツールの下に 2.0 のエントリはありません。その方法では、3.0 以降の「プログラムの追加と削除」リストについては何もわかりません)。現実と同期しなくなる可能性があり、ディレクトリの存在は必ずしも何の意味もありません)。

私は一般的に、これらのものが事前に整っていることを知る必要があることを考えると(「おっと、これには必要なすべてのバージョンとサービスパックが含まれていない」ことを発見しても、短いメンテナンス期間ではうまく機能しません)、私はしなければなりませんサーバーに直接アクセスできないため、「プロキシで」チェックを行います。本番環境の Windows サーバーにインストールされている .NET のバージョンを確認する簡単な方法は何ですか? できれば、フレームワークがインストールするものを使用してこれを行うためのいくつかの固有の方法が高速であり、何らかのユーティリティをロードする必要がなく、フレームワークが適切にインストールされていなくてもファイルが配置されている場合に確実に失敗する方法 (つまり、 、ディレクトリがあり、そこに gacutil.exe が含まれていますが、そのバージョンのフレームワークは実際には「インストール」されていません)

編集:フレームワークに組み込まれているこれを行うための優れた確実な固有の方法がない場合、これを見つけることができる、軽量でインストール不要の優れたプログラムを知っている人はいますか? 誰かが簡単に作成できると想像できますが、既に存在する場合はさらに優れています。

4

19 に答える 19

54

この情報を探しているサーバーで IE を開き、次のサイトにアクセスしてください: http://www.hanselman.com/smallestdotnet/

それだけです。

このサイトには、ブラウザの「UserAgent」を調べて、インストールされている (またはインストールされていない) .NET Framework のバージョン (存在する場合) を特定し、それを自動的に表示するスクリプトがあります (次に、選択した場合は合計サイズを計算します)。 .NET Framework をダウンロードします)。

于 2008-09-26T14:41:16.897 に答える
24

このブログ エントリに従って、レジストリやその他のいくつかのことをプログラムで確認できます。

確認するレジストリ キーは次のとおりです。

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP\...]
于 2008-09-26T14:35:16.850 に答える
15

CodeTrawler 's answer に従って、解決策はエクスプローラ ウィンドウに次のように入力することです。

%systemroot%\Microsoft.NET\Framework

次に、次を検索します。

Mscorlib.dll

...そして右クリックして、各結果のバージョン タブに移動します。

于 2009-06-01T16:07:54.267 に答える
15

マイクロソフトのやり方は次のとおりです。

MSDN: インストールされている .NET Framework のバージョンを確認する方法(次のレジストリ キーに移動します: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP\...)

あなたが誰にでもできることを望むなら、それは別のことです. フレームワーク フォルダーの xcopy については心配しません。誰かがそんなことをしたら、私はコンピューターが壊れたと考えるでしょう。

最も確実な方法は、.NET の各バージョンと関心のあるライブラリを使用する小さなプログラムを作成して実行することです。

インストール不要の方法として、PowerBasicは優れたツールです。ランタイムを必要としない小さなexeを作成します。上記の MS KB 記事で説明されているチェックを自動化できます。

于 2008-09-26T14:58:24.487 に答える
7

http://www.asoft.be/prod_netver.html

この「軽量でインストール不要の優れたプログラム」を使用してください

于 2012-06-19T23:19:37.867 に答える
3

これを行う方法に関する Microsoft の公式の回答は、KB 記事 318785にあります。

于 2008-09-26T14:58:14.237 に答える
3

確認するマシンに .NET SDK がインストールされている場合は、SDK コマンド プロンプトを使用してプログラムを実行できますCLRVer.exe

于 2008-09-26T17:29:42.920 に答える
1

インストールされている 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
}
于 2016-10-07T08:43:05.840 に答える
1

.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

Microsoft はこれよりも優れた仕事をすべきだったと思います。

于 2008-09-26T17:22:51.097 に答える
1

OneTouch 展開では、前提条件のすべての検出とインストールが行われます。独自のソリューションを作成しようとするよりも、既製のソリューションを使用するのがおそらく最善です。キーを押したものがホットフィックスやサービス パックで変更される可能性があるため、自分で作成しようとすると問題が発生する可能性があります。Microsoft は、実行中のバージョンを特定するためのヒューリスティックを備えている可能性があります。

于 2008-09-26T14:34:14.700 に答える
1

また、スタック オーバーフローの質問「インストールされている .NET Framework のバージョンとサービス パックを検出する方法」も参照してください。また、言及:

この質問に対する Microsoft の公式回答は、ナレッジ ベースの記事[インストールされている Microsoft .NET Framework のバージョンとサービス パック レベルを確認する方法] [2] にあります。

文書番号: 318785 - 最終更新日: 2008 年 11 月 7 日 - リビジョン: 20.1 インストールされている .NET Framework のバージョンとサービス パックが適用されているかどうかを確認する方法。

残念ながら、mscorlib.dll2.0 ディレクトリのバージョンには 2.0 バージョンがありmscorlib.dll、3.5 SP1 がインストールされていても 3.0 または 3.5 ディレクトリのいずれにもバージョンがないため、機能していないようです...なぜ公式の Microsoft の回答はそんなに誤報?

于 2010-06-21T20:34:59.450 に答える
0

奇妙なことに、私は 1.1 がリリースされたときにこれを実行するコードをいくつか書き (7 年前のことでしょうか?)、2.0 がリリースされたときに少し調整しました。サーバーを管理しなくなったため、何年も見ていませんでした。

絶対確実というわけではありませんが、とにかく面白いので投稿します。.NET の方が簡単で、Power Shell の方が簡単です。

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;
}
于 2010-04-22T18:56:16.780 に答える
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");

        }
    }
}

次に、コンソールの結果に、インストールされていてデプロイで使用できるバージョンが示されます。このコードは、後で確認したいときにいつでも解決できるように保存されているため、便利です。

于 2013-11-29T17:55:16.320 に答える
0

バージョンを見つけるのはおそらく厄介な方法ですが、私は常に、すべてのバージョンが にインストールされているという印象を受けていました<root>:\WINDOWS\Microsoft.NET\Framework

v2.0.50727これにより、詳細なバージョン情報を提供すると思われる名前の付いたフォルダーが提供されます。

于 2008-09-26T14:34:45.447 に答える
0

ディーンが言ったように、レジストリを見て、彼がしたことを実行できます。MSCorEE.dll本当に CLR .NET Framework がインストールされているかどうかを確認するには、ディレクトリ内のファイルを探す必要があります%SystemRoot%\System32

于 2009-01-31T20:26:06.363 に答える