본문 바로가기

C#

C# Environment 클래스 활용해 시스템 정보 가져오기

Environment 클래스는 운영체제, 프로세스, 사용자, 경로 같은 런타임 정보를 손쉽게 가져올 수 있는 표준 API입니다. 크로스 플랫폼(.NET)에서 안전하게 시스템 정보를 얻고, 설정을 환경 변수로 관리할 때 유용합니다.

1. 핵심 시스템 정보 한 번에 출력하기

대표 속성만으로도 실무에서 필요한 기본 정보를 빠르게 확인할 수 있습니다.

using System;
using System.Collections;

class Program
{
    static void Main()
    {
        Console.WriteLine("=== 시스템/프로세스 정보 ===");
        Console.WriteLine($"OS: {Environment.OSVersion}");
        Console.WriteLine($".NET CLR: {Environment.Version}");
        Console.WriteLine($"머신 이름: {Environment.MachineName}");
        Console.WriteLine($"사용자: {Environment.UserDomainName}\\{Environment.UserName}");
        Console.WriteLine($"64비트 OS: {Environment.Is64BitOperatingSystem}");
        Console.WriteLine($"64비트 프로세스: {Environment.Is64BitProcess}");
        Console.WriteLine($"CPU 논리 코어: {Environment.ProcessorCount}");
        Console.WriteLine($"현재 디렉터리: {Environment.CurrentDirectory}");
        Console.WriteLine($"System 폴더: {Environment.GetFolderPath(Environment.SpecialFolder.System)}");
        Console.WriteLine($"ProgramFiles: {Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles)}");
        Console.WriteLine($"Desktop: {Environment.GetFolderPath(Environment.SpecialFolder.Desktop)}");
        Console.WriteLine($"TEMP: {Environment.GetEnvironmentVariable("TEMP") ?? Environment.GetEnvironmentVariable("TMP")}");
        Console.WriteLine($"작업 셋(메모리): {Environment.WorkingSet:n0} bytes");
        var uptime = TimeSpan.FromMilliseconds(Environment.TickCount);
        Console.WriteLine($"업타임: {uptime}");

        Console.WriteLine("\n=== 대표 환경 변수 일부 ===");
        foreach (DictionaryEntry item in Environment.GetEnvironmentVariables())
        {
            var key = item.Key?.ToString();
            if (key == "PATH" || key == "HOME" || key == "USERPROFILE" || key == "SHELL")
            {
                Console.WriteLine($"{key} = {item.Value}");
            }
        }
    }
}

2. 폴더/경로는 SpecialFolder로 가져오기

하드코딩 대신 SpecialFolder를 사용하면 OS별 차이를 안전하게 처리합니다.

string system = Environment.GetFolderPath(Environment.SpecialFolder.System);
string desktop = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);
string temp = Environment.GetEnvironmentVariable("TEMP") 
             ?? Environment.GetEnvironmentVariable("TMP") 
             ?? System.IO.Path.GetTempPath();
Console.WriteLine(system);
Console.WriteLine(desktop);
Console.WriteLine(temp);

3. 환경 변수 읽기/설정 팁

배포 환경에 따라 설정을 다르게 가져오려면 환경 변수를 활용합니다. 머신/사용자/프로세스 단위로 제어할 수 있습니다.

// 읽기
string path = Environment.GetEnvironmentVariable("PATH");
foreach (System.Collections.DictionaryEntry kv in Environment.GetEnvironmentVariables())
{
    Console.WriteLine($"{kv.Key} = {kv.Value}");
}

// 설정 (프로세스 범위 권장: 외부 시스템 영향 최소화)
Environment.SetEnvironmentVariable("MY_APP_MODE", "dev", EnvironmentVariableTarget.Process);

4. 크로스 플랫폼/성능 체크포인트

- OSVersion은 운영체제 정보를 제공합니다. 세부 아키텍처가 필요하면 RuntimeInformation을 병행하는 것이 좋습니다.

- SpecialFolder는 Windows/Linux/macOS에서 각자의 표준 위치로 매핑됩니다. 하드코딩 경로는 지양합니다.

- TickCount는 25일 후 음수로 롤오버될 수 있습니다. 최신 런타임에서는 TickCount64 사용을 고려합니다.

- 환경 변수는 존재하지 않을 수 있으니 null 체크와 기본값을 준비합니다.

- 보안 환경(서비스, 컨테이너)에서는 사용자/도메인 정보가 제한될 수 있습니다. 예외 대비 로깅을 최소화하고 민감 정보 출력에 주의합니다.

5. 활용 시나리오

- 시작 시 시스템 진단 로그 출력, 버그 리포트에 첨부합니다.

- Temp/데스크톱/프로그램 폴더 경로를 안전하게 탐색합니다.

- 환경 변수로 운영 모드(dev/stage/prod)와 엔드포인트를 주입합니다.