実稼働Windowsサーバーにインストールされている.NETのバージョンを確認するための簡単な方法は何ですか?


99

この質問は、デプロイメントに関連しているため、プログラミングに関連したものではありません。

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

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

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

編集:これをフレームワークに組み込むための優れた間違いのない本質的な方法がない場合、これを見つけることができる、インストールが不要で優れた軽量のプログラムを誰かが知っていますか?誰かが簡単に書けると想像できますが、もしそれが既に存在しているなら、それはさらに良いでしょう。


1
私はしばらく前にこれを調べましたが、これを行うための決定的な方法を見つけることができませんでした。私たちがどのような答えを得るのか興味があります。
Kev

回答:


54

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

それだけです。

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


19
-それが本番サーバーである場合、彼はそれにアクセスできないかもしれません-本番サーバーでランダムなサイトを閲覧することは非常に難しいです-そのサイトは最高の.Netバージョンのみを提供します。彼はそれらすべてを望んでいます
フランシ・ペノフ

1
問題は、そのように見えますが、そのアプローチでは、最新のバージョンが何であるかを通知するだけです。2.0、3.0、3.5、および(悲しいことに)1.1でもコードをデプロイします。最終的にはすべてをアップグレードすることを目標としていますが、残念ながら今のところ、さまざまな並列バージョンがすべて必要です。
トム・キッド

1
このソリューションは運用サーバーには適していない可能性があることに同意しますが、開発マシン(私が頻繁に使用したもの)にとって確かに最も単純で最も速い方法であるため、私はそれを支持しました。スクリプトの現在のバージョンは、インストールした.NETのすべての異なるバージョンを正常に検出しました。
kmote 2012

提供されたURLからのユーザーエージェント文字列:Mozilla / 5.0(互換性あり; MSIE 10.0; Windows NT 6.1; WOW64; Trident / 6.0)。Bu-ga-gaでは、どの.NET Frameworkバージョンがインストールされていますか?期待される結果を得るには、IEを互換モードに切り替える必要があります。
Mosc 2013

1
スコット・ハンセルマンは確かに彼の善意を確立したので、私はそれを「ランダムなサイト」とは呼びません。(さらに、彼はソースコードを利用可能にします。)しかし、このアプリはインターネット接続を必要とします。これは、ファラデーケージに閉じ込められたホストには頻繁にありません。
Robert Calhoun

24

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

調べるレジストリキーは

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

わかりません-これには1.1も含まれますか?
トムキッド

1
私のシステムでは、このレジストリキーの下で1.1の詳細を確認できるため、1.1をカバーしていると言えます
Niall Connaughton

はい、... \ NDP \ v4 \ Full \の下を 見ると、バージョン 4.5.5が表示されていました。TargetVersionは4.0.0に設定されています
オフゴールド

19

ここから答えが見つかりまし

インストールされている.NET Frameworkのバージョンを確認する

コマンドプロンプトを開き、以下のコマンドラインのいずれかをコピーして貼り付けます

dir %WINDIR%\Microsoft.Net\Framework\v*

または

dir %WINDIR%\Microsoft.Net\Framework\v* /O:-N /B

まさに私が必要としたもの
PandaWood 2013年

13
4.5と4.5.1は4.0の代わりにインストールされるため、このソリューションは誤解を招く可能性があります。msdn.microsoft.com/en-us/library/5a4x27ek%28v=vs.110%29.aspx
Nick Patsaris 14

15

あたりとしてCodeTrawlerの答え、ソリューションエクスプローラウィンドウに次のように入力することです。

%systemroot%\ Microsoft.NET \ Framework

次に検索:

Mscorlib.dll

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


これは、バージョン4 / 4.5以降を区別する最も簡単な方法のようです。それ以外の場合、インストールされているものの概要については、@ K.Diasの回答でうまくいきました。dir%windir%\ microsoft.net \ framework \ v * / O :-N / B
ティモシーリーラッセル

15

マイクロソフトのやり方はこれです:

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

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

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

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


この方法は、バージョン4.5.1以降では機能しません
Scott Solmer

@ Okuma.Scott-MSDNの公式指示へのリンクを更新しました。
kmote 2015


3

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


1
その実行可能ファイルのみの展開に(ライセンス)の問題はありますか?言うべき依存関係はありません。

1
clrverは嘘をついているので役に立たない。4.5 / 4.6の場合は4.0。*と表示されます
Roman Starkov、2015年


1

OneTouchの展開では、前提条件のすべての検出とインストールが行われます。自分でロールするのではなく、既成のソリューションを使用するのがおそらく最善です。自分でロールしようとすると、ホットフィックスやサービスパックでキー入力内容が変わる可能性があるため、問題が発生する可能性があります。おそらくマイクロソフトは、どのバージョンが実行されているかを判断するためのヒューリスティックを持っています。


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

マイクロソフトはこれよりも良い仕事をしたはずだと思う。


1

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

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

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

残念ながら、mscorlib.dll2.0ディレクトリのバージョンには2.0バージョンがありmscorlib.dll、3.5 SP1がインストールされていても3.0または3.5ディレクトリのいずれにもバージョンがないため、動作しないようです。なぜ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バージョンを取得するには
、コンソールアプリを作成します。このクラスを追加する

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?
Kiquenet

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;
}

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を次のようにプライベートに設定することもできます。privatestatic void Main(string [] args){}
Ronnie Petty

これは、MicrosoftがMSDNに配置した方法とほぼ同じです。msdn.microsoft.com/en-us/library/hh925568%28v=vs.110%29.aspx
Ronnie Petty

0

私はWindows Updateに入り、サーバーのパッチが最新に保たれていることを知って、更新履歴を調べました。.NETの更新をスキャンして調べたところ、どのバージョンに更新があったかが正確に示され、どのバージョンがインストールされているかを判断できました。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.