Apa cara yang sangat mudah untuk mengetahui versi .NET mana yang diinstal pada Windows Server produksi?


99

Pertanyaan ini tidak terlalu terkait dengan pemrograman, melainkan terkait dengan penerapan.

Saya mendapati diri saya banyak bercakap-cakap dengan grup di perusahaan saya yang tugasnya memelihara server Windows produksi kami dan menerapkan kode kami padanya. Untuk alasan hukum dan kepatuhan, saya tidak memiliki visibilitas langsung atau kontrol apa pun atas server sehingga satu-satunya cara saya dapat mengetahui versi .NET yang diinstal pada salah satu dari mereka adalah melalui petunjuk yang saya berikan kepada grup itu.

Sejauh ini, semua metode yang dapat saya pikirkan untuk mengetahui versi mana yang diinstal (periksa Alat Administratif yang cocok dengan 1.1 atau 2.0, periksa entri dalam daftar "Tambah / Hapus Program", periksa keberadaan direktori di bawah c: \ Windows \ Microsoft.NET) cacat (saya telah melihat setidaknya satu mesin dengan 2.0 tetapi tidak ada entri 2.0 di bawah Alat Administratif - dan metode itu tidak memberi tahu Anda apa pun tentang 3.0+, daftar "Tambah / Hapus Program" dapat keluar dari sinkronisasi dengan kenyataan, dan keberadaan direktori tidak selalu berarti apa-apa).

Mengingat bahwa saya biasanya perlu mengetahui hal-hal ini ada di tempat sebelumnya (menemukan bahwa "oops, yang satu ini tidak memiliki semua versi dan paket layanan yang Anda butuhkan" tidak benar-benar berfungsi dengan baik dengan jendela pemeliharaan singkat) dan saya harus melakukan pemeriksaan "dengan proxy" karena saya tidak dapat mengakses server secara langsung, apa cara yang sangat mudah untuk mengetahui versi .NET mana yang diinstal pada Windows Server produksi? Lebih disukai beberapa cara intrinsik untuk melakukannya dengan menggunakan apa yang diinstal oleh kerangka kerja karena akan lebih cepat dan tidak memerlukan semacam utilitas untuk dimuat dan juga metode yang pasti akan gagal jika kerangka tidak terpasang dengan benar tetapi masih memiliki file di tempatnya (mis. , ada direktori dan gacutil.exe ditemukan di sana, tetapi versi kerangka tersebut tidak benar-benar "terpasang")

EDIT: Dengan tidak adanya cara intrinsik yang sangat mudah dan mudah untuk melakukan ini yang dibangun ke dalam Kerangka, apakah ada yang tahu tentang program yang bagus, ringan, dan tidak perlu menginstal yang dapat menemukan ini? Saya dapat membayangkan seseorang dapat dengan mudah menulisnya tetapi jika sudah ada, itu akan lebih baik.


1
Saya melihat hal ini beberapa waktu lalu dan tidak dapat menemukan cara pasti untuk melakukan ini. Saya tertarik untuk melihat jawaban apa yang kami dapatkan.
Kev

Kemungkinan duplikat dari Bagaimana cara mendeteksi versi .NET Framework dan paket layanan yang diinstal? - pertanyaan kanonik (meskipun 17 hari lebih muda).
Peter Mortensen

Jawaban:


54

Anda harus membuka IE di server yang Anda cari info ini, dan pergi ke situs ini: http://www.hanselman.com/smallestdotnet/

Hanya itu yang dibutuhkan.

Situs ini memiliki skrip yang melihat "UserAgent" browser Anda dan mencari tahu versi (jika ada) dari .NET Framework yang telah Anda (atau belum) instal, dan menampilkannya secara otomatis (kemudian menghitung ukuran total jika Anda memilih untuk mengunduh .NET Framework).


19
- jika itu adalah server produksi, ia bahkan mungkin tidak memiliki akses ke sana - menjelajahi situs acak di server prod adalah hal yang tidak boleh dilakukan - situs itu hanya memberikan versi .Net tertinggi; dia menginginkan semuanya
Franci Penov

1
Masalahnya, sepertinya, dengan pendekatan itu adalah ia hanya memberi tahu Anda versi terbaru yang Anda miliki. Saya menerapkan kode di 2.0, 3.0, 3.5 dan (sayangnya) bahkan 1.1. Meskipun tujuannya adalah untuk meningkatkan semuanya pada akhirnya, fakta yang menyedihkan untuk saat ini adalah bahwa saya memerlukan semua versi paralel yang berbeda.
Tom Kidd

