Cách dễ hiểu để biết (các) phiên bản .NET nào được cài đặt trên Windows Server sản xuất?


99

Câu hỏi này không liên quan nhiều đến lập trình vì nó liên quan đến triển khai.

Tôi thấy mình đã trò chuyện rất nhiều với nhóm trong công ty của tôi, những người có công việc là duy trì các máy chủ Windows sản xuất và triển khai mã của chúng tôi trên chúng. Vì lý do pháp lý và tuân thủ, tôi không có khả năng hiển thị trực tiếp hoặc bất kỳ quyền kiểm soát nào đối với các máy chủ nên cách duy nhất tôi có thể biết (các) phiên bản .NET nào được cài đặt trên bất kỳ phiên bản nào trong số chúng là thông qua các hướng dẫn mà tôi đưa ra cho nhóm đó.

Cho đến nay, tất cả các phương pháp tôi có thể nghĩ ra để biết (các) phiên bản nào đã được cài đặt (kiểm tra xem Công cụ quản trị có khớp với 1.1 hoặc 2.0 hay không, kiểm tra các mục nhập trong danh sách "Thêm / Xóa chương trình", kiểm tra sự tồn tại của thư mục trong c: \ Windows \ Microsoft.NET) bị thiếu sót (tôi đã thấy ít nhất một máy có 2.0 nhưng không có mục nhập 2.0 nào trong Công cụ quản trị - và phương pháp đó không cho bạn biết gì về 3.0+, danh sách "Thêm / Xóa chương trình" có thể không đồng bộ với thực tế và sự tồn tại của các thư mục không nhất thiết có ý nghĩa).

Vì tôi thường cần biết trước những điều này (phát hiện ra rằng "rất tiếc, cái này không có tất cả các phiên bản và gói dịch vụ bạn cần" không thực sự hoạt động tốt với các cửa sổ bảo trì ngắn) và tôi phải thực hiện kiểm tra "bằng proxy" vì tôi không thể truy cập trực tiếp vào máy chủ, cách dễ hiểu để biết (các) phiên bản .NET nào được cài đặt trên Windows Server sản xuất? Tốt hơn là một số cách nội tại để làm như vậy bằng cách sử dụng những gì mà khung công tác cài đặt vì nó sẽ nhanh hơn và không cần một số loại tiện ích được tải và cũng là một phương pháp chắc chắn sẽ thất bại nếu các khung công tác không được cài đặt đúng cách nhưng vẫn có tệp tại chỗ (tức là , có một thư mục và gacutil.exe được tạo ở đó nhưng phiên bản khung đó chưa thực sự được "cài đặt")

CHỈNH SỬA: Trong trường hợp không có một cách nội tại tốt để thực hiện điều này được tích hợp trong (các) Framework, có ai biết về một chương trình tốt, nhẹ, không cần cài đặt có thể tìm ra điều này không? Tôi có thể tưởng tượng ai đó có thể dễ dàng viết một cái nhưng nếu một cái đã tồn tại, điều đó sẽ còn tốt hơn.


1
Tôi đã xem xét điều này một thời gian trở lại và không thể tìm thấy một cách dứt khoát để làm điều này. Tôi muốn xem chúng tôi nhận được câu trả lời nào.
Kev 26-08

Có thể trùng lặp Làm cách nào để phát hiện phiên bản .NET Framework và gói dịch vụ nào được cài đặt? - câu hỏi kinh điển (mặc dù nó còn trẻ hơn 17 ngày).
Peter Mortensen

Câu trả lời:


54

Bạn nên mở IE trên máy chủ mà bạn đang tìm kiếm thông tin này và truy cập trang web này: http://www.hanselman.com/smallestdotnet/

Đó là tất cả những gì nó cần.

Trang web có một tập lệnh trông "UserAgent" của trình duyệt của bạn và tìm ra phiên bản (nếu có) của .NET Framework mà bạn đã cài đặt (hoặc chưa có) và hiển thị nó tự động (sau đó tính tổng kích thước nếu bạn đã chọn để tải xuống .NET Framework).


