프로덕션 Windows Server에 설치된 .NET 버전을 알 수있는 확실한 방법은 무엇입니까?


99

이 질문은 배포와 관련이 있기 때문에 프로그래밍과 많이 관련이 없습니다.

저는 프로덕션 Windows 서버를 유지 관리하고 여기에 코드를 배포하는 일을 맡고있는 회사 그룹과 많은 대화를 나누고 있습니다. 법률 및 규정 준수를 위해 서버에 대한 직접적인 가시성 또는 제어 권한이 없으므로 서버에 설치된 .NET 버전을 알 수있는 유일한 방법은 해당 그룹에 제공하는 지침을 통해서입니다.

지금까지 어떤 버전이 설치되어 있는지 확인하기 위해 생각할 수있는 모든 방법 (1.1 또는 2.0과 일치하는 관리 도구 확인, "프로그램 추가 / 제거"목록의 항목 확인, c : \ Windows \ Microsoft.NET 아래의 디렉토리)에 결함이 있습니다 (관리 도구 아래에 2.0 항목이없는 적어도 하나의 컴퓨터를 본 적이 있습니다.이 방법은 3.0+, "프로그램 추가 / 제거"목록에 대해 아무것도 알려주지 않습니다. 현실과 동기화되지 않을 수 있으며 디렉토리의 존재가 반드시 아무 의미가 없습니다.)

일반적으로 이러한 것들이 미리 준비되어 있다는 것을 알아야한다는 점을 감안할 때 ( "죄송합니다.이 버전에는 필요한 모든 버전과 서비스 팩이 없습니다"라는 사실을 발견하면 짧은 유지 관리 기간에서는 제대로 작동하지 않습니다.) 직접 서버에 액세스 할 수 없기 때문에 "프록시로"확인을 수행합니다. 프로덕션 Windows Server에 설치된 .NET 버전을 알 수있는 확실한 방법은 무엇입니까? 가급적이면 프레임 워크가 설치하는 것을 사용하여이를 수행하는 몇 가지 본질적인 방법은 더 빠르며 어떤 종류의 유틸리티를로드 할 필요가 없으며 프레임 워크가 제대로 설치되지 않았지만 파일이 제자리에있는 경우 확실히 실패하는 방법이기 때문입니다 (예 : , 디렉토리가 있고 gacutil.exe가 여기에 포함되어 있지만 해당 버전의 프레임 워크는 실제로 "설치"되지 않았습니다.)

편집 : 프레임 워크에 내장 된이 작업을 수행 할 수있는 확실한 기본 방법이없는 경우이를 알아낼 수있는 훌륭하고 가볍고 설치가 필요없는 프로그램을 아는 사람이 있습니까? 누군가가 쉽게 쓸 수 있다고 상상할 수 있지만 이미 존재한다면 더 좋을 것입니다.


1
나는 이것을 얼마 전에 조사했고 이것을 할 확실한 방법을 찾지 못했습니다. 우리가 어떤 답을 얻었는지보고 싶습니다.
— Kev

설치된 .NET Framework 버전 및 서비스 팩을 감지하는 방법의 중복 가능성 이 있습니까? -표준 질문 (17 일 더 젊음에도 불구하고).
— Peter Mortensen

답변:


54

이 정보를 찾고있는 서버에서 IE를 열고 다음 사이트로 이동해야합니다. http://www.hanselman.com/smallestdotnet/

그게 전부입니다.

이 사이트에는 브라우저의 "UserAgent"를보고 설치 한 (또는 설치하지 않은) .NET Framework의 버전 (있는 경우)을 파악하고 자동으로 표시하는 스크립트가 있습니다 (선택한 경우 총 크기 계산). .NET Framework 다운로드).


19
-프로덕션 서버 인 경우 액세스 권한이 없을 수도 있습니다.-prod 서버에서 임의의 사이트를 검색하는 것은 큰 일이 아닙니다. 해당 사이트는 가장 높은 .Net 버전 만 제공합니다. 그는 그들 모두를 원합니다
— Franci Penov

1
문제는, 그 접근 방식을 사용하면 현재 가지고있는 최신 버전 만 알려주는 것 같습니다. 2.0, 3.0, 3.5 및 (슬프게도) 1.1에서도 코드를 배포합니다. 목표는 결국 모든 것을 업그레이드하는 것이지만, 현재 슬픈 사실은 모든 다른 병렬 버전이 필요하다는 것입니다.
— Tom Kidd

1
이 솔루션이 프로덕션 서버에 적합하지 않을 수 있다는 데 동의하지만, 개발 시스템에서 가장 간단하고 빠른 방법이기 때문에 추천했습니다 (자주 사용 했음). 현재 버전의 스크립트는 내가 설치 한 모든 다른 버전의 .NET을 성공적으로 감지했습니다.
— kmote

제공된 URL의 사용자 에이전트 문자열 : Mozilla / 5.0 (호환 가능, MSIE 10.0, Windows NT 6.1, WOW64, Trident / 6.0) . Bu-ga-ga, 그렇다면 어떤 .NET Framework 버전이 설치되어 있습니까? 예상되는 결과를 얻으려면 IE를 호환 모드로 전환해야합니다.
— Mosc 2013-04-04