1
Meskipun saya setuju solusi ini mungkin tidak sesuai untuk server produksi, saya memberikan suara positif karena ini merupakan metode yang paling sederhana dan tercepat untuk mesin pengembangan (yang sering saya gunakan). Versi skrip saat ini berhasil mendeteksi semua versi berbeda dari .NET yang telah saya instal.
kmote

String Agen Pengguna dari URL yang disediakan: Mozilla / 5.0 (kompatibel; MSIE 10.0; Windows NT 6.1; WOW64; Trident / 6.0) . Bu-ga-ga, jadi, versi .NET Framework apa yang diinstal? Untuk mencapai hasil yang diharapkan perlu mengalihkan IE ke mode yang kompatibel.
Mosc

1
Scott Hanselman jelas telah membuktikan kebenarannya jadi saya tidak akan menyebutnya sebagai "situs acak". (Ditambah dia membuat kode sumbernya tersedia.) Tetapi aplikasi ini memang membutuhkan koneksi internet, yang seringkali tidak dimiliki oleh host yang terkunci di dalam sangkar Faraday.
Robert Calhoun

24

Anda dapat secara terprogram memeriksa registri dan beberapa hal lainnya sesuai entri blog ini .

Kunci registri yang harus dilihat adalah

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

Saya tidak tahu - apakah ini juga mencakup 1.1?
Tom Kidd

1
Saya dapat melihat 1.1 detail di bawah kunci registri ini di sistem saya, jadi menurut saya itu mencakup 1.1
Niall Connaughton

Ya, lihat di bawah ... \ NDP \ v4 \ Full \, lalu di versi yang saya lihat saya memiliki v 4.5.5 ... TargetVersion disetel pada 4.0.0
Off The Gold


15

Sesuai jawaban CodeTrawler , solusinya adalah memasukkan berikut ini ke dalam jendela explorer:

% systemroot% \ Microsoft.NET \ Framework

Kemudian cari:

Mscorlib.dll

... dan klik kanan / buka tab versi untuk setiap hasil.


Ini tampaknya menjadi cara termudah untuk membedakan antara versi 4 / 4.5+, jika tidak, untuk ikhtisar tentang apa yang diinstal, @ K.Dias jawaban berhasil untuk saya: dir% windir% \ microsoft.net \ framework \ v * / O : -N / B
Timothy Lee Russell

15

Cara Microsoft adalah ini:

MSDN: Cara menentukan mana .NET Framework Versi Apakah Terpasang (yang mengarahkan Anda ke kunci registri berikut: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP\...)

Jika Anda ingin sangat mudah, itu hal lain. Saya tidak akan khawatir tentang xcopy dari folder framework. Jika seseorang melakukan itu saya akan menganggap komputer rusak.

Cara paling mudah adalah dengan menulis program kecil yang menggunakan setiap versi .NET dan pustaka yang Anda pedulikan dan menjalankannya.

Untuk metode tanpa instalasi, PowerBasic adalah alat yang luar biasa. Ini menciptakan sedikit waktu runtime diperlukan exe. Itu bisa mengotomatiskan pemeriksaan yang dijelaskan dalam artikel MS KB di atas.


Metode ini tidak lagi berfungsi untuk versi 4.5.1 dan yang lebih baru
Scott Solmer

@ Okuma.Scott - Saya telah memperbarui tautan ke instruksi resmi MSDN.
kmote


3

Jika mesin yang ingin Anda periksa telah menginstal .NET SDK, Anda dapat menggunakan prompt perintah SDK dan menjalankan program CLRVer.exe.


1
Apakah ada masalah (perizinan) dengan menerapkan hanya yang dapat dieksekusi itu? Itu tidak memiliki ketergantungan untuk dibicarakan.

1
Clrver tidak berguna, karena itu terletak.
Tercantum


1

Penerapan OneTouch akan melakukan semua deteksi dan pemasangan prasyarat. Mungkin yang terbaik adalah menggunakan solusi yang sudah dibuat sebelumnya daripada mencoba membuat sendiri. Mencoba menggulung sendiri dapat menyebabkan masalah karena apa pun yang Anda masukkan dapat berubah dengan perbaikan terbaru atau paket layanan. Mungkin Microsoft memiliki beberapa heuristik untuk menentukan versi apa yang sedang berjalan.



1

Juga, lihat pertanyaan Stack Overflow Bagaimana cara mendeteksi versi .NET Framework dan paket layanan yang diinstal? yang juga menyebutkan:

Ada jawaban resmi Microsoft untuk pertanyaan ini di artikel basis pengetahuan [Cara menentukan versi dan tingkat paket layanan Microsoft .NET Framework yang diinstal] [2]

ID Artikel: 318785 - Ulasan Terakhir: 7 November 2008 - Revisi: 20.1 Cara menentukan versi .NET Framework yang diinstal dan apakah paket layanan telah diterapkan.

