Üretim Windows Sunucusunda hangi .NET sürümlerinin yüklü olduğunu anlamanın kusursuz yolu nedir?


99

Bu soru, dağıtımla ilgili olduğu için programlama ile ilgili değildir.

Kendimi, görevi üretim Windows sunucularımızı korumak ve kodumuzu onlara dağıtmak olan şirketimdeki grupla çok sohbet ederken buluyorum. Yasal ve uyumluluk nedenlerinden ötürü, sunucular üzerinde doğrudan görünürlüğüm veya herhangi bir kontrole sahip değilim, bu nedenle herhangi birinde .NET'in hangi sürümlerinin yüklü olduğunu anlamamın tek yolu, o gruba verdiğim yönergelerdir.

Şimdiye kadar, hangi sürümlerin yüklü olduğunu söylemek için düşünebildiğim tüm yöntemler (1.1 veya 2.0 ile eşleşen Yönetimsel Araçlar'ı kontrol edin, "Program Ekle / Kaldır" listesindeki girişleri kontrol edin, c: \ Windows \ Microsoft.NET altındaki dizinler kusurlu (Yönetimsel Araçlar altında 2.0 girişi olan ancak 2.0 girişi olmayan en az bir makine gördüm - ve bu yöntem size 3.0+, "Program Ekle / Kaldır" listesi hakkında hiçbir şey söylemiyor gerçeklikle senkronize olamayabilir ve dizinlerin varlığı ille de bir şey ifade etmez).

Genelde bu şeylerin yerinde olduğunu bilmem gerektiğine göre ("oops, bunun ihtiyacınız olan tüm sürümlere ve hizmet paketlerine sahip olmadığını" keşfetmek, kısa bakım aralıklarında pek işe yaramıyor) ve bunu yapmak zorundayım doğrudan sunuculara erişemediğim için "proxy ile" kontrolünü yapın, .NET'in hangi sürümlerinin bir üretim Windows Sunucusunda yüklü olduğunu anlamanın kusursuz yolu nedir? Tercihen, daha hızlı olacağı ve yüklenecek bir tür yardımcı programa ihtiyaç duymayacağı için çerçevenin yüklediğini kullanarak bunu yapmanın bazı içsel bir yolu ve ayrıca çerçeveler düzgün bir şekilde kurulmadıysa ancak hala yerinde dosyalar varsa kesinlikle başarısız olacak bir yöntem (örn. , bir dizin var ve gacutil.exe oraya giriyor ancak çerçevenin bu sürümü gerçekten "kurulu" değil)

DÜZENLEME: Çerçeve (ler) de yerleşik olarak bunu yapmanın kusursuz bir içsel yolunun yokluğunda, bunu bulabilecek iyi, hafif, kurulum gerektirmeyen bir program bilen var mı? Birinin kolayca yazabileceğini hayal edebiliyorum ama eğer zaten varsa, bu daha da iyi olurdu.


1
Bunu bir süre önce araştırdım ve bunu yapmanın kesin bir yolunu bulamadım. Hangi cevapları aldığımızı görmek isterim.
Kev

Yanıtlar:


54

Bu bilgiyi aradığınız sunucuda IE'yi açmalı ve şu siteye gitmelisiniz: http://www.hanselman.com/smallestdotnet/

Tüm gereken bu.

Sitede, tarayıcınızın "UserAgent" ı arayan ve yüklü olan (veya olmayan) .NET Framework sürümünü (varsa) belirleyen ve otomatik olarak görüntüleyen (ardından seçerseniz toplam boyutu hesaplayan) bir komut dosyası vardır. .NET Framework'ü indirmek için).


19
- bir üretim sunucusuysa, ona erişimi bile olmayabilir - üretim sunucusunda rastgele sitelere göz atmak büyük bir hayırdır - bu site yalnızca en yüksek .Net sürümünü verir; hepsini istiyor
Franci Penov

1
Görünüşe göre sorun, bu yaklaşımla size yalnızca en son sürüme sahip olduğunuzu söylemesi. 2.0, 3.0, 3.5 ve (ne yazık ki) 1.1'de bile kod dağıtıyorum. Amaç, her şeyi eninde sonunda yükseltmek olsa da, şimdilik üzücü olan, tüm farklı paralel sürümlere ihtiyacım olması.
Tom Kidd

1
Bu çözümün üretim sunucuları için uygun olmayabileceği konusunda hemfikir olsam da, onu destekledim çünkü kesinlikle geliştirme makineleri için en basit ve en hızlı yöntem (bunu sıklıkla kullandım). Komut dosyasının geçerli sürümü, yüklediğim tüm farklı .NET sürümlerini başarıyla algıladı.
kmote

Sağlanan URL'den Kullanıcı Aracısı dizesi: Mozilla / 5.0 (uyumlu; MSIE 10.0; Windows NT 6.1; WOW64; Trident / 6.0) . Bu-ga-ga, peki hangi .NET Framework sürümleri yüklü? Beklenen sonucu elde etmek için IE'yi uyumlu moda geçirmeniz gerekir.
Mosc

1
Scott Hanselman kesinlikle iyi niyetini ortaya koydu, bu yüzden ona "rastgele site" demeyeceğim. (Ayrıca, kaynak kodunu da kullanılabilir hale getirir.) Ancak bu uygulama, bir Faraday kafesi içinde kilitli ana bilgisayarlarda sıklıkla bulunmayan bir İnternet bağlantısı gerektirir.
Robert Calhoun

24

Bu blog girişine göre kayıt defterini ve diğer birkaç şeyi programlı olarak kontrol edebilirsiniz. .

Bakılacak kayıt defteri anahtarı

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

Söyleyemem - bu da 1.1'i kapsıyor mu?
Tom Kidd

1
Sistemimde bu kayıt defteri anahtarının altında 1.1 ayrıntıları görebiliyorum, bu yüzden 1.1'i kapsadığını söyleyebilirim
Niall Connaughton

Evet, ... \ NDP \ v4 \ Full \ altına baktığımda, sürümde 4.5.5 v'ye sahip olduğumu görebiliyordum ... TargetVersion 4.0.0 olarak ayarlandı
Off The Gold

19

Buradan cevap bulundu :

Hangi .NET Framework sürümünün yüklü olduğunu kontrol edin

Komut İstemi'ni açın ve aşağıdaki komut satırlarından birini kopyalayıp yapıştırın

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

veya

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

Tam olarak ihtiyacım olan şey
PandaWood

13
4.0 yerine 4.5 ve 4.5.1 yüklenir, bu nedenle bu çözüm yanıltıcı olabilir. msdn.microsoft.com/en-us/library/5a4x27ek%28v=vs.110%29.aspx
Nick Patsaris

15

Gereğince CodeTrawler cevabı , çözelti bir tarayıcı penceresinden içine aşağıdaki girmektir:

% systemroot% \ Microsoft.NET \ Framework

Ardından şunu arayın:

Mscorlib.dll

... ve her sonuç için sağ tıklayın / sürüm sekmesine gidin.


Bu, sürüm 4 / 4.5+ arasında ayrım yapmanın en kolay yolu gibi görünüyor, aksi takdirde, neyin yüklü olduğuna genel bir bakış için @ K.Dias yanıtı benim için çalıştı: dir% windir% \ microsoft.net \ framework \ v * / O : -N / B
Timothy Lee Russell

15

Microsoft'un yolu şudur:

MSDN: Hangi .NET Framework Sürümlerinin Yüklendiğini belirleme (sizi aşağıdaki kayıt defteri anahtarına yönlendirir:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP\... )

Kusursuz istiyorsanız, bu başka bir şey. Çerçeve klasörünün xcopy'i hakkında endişelenmem. Biri bunu yapsaydı, bilgisayarın bozuk olduğunu düşünürdüm.

En kusursuz yol, her .NET sürümünü ve ilgilendiğiniz kitaplıkları kullanan küçük bir program yazmak ve bunları çalıştırmaktır.

Kurulum gerektirmeyen bir yöntem için, PowerBasic mükemmel bir araçtır. Küçük çalışma zamanı gerektirmeyen exe oluşturur. Yukarıdaki MS KB makalesinde açıklanan kontrolleri otomatikleştirebilir.


Bu yöntem artık 4.5.1 ve sonraki sürümler için
çalışmıyor

@ Okuma.Scott - Resmi MSDN talimatlarının bağlantısını güncelledim.
kmote


3

Kontrol etmek istediğiniz makinede .NET SDK kurulu ise, bir SDK komut istemi kullanabilir ve programı çalıştırabilirsiniz CLRVer.exe.


1
Yalnızca bu yürütülebilir dosyanın dağıtımıyla ilgili herhangi bir (lisanslama) sorunu var mı? Bahsedilecek herhangi bir bağımlılığı yok.

1
clrver işe yaramaz çünkü yalan söylüyor. 4.5 / 4.6 için 4.0. *
Yazıyor


1

OneTouch dağıtımı, ön koşulların tüm tespitini ve kurulumunu gerçekleştirecektir. Muhtemelen önceden hazırlanmış bir çözümle gitmek, kendi çözümünüzü almaya çalışmaktan daha iyidir. Kendinizinkini atmaya çalışmak sorunlara yol açabilir çünkü tuşladığınız her şey bir düzeltme veya hizmet paketiyle değişebilir. Muhtemelen Microsoft'un hangi sürümün çalıştığını belirlemek için bazı buluşsal yöntemleri vardır.



1

Ayrıca, Yığın Taşması sorusuna bakın. Hangi .NET Framework sürümlerinin ve hizmet paketlerinin yüklü olduğu nasıl tespit edilir? bu da şundan bahseder:

Bilgi bankası makalesinde [Microsoft .NET Framework'ün hangi sürümlerinin ve hizmet paketi düzeylerinin yüklü olduğu nasıl belirlenir] [2] başlıklı bilgi bankasında bu soruya resmi bir Microsoft cevabı bulunmaktadır.

Makale Kimliği: 318785 - Son Gözden Geçirme: 7 Kasım 2008 - Revizyon: 20.1 Hangi .NET Framework sürümlerinin yüklü olduğu ve hizmet paketlerinin uygulanıp uygulanmadığı nasıl belirlenir.

Ne yazık ki işe yaramıyor, çünkü mscorlib.dll2.0 dizinindeki sürüm 2.0 sürümüne sahip ve mscorlib.dll3.5 SP1 yüklü olmasına rağmen 3.0 veya 3.5 dizinlerinde sürüm yok ... Neden resmi Microsoft yanıtı? çok yanlış bilgilendirilmiş?


1

Sunucunuzun .NET Framework 4.5 ve sonraki sürümler için desteğini belirlemek için (4.5.2 ile test edilmiştir): Sunucuda Kayıt Defteri erişiminiz yoksa , ancak bu sunucu için uygulama yayınlama haklarınız varsa, önemsiz bir MVC 5 uygulaması oluşturun. denetleyici, bunun gibi:

using System.Web.Mvc;

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

Ardından, Web.config dosyanızda, aşağıdaki bölümde istediğiniz .NET Framework sürümlerini inceleyin ve targetFrameworkdeğerleri istediğiniz gibi değiştirin :

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

Her hedefi sunucunuzda yayınlayın, ardından göz atın <app deploy URL>/Default. Sunucunuz hedef çerçeveyi destekliyorsa, önemsiz Denetleyicinizden basit dize görüntülenecektir. Değilse, aşağıdaki gibi bir hata alırsınız:

Sunucuda desteklenmeyen .NET 4.5.2 örneği

Yani bu durumda, hedef sunucum henüz .NET Framework 4.5.2'yi desteklemiyor.


1

Yüklü dotnet sürümünü edinmek için
Bir Konsol uygulaması oluşturun. Bu sınıfı ekle Çalıştır şunu

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
}

en son sürüm 4.7.2?
Kiquenet

0

Garip bir şekilde, 1.1 çıktığında bunu yapmak için bazı kodlar yazdım (yedi yıl önce neydi?) Ve 2.0 çıktığında biraz değiştirdim. Artık sunucularımızı yönetmediğimiz için yıllardır bakmadım.

Kusursuz değil, ama yine de gönderiyorum çünkü komik buluyorum; .NET'te yapmak daha kolay ve güç kabuğunda daha da kolaydır.

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

Dean'in dediği gibi, kayıt defterine bakabilir ve onun yaptığını yapabilirsiniz. Gerçekten CLR .NET Framework'ün kurulu olup olmadığını kontrol etmek için MSCorEE.dll, %SystemRoot%\System32dizindeki dosyayı aramalısınız.


0

Muhtemelen sürümleri bulmanın kötü bir yolu, ancak her zaman tüm sürümlerin <root>:\WINDOWS\Microsoft.NET\Framework .

Bu, klasörlere v2.0.50727ayrıntılı sürüm bilgisi verdiğine inandığım adlar sağlar .


1
Ve bu doğru yol olabilir ama "ya eğer?" kafamda "ya dosyalar oradaysa, ancak Çerçeve gerçekten 'yüklenmemişse ve bazı bilgisiz yönetici dosyaları kopyalamanın bunu yapmanın yolu olduğunu düşünürse?"
Tom Kidd

0

.NET 4.5'ten önceki sürümleri bulmak istiyorsanız, bir konsol uygulaması için kod kullanın. Bunun gibi:

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

Aksi takdirde, aşağıdaki gibi sorgulama yaparak .NET 4.5 veya sonrasını bulabilirsiniz:

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

        }
    }
}

Ardından konsol sonucu, hangi sürümlerin kurulu olduğunu ve dağıtımlarınızla birlikte kullanılabileceğini size söyleyecektir. Bu kod da kullanışlıdır, çünkü bunları gelecekte kontrol etmek istediğiniz herhangi bir zamanda kaydedilmiş çözümler olarak alırsınız.


Bu arada, Main'i şu şekilde özel olarak ayarlamak isteyebilirsiniz: private static void Main (string [] args) {}
Ronnie Petty

Bu hemen hemen Microsoft'un MSDN'de ortaya koyduğu şekildedir. msdn.microsoft.com/en-us/library/hh925568%28v=vs.110%29.aspx
Ronnie Petty

0

Windows Update'e girdim ve sunucu yamasının güncel tutulduğunu bilerek güncelleme geçmişine baktım. .NET güncellemelerini taradım ve bana tam olarak hangi sürümlerin güncellemeleri olduğunu gösterdi, bu da hangi sürümlerin yüklü olduğuna karar vermeme izin verdi.


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.