1
Scott Hanselman은 확실히 그의 선의를 확립 했으므로 "랜덤 사이트"라고 부르지 않을 것입니다. (또한 그는 소스 코드를 제공합니다.) 그러나이 앱은 인터넷 연결이 필요합니다.이 앱은 패러데이 케이지에 잠긴 호스트가 자주 부족합니다.
— Robert Calhoun

24

프로그래밍 방식으로 레지스트리 및 이에 따라 몇 가지 다른 사항을 확인할 수 있습니다. 블로그 항목에 .

살펴볼 레지스트리 키는 다음과 같습니다.

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

말할 수 없습니다. 1.1도 포함 되나요?
— Tom Kidd

1
내 시스템의이 레지스트리 키 아래에서 1.1 세부 정보를 볼 수 있으므로 1.1
— Niall Connaughton 2013 년

참에서 찾고 ... \ NDP \ V4 \ 전체 \ 다음에 버전 나는 V 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

13
4.5 및 4.5.1이 4.0 대신 설치되므로이 솔루션은 오해의 소지가 있습니다. msdn.microsoft.com/en-us/library/5a4x27ek%28v=vs.110%29.aspx
— Nick Patsaris 2014

15

당으로 CodeTrawler의 대답 , 솔루션 탐색기 창에 다음을 입력하는 것입니다 :

% systemroot % \ Microsoft.NET \ Framework

그런 다음 검색 :

Mscorlib.dll

... 그리고 각 결과에 대한 버전 탭을 마우스 오른쪽 버튼으로 클릭하거나 이동합니다.


이것은 버전 4 / 4.5 +를 구별하는 가장 쉬운 방법 인 것 같습니다. 그렇지 않으면 설치된 항목에 대한 개요를 보려면 @ K.Dias 대답이 저에게 효과적이었습니다. dir % windir % \ microsoft.net \ framework \ v * / O : -N / B
— Timothy Lee Russell

15

Microsoft 방식은 다음과 같습니다.

MSDN : 설치된 .NET Framework 버전을 확인하는 방법 (다음 레지스트리 키로 이동 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP\...)

완벽한 보안을 원한다면 그것은 또 다른 일입니다. 프레임 워크 폴더의 xcopy에 대해서는 걱정하지 않습니다. 누군가 그렇게했다면 컴퓨터가 고장난 것으로 간주 할 것입니다.

가장 안전한 방법은 각 버전의 .NET과 관심있는 라이브러리를 사용하는 작은 프로그램을 작성하고 실행하는 것입니다.

무 설치 방법의 경우 PowerBasic 은 훌륭한 도구입니다. 런타임이 필요하지 않은 작은 exe를 생성합니다. 위의 MS KB 문서에 설명 된 검사를 자동화 할 수 있습니다.


이 방법은 버전 4.5.1 이상에서 더 이상 작동하지 않습니다
— Scott Solmer 2014

@ Okuma.Scott-공식 MSDN 지침에 대한 링크를 업데이트했습니다.
— kmote 2015


3

확인하려는 시스템에 .NET SDK가 설치되어 있으면 SDK 명령 프롬프트를 사용하여 프로그램을 실행할 수 있습니다 CLRVer.exe.


1
해당 실행 파일 만 배포하는 데 (라이선싱) 문제가 있습니까? 얘기 할 종속성이 없습니다.

1
clrver는 거짓말이기 때문에 쓸모가 없습니다. 그것은 4.0를 말한다 * 4.5 / 4.6.
— 로마 Starkov


1

OneTouch 배포는 전제 조건의 모든 검색 및 설치를 수행합니다. 직접 시도하는 것보다 미리 만들어진 솔루션을 사용하는 것이 가장 좋습니다. 직접 실행하려고하면 문제가 발생할 수 있습니다. 키를 입력하는 것이 핫픽스 나 서비스 팩으로 변경 될 수 있기 때문입니다. Microsoft는 실행중인 버전을 확인하기위한 몇 가지 휴리스틱을 가지고 있습니다.


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 답변이 있습니다 .

문서 ID : 318785-마지막 검토 : 2008 년 11 월 7 일-개정 : 20.1 설치된 .NET Framework 버전과 서비스 팩 적용 여부를 확인하는 방법.

안타깝게도 mscorlib.dll2.0 디렉토리 의 버전이 2.0 버전이고 mscorlib.dll3.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에서 더 쉽고 파워 쉘에서도 더 쉽습니다.

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
그리고 그것은 옳은 방법 일 수 있지만 "만약?" 내 머릿속에 "파일이 있지만 프레임 워크가 실제로 '설치'되지 않았고 어떤 우둔한 관리자가 파일을 복사하는 것이 그 방법이라고 생각하면 어떻게 될까요?"라고 말합니다.
— Tom Kidd

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을 다음과 같이 private으로 설정하고 싶을 수 있습니다 : private static 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.