19
- nếu đó là một máy chủ sản xuất, anh ta thậm chí có thể không có quyền truy cập vào nó - duyệt các trang web ngẫu nhiên trên máy chủ sản xuất là một điều tuyệt vời - trang web đó chỉ cung cấp phiên bản .Net cao nhất; ông muốn tất cả trong số họ
Franci Penov

1
Có vẻ như vấn đề với cách tiếp cận đó là nó chỉ cho bạn biết phiên bản mới nhất mà bạn có là gì. Tôi triển khai mã trong 2.0, 3.0, 3.5 và (đáng buồn là) thậm chí 1.1. Mặc dù mục tiêu cuối cùng là nâng cấp mọi thứ, nhưng thực tế đáng buồn là tôi cần tất cả các phiên bản song song khác nhau.
Tom Kidd

1
Mặc dù tôi đồng ý rằng giải pháp này có thể không phù hợp với các máy chủ sản xuất, nhưng tôi đã ủng hộ nó vì nó chắc chắn là phương pháp đơn giản và nhanh nhất cho các máy phát triển (mà tôi đã sử dụng nó thường xuyên). Phiên bản hiện tại của tập lệnh đã phát hiện thành công tất cả các phiên bản .NET khác nhau mà tôi đã cài đặt.
kmote

Chuỗi Tác nhân Người dùng từ URL được cung cấp: Mozilla / 5.0 (tương thích; MSIE 10.0; Windows NT 6.1; WOW64; Trident / 6.0) . Bu-ga-ga, vậy, những phiên bản .NET Framework nào được cài đặt? Để đạt được kết quả mong đợi, cần chuyển IE sang chế độ tương thích.
Mosc

1
Scott Hanselman chắc chắn đã thiết lập thành quả của mình nên tôi sẽ không gọi nó là "trang web ngẫu nhiên". (Thêm vào đó, anh ấy cung cấp mã nguồn.) Nhưng ứng dụng này yêu cầu kết nối Internet, điều mà các máy chủ bị khóa trong lồng Faraday thường thiếu.
Robert Calhoun

24

Bạn có thể lập trình kiểm tra sổ đăng ký và một số thứ khác theo mục nhập blog này .

Khóa đăng ký cần xem là

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

Tôi không thể nói - điều này cũng bao gồm 1.1?
Tom Kidd

1
Tôi có thể thấy 1.1 chi tiết dưới khóa registry này trên hệ thống của tôi, vì vậy tôi muốn nói nó che 1.1
Niall Connaughton

Yea, nhìn dưới ... \ NDP \ v4 \ Full \, sau đó trong phiên bản tôi có thể thấy tôi đã v 4.5.5 ... Các TargetVersion được đặt ở 4.0.0
Off The Vàng

19

Tìm thấy câu trả lời từ đây :

Kiểm tra phiên bản .NET Framework nào được cài đặt

Mở Command Prompt và sao chép, dán một trong các dòng lệnh dưới đây

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

hoặc là

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

Chính xác những gì tôi cần
PandaWood

13
4.5 và 4.5.1 được cài đặt thay cho 4.0, vì vậy giải pháp này có thể gây hiểu nhầm. msdn.microsoft.com/en-us/library/5a4x27ek%28v=vs.110%29.aspx
Nick Patsaris

15

Theo câu trả lời của CodeTrawler , giải pháp là nhập thông tin sau vào cửa sổ trình thám hiểm:

% systemroot% \ Microsoft.NET \ Framework

Sau đó, tìm kiếm:

Mscorlib.dll

... và nhấp chuột phải / chuyển đến tab phiên bản cho mỗi kết quả.


