프로덕션 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.