Sayangnya, tampaknya tidak berfungsi, karena mscorlib.dllversi di direktori 2.0 memiliki versi 2.0, dan tidak ada mscorlib.dllversi baik di direktori 3.0 atau 3.5 meskipun 3.5 SP1 diinstal ... Mengapa jawaban resmi Microsoft menjadi sangat salah informasi?


1

Untuk menentukan dukungan server Anda untuk .NET Framework 4.5 dan versi yang lebih baru (diuji melalui 4.5.2): Jika Anda tidak memiliki akses Registry di server , tetapi memiliki hak publikasi aplikasi ke server tersebut, buat aplikasi MVC 5 dengan cara yang sepele pengontrol, seperti ini:

using System.Web.Mvc;

namespace DotnetVersionTest.Controllers
{
    public class DefaultController : Controller
    {
        public string Index()
        {
            return "simple .NET version test...";
        }
    }
}

Kemudian di Web.config Anda, telusuri versi .NET Framework yang diinginkan di bagian berikut, ubah targetFrameworknilai sesuai keinginan:

<system.web>
    <customErrors mode="Off"/>
    <compilation debug="true" targetFramework="4.5.2"/>
    <httpRuntime targetFramework="4.5.2"/>
</system.web>

Publikasikan setiap target ke server Anda, lalu telusuri <app deploy URL>/Default. Jika server Anda mendukung kerangka target, maka string sederhana akan ditampilkan dari Pengontrol sepele Anda. Jika tidak, Anda akan menerima pesan kesalahan seperti berikut:

Contoh .NET 4.5.2 yang tidak didukung di server

Jadi dalam kasus ini, server target saya belum mendukung .NET Framework 4.5.2.


1

Untuk mendapatkan versi dotnet yang terinstal,
Buat aplikasi Konsol. Tambahkan kelas ini Jalankan itu

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
}

versi terbaru 4.7.2?
Kiquenet

0

Anehnya, saya menulis beberapa kode untuk melakukan ini kembali ketika 1.1 keluar (apa itu, tujuh tahun yang lalu?) Dan men-tweaknya sedikit ketika 2.0 keluar. Saya tidak melihatnya selama bertahun-tahun karena kami tidak lagi mengelola server kami.

Ini tidak sangat mudah, tetapi saya tetap mempostingnya karena menurut saya itu lucu; karena lebih mudah dilakukan di .NET dan lebih mudah lagi di 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

Nah, seperti kata Dean, Anda bisa melihat registri dan melakukan apa yang dia lakukan. Untuk memeriksa apakah dia benar-benar menginstal CLR .NET Framework, Anda harus mencari MSCorEE.dllfile tersebut di %SystemRoot%\System32direktori.


0

Ini mungkin cara yang buruk untuk mengetahui versi, tetapi saya selalu mendapat kesan bahwa semua versi telah diinstal <root>:\WINDOWS\Microsoft.NET\Framework .

Ini menyediakan folder dengan nama seperti v2.0.50727yang saya percaya memberikan informasi versi yang rinci.


1
Dan itu mungkin cara yang benar tetapi pertanyaan "bagaimana jika?" di kepala saya berkata "bagaimana jika file-file itu ada tetapi Framework tidak benar-benar 'diinstal' dan beberapa admin yang tidak mengerti berpikir bahwa menyalin file-file itu adalah cara untuk melakukannya?"
Tom Kidd

0

Jika Anda ingin mencari versi sebelum .NET 4.5, gunakan kode untuk aplikasi konsol. Seperti ini:

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

Jika tidak, Anda dapat menemukan .NET 4.5 atau yang lebih baru dengan membuat kueri seperti ini:

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");

        }
    }
}

Kemudian hasil konsol akan memberi tahu Anda versi mana yang diinstal dan tersedia untuk digunakan dengan penerapan Anda. Kode ini juga berguna karena Anda memilikinya sebagai solusi tersimpan kapan pun Anda ingin memeriksanya di masa mendatang.


Ngomong-ngomong, Anda mungkin ingin menyetel Utama menjadi pribadi seperti ini: private static void Main (string [] args) {}
Ronnie Petty

Ini adalah cara Microsoft meletakkannya di MSDN. msdn.microsoft.com/en-us/library/hh925568%28v=vs.110%29.aspx
Ronnie Petty

0

Saya masuk ke Pembaruan Windows & melihat riwayat pembaruan, mengetahui tambalan server tetap mutakhir. Saya memindai pembaruan .NET dan itu menunjukkan kepada saya versi mana yang memiliki pembaruan, yang memungkinkan saya untuk menyimpulkan versi mana yang diinstal.


Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.