Đây có vẻ là cách dễ nhất để phân biệt giữa phiên bản 4 / 4.5+, nếu không, để biết tổng quan về những gì được cài đặt, câu trả lời @ K.Dias đã làm việc cho tôi: dir% windir% \ microsoft.net \ framework \ v * / O : -N / B
Timothy Lee Russell.

15

Cách của Microsoft là:

MSDN: Cách xác định Phiên bản .NET Framework nào được cài đặt (hướng bạn đến khóa đăng ký sau:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP\... :)

Nếu bạn muốn an toàn thì đó là một điều khác. Tôi sẽ không lo lắng về một xcopy của thư mục khung. Nếu ai đó làm điều đó tôi sẽ coi như máy tính bị hỏng.

Cách dễ hiểu nhất là viết một chương trình nhỏ sử dụng từng phiên bản .NET và các thư viện mà bạn quan tâm và chạy chúng.

Đối với phương pháp không cần cài đặt, PowerBasic là một công cụ tuyệt vời. Nó tạo ra một exe nhỏ không cần thời gian chạy. Nó có thể tự động hóa các kiểm tra được mô tả trong bài viết MS KB ở trên.


Phương pháp này không còn hoạt động cho phiên bản 4.5.1 và lên
Scott Solmer

@ Okuma.Scott - Tôi đã cập nhật liên kết đến hướng dẫn MSDN chính thức.
kmote


3

Nếu máy bạn muốn kiểm tra đã cài đặt .NET SDK, bạn có thể sử dụng dấu nhắc lệnh SDK và chạy chương trình CLRVer.exe.


1
Có bất kỳ vấn đề (cấp phép) nào với việc triển khai chỉ tệp thực thi đó không? Nó không có bất kỳ phụ thuộc nào để nói về.

1
clrver là vô ích, bởi vì nó nói dối. Nó cho biết 4.0. * Cho 4.5 / 4.6
Roman Starkov


1

Việc triển khai OneTouch sẽ thực hiện tất cả việc phát hiện và cài đặt các điều kiện tiên quyết. Có lẽ tốt nhất là bạn nên sử dụng một giải pháp được tạo sẵn hơn là cố gắng hoàn thành giải pháp của riêng bạn. Việc cố gắng tự triển khai có thể dẫn đến sự cố vì bất kỳ thứ gì bạn nhập vào đều có thể thay đổi với một hotfix hoặc gói dịch vụ. Có thể Microsoft có một số kinh nghiệm để xác định phiên bản nào đang chạy.



1

Ngoài ra, hãy xem câu hỏi Stack Overflow Cách phát hiện phiên bản .NET Framework và gói dịch vụ nào được cài đặt? cũng đề cập đến:

Có câu trả lời chính thức của Microsoft cho câu hỏi này tại bài viết cơ sở kiến ​​thức [Cách xác định phiên bản và mức gói dịch vụ của Microsoft .NET Framework được cài đặt] [2]

ID bài viết: 318785 - Xem lại lần cuối: ngày 7 tháng 11 năm 2008 - Bản sửa đổi: 20.1 Cách xác định phiên bản .NET Framework đã được cài đặt và gói dịch vụ đã được áp dụng chưa.

Thật không may, nó dường như không hoạt động, vì mscorlib.dllphiên bản trong thư mục 2.0 có phiên bản 2.0 và không có mscorlib.dllphiên bản nào trong thư mục 3.0 hoặc 3.5 mặc dù 3.5 SP1 đã được cài đặt ... Tại sao câu trả lời chính thức của Microsoft lại là thông tin sai lệch như vậy?


1

Để xác định sự hỗ trợ của máy chủ của bạn cho .NET Framework 4.5 và các phiên bản mới hơn (được thử nghiệm đến hết 4.5.2): Nếu bạn không có quyền truy cập Sổ đăng ký trên máy chủ , nhưng có quyền xuất bản ứng dụng lên máy chủ đó, hãy tạo ứng dụng MVC 5 với một bộ điều khiển, như thế này:

using System.Web.Mvc;

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

