Programming

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

procodes 2020. 8. 20. 20:21
반응형

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


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

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

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

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

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


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

그게 전부입니다.

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


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

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

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

여기 에서 답을 찾았 습니다 .

설치된 .NET Framework 버전 확인

명령 프롬프트를 열고 아래 명령 줄 중 하나를 복사하여 붙여 넣습니다.

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

또는

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

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

% systemroot % \ Microsoft.NET \ Framework

그런 다음 검색 :

Mscorlib.dll

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


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

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

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

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

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


http://www.asoft.be/prod_netver.html

이 "좋고 가볍고 설치가 필요없는 프로그램"을 사용하십시오.


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


이를 수행하는 방법에 대한 Microsoft의 공식 답변은 KB 문서 318785에 있습니다.


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


.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

나는 마이크로 소프트가 이것보다 더 나은 일을 했어야한다고 생각한다.


또한 스택 오버플로 질문 이 설치된 .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 답변은 다음과 같습니다. 너무 잘못된 정보?


.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를 지원하지 않습니다.


설치된 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
}

이상하게도 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;
}

딘이 말했듯이 레지스트리를보고 그가 한 일을 할 수 있습니다. 그가 실제로 CLR .NET Framework가 설치되어 있는지 확인하려면 디렉토리 에서 MSCorEE.dll파일을 찾아야합니다 %SystemRoot%\System32.


버전을 찾는 것은 아마도 끔찍한 방법 일 것입니다. 그러나 저는 항상 모든 버전이에 설치되어 있다는 인상을 받았습니다 <root>:\WINDOWS\Microsoft.NET\Framework.

This provides folders with names such as v2.0.50727 which I believe give detailed version information.


If you want to find versions prior to .NET 4.5, use code for a console application. Like this:

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

Otherwise you can find .NET 4.5 or later by querying like this:

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

        }
    }
}

Then the console result will tell you which versions are installed and available for use with your deployments. This code come in handy, too because you have them as saved solutions for anytime you want to check it in the future.


I went into Windows Update & looked at the update history, knowing the server patching is kept up-to-date. I scanned down for .NET updates and it showed me exactly which versions had had updates, which allowed me to conclude which versions were installed.


I found this one quite useful. here's the source

여기에 이미지 설명 입력

참고 URL : https://stackoverflow.com/questions/139891/whats-the-foolproof-way-to-tell-which-versions-of-net-are-installed-on-a-pro

반응형