Sau đó, trong Web.config của bạn, xem qua các phiên bản .NET Framework mong muốn trong phần sau, thay đổi các targetFrameworkgiá trị như mong muốn:

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

Xuất bản từng mục tiêu lên máy chủ của bạn, sau đó duyệt đến <app deploy URL>/Default. Nếu máy chủ của bạn hỗ trợ khung đích, thì chuỗi đơn giản sẽ hiển thị từ Bộ điều khiển tầm thường của bạn. Nếu không, bạn sẽ nhận được lỗi như sau:

Ví dụ về .NET 4.5.2 không được hỗ trợ trên máy chủ

Vì vậy, trong trường hợp này, máy chủ mục tiêu của tôi chưa hỗ trợ .NET Framework 4.5.2.


1

Để tải phiên bản dotnet đã cài đặt, hãy
tạo ứng dụng Bảng điều khiển. Thêm lớp này Chạy cái đó

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
}

phiên bản mới nhất 4.7.2?
Kiquenet 19/02/19

0

Thật kỳ lạ, tôi đã viết một số mã để làm điều này khi 1.1 ra mắt (đó là gì, bảy năm trước?) Và chỉnh sửa một chút khi 2.0 ra mắt. Tôi đã không xem xét nó trong nhiều năm vì chúng tôi không còn quản lý máy chủ của mình nữa.

Nó không phải là ngu ngốc, nhưng tôi vẫn đăng nó vì tôi thấy nó hài hước; trong đó nó dễ thực hiện hơn trong .NET và vẫn dễ dàng hơn trong 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

Vâng, như Dean đã nói, bạn có thể nhìn vào sổ đăng ký và làm những gì anh ấy đã làm. Để kiểm tra xem anh ta có thực sự đã cài đặt CLR .NET Framework hay không, bạn nên tìm MSCorEE.dlltệp trong %SystemRoot%\System32thư mục.


0

Nó có lẽ là một cách khó chịu để tìm ra các phiên bản, nhưng tôi luôn có ấn tượng rằng tất cả các phiên bản đã được cài đặt <root>:\WINDOWS\Microsoft.NET\Framework.

Điều này cung cấp các thư mục với tên v2.0.50727mà tôi tin rằng cung cấp thông tin chi tiết về phiên bản.


1
Và đó có thể là cách đúng đắn nhưng "điều gì sẽ xảy ra nếu?" trong đầu tôi nói rằng "điều gì sẽ xảy ra nếu các tệp ở đó nhưng Framework không thực sự được 'cài đặt' và một số quản trị viên không biết gì về việc sao chép các tệp qua là cách để làm điều đó?"
Tom Kidd

0

Nếu bạn muốn tìm các phiên bản trước .NET 4.5, hãy sử dụng mã cho ứng dụng bảng điều khiển. Như thế này:

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

Nếu không, bạn có thể tìm thấy .NET 4.5 trở lên bằng cách truy vấn như sau:

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

        }
    }
}

Sau đó, kết quả bảng điều khiển sẽ cho bạn biết phiên bản nào đã được cài đặt và có sẵn để sử dụng với các triển khai của bạn. Mã này cũng rất hữu ích vì bạn có chúng dưới dạng các giải pháp đã lưu cho bất kỳ lúc nào bạn muốn kiểm tra trong tương lai.


Bằng cách này bạn có thể muốn thiết lập chính để tin như thế này: private static void Main (string [] args) {}
Ronnie Petty

Đây là cách mà Microsoft đã trình bày trên MSDN. msdn.microsoft.com/en-us/library/hh925568%28v=vs.110%29.aspx
Ronnie Petty

0

Tôi đã truy cập Windows Update và xem lịch sử cập nhật, biết rằng bản vá máy chủ được cập nhật. Tôi đã quét các bản cập nhật .NET và nó cho tôi biết chính xác phiên bản nào đã có bản cập nhật, cho phép tôi kết luận phiên bản nào đã được cài đặt.


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.