PowerShell을 사용하여 IP 주소 가져오는 방법

IT 관리자는 PowerShell과 명령 줄을 사용하여 많은 작업을 수행할 수 있습니다. Windows 네트워킹과 관련된 작업도 이에 포함됩니다. 이 튜토리얼에서는 Get-NetIPAddress cmdlet과 WMI를 사용하여 Windows 컴퓨터의 네트워크 어댑터에서 IP 주소를 가져오는 방법을 배우게 될 것입니다.

전제 조건

이 튜토리얼은 Windows PowerShell v5.1이 설치된 Windows 10 이상의 컴퓨터를 기준으로 합니다. 또한 Active Directory 환경에 있다고 가정합니다. 그렇지 않은 경우 New-CimSession cmdlet의 Credential 속성에 대해 알아보십시오.

Get-NetIPAddress 사용하기

파워셸에는 네트워크 연결을 다루는 다양한 cmdlet이 있습니다. 예를 들어 Get-NetAdapter, Get-NetAdapterBinding, 그리고 IP 주소를 찾는 데 사용되는 특정한 하나인 Get-NetIPAddress 등이 있습니다. 파워셸을 사용하여 간단한 스크립트로 IP 주소를 가져오고 싶다면, 이러한 cmdlet을 사용하십시오.

간단하게 유지하세요. 파워셸이 더 간단한 방법을 제공한다면, 그것을 사용하세요!

예를 들어, 로컬 컴퓨터의 모든 네트워크 어댑터에서 IPv4 주소를 찾으려면 단일한 줄을 실행하면 됩니다.

Get-NetIPAddress -AddressFamily IPV4
Finding IPV4 addresses with Get-NetIPAddress

위의 출력은 이더넷 어댑터와 같은 특정 네트워크 어댑터를 참조하고 IP 주소만 반환합니다.

Getting the IP address from a specific adapter

끝났습니다! 단순히 파워셸을 사용하여 IP 주소를 가져오는 것은 간단한 과정입니다. 적어도 다른 수단을 사용하는 것보다 훨씬 더 간단합니다.

파워셸을 좋아하지 않는다면, IP 주소를 가져오기 위해 ipconfig 명령을 사용할 수도 있습니다. ipconfig에 대해 자세히 알아보려면 알아야 할 Ipconfig 명령어를 참조하세요.

CIM/WMI를 사용하는 이유는 무엇인가요?

예를 들어, 원격 Windows 컴퓨터의 운영 체제를 확인하고 싶을 수 있습니다. CIM은 Win32_OperatingSystem 클래스 내의 Caption 속성에 운영 체제 이름을 보관합니다. 이 정보를 얻으려면 아래의 Get-CimInstance cmdlet을 사용하고 컴퓨터 이름(REMOTECOMPUTER), CIM 클래스(Win32_OperatingSystem) 및 객체의 Caption 속성만 참조하도록 지정합니다.

(Get-CimInstance -ComputerName REMOTECOMPUTER -ClassName Win32_OperatingSystem).Caption

Get-CimInstance를 실행하면 PowerShell은 원격 컴퓨터를 찾아 로그인 자격 증명을 전달하고 필요한 정보를 얻기 위해 CIM에 쿼리해야 합니다. 세션 없이 Get-CimInstance을 실행하는 데는 많은 오버헤드가 발생합니다.

서버 인벤토리 스크립트를 작성하고 저장소, 메모리, 네트워킹 등의 정보를 찾으려고 할 때는 어떻게 할까요? 이 경우에는 아래와 같이 Get-CimInstance 명령을 여러 번 사용하게 됩니다.

Get-CimInstance -ComputerName REMOTECOMPUTER -ClassName Win32_LogicalDisk
Get-CimInstance -ComputerName REMOTECOMPUTER -ClassName Win32_OperatingSystem
Get-CimInstance -ComputerName REMOTECOMPUTER -ClassName Win32_PhysicalMemory
Get-CimInstance -ComputerName REMOTECOMPUTER -ClassName Win32_NetworkAdapter

위의 코드 스니펫에서 스크립트는 REMOTECOMPUTER에 네 번 연결됩니다. 그리고 컴퓨터 이름이 변경된다면 어떻게 될까요? 그 컴퓨터 이름을 찾아 바꿔야 하는 번거로움이 생길 것입니다. 코딩 중에 이런 일이 생기는 것은 좋지 않은 조짐입니다.

CIM 세션 생성

세션과 함께 Get-CimInstance를 사용하는 대신, New-CimSession cmdlet을 사용하여 하나의 CIM 세션을 생성하고 그 세션을 반복해서 재사용해야 합니다.

대신에 계속해서 원격 컴퓨터에 인증하는 대신에, New-CimSession을 사용하여 단일 CIM 세션을 생성하고 이 세션을 Get-CimInstance에 전달하세요.

$remoteComputer = 'REMOTECOMPUTER'
$cimSession = New-CimSession -ComputerName $remoteComputer

Get-CimInstance -CimSession $cimSession -ClassName Win32_LogicalDisk
Get-CimInstance -CimSession $cimSession -ClassName Win32_OperatingSystem
Get-CimInstance -CimSession $cimSession -ClassName Win32_PhysicalMemory
Get-CimInstance -CimSession $cimSession -ClassName Win32_NetworkAdapter

세션 사용이 끝나면 연결을 해제하고 메모리에서 제거하세요.

$cimSession | Remove-CimSession

위와 같은 방식으로 CIM 세션을 사용하는 것은 CIM/WMI 작업에 효과적인 방법입니다.

적절한 네트워크 어댑터 찾기

Windows 컴퓨터는 여러 네트워크 어댑터를 가질 수 있기 때문에 먼저 어떤 네트워크 어댑터에서 IP 주소를 가져올지를 좁혀야 합니다. WMI를 사용할 때는 Win32_NetworkAdapterConfiguration 클래스를 사용하세요. 이 클래스는 Get-NetIPAddress가 반환하는 정보의 대부분을 제공합니다.

먼저 원격 컴퓨터의 이름이 포함된 PowerShell 스크립트를 만들고, 새로운 CIM 세션을 생성한 다음 해당 세션 제거 라인을 아래에 추가하세요.

$remoteComputer = 'REMOTECOMPUTER'
$cimSession = New-CimSession -ComputerName $remoteComputer

$cimSession | Remove-CimSession

CIM 세션 코드를 작성한 후 WMI 쿼리를 삽입하세요.

$remoteComputer = 'REMOTECOMPUTER'
$cimSession = New-CimSession -ComputerName $remoteComputer

Get-CimInstance -CimSession $cimSession -ClassName Win32_NetworkAdapterConfiguration

$cimSession | Remove-CimSession
Querying WMI with a CIM session to get network adapter information

기본 출력에서는 IP 주소가 표시되지 않고, 단일 인스턴스를 반환하지 않습니다. 원하는 IP 주소를 가진 인스턴스를 좁히려면 어떻게 해야 할까요?

먼저 Select-Object를 사용하여 모든 속성을 표시하세요.

Get-CimInstance -CimSession $cimSession -ClassName Win32_NetworkAdapterConfiguration | Select-Object -Property *

출력을 스크롤하면 일부 IP 주소가 없는 네트워크 어댑터, 하나의 IP 주소가 있는 어댑터 및 여러 IP 주소가 있는 어댑터를 알 수 있습니다! 이를 제한해야 합니다. 모든 서버에 적용할 수 있는 표준 기준을 찾아야 합니다.

Lots of output from The Win32_NetworkAdapterConfiguration class!

각 어댑터에는 IPEnabled 속성이 있어야합니다. 이 속성이 True로 설정되면 TCP/IP 프로토콜이이 NIC에 바인딩되어 IP 주소를 갖는 선행 조건이됩니다. IPEnabled 속성이 True로 설정된 NIC를 좁히고 찾고있는 어댑터를 얻을 수 있습니다.

WMI 인스턴스를 필터링 할 때는 Get-CimInstanceFilter 매개 변수를 사용하는 것이 좋습니다. PowerShell 커뮤니티에는 항상 “왼쪽으로 필터링하라”는 속담이 있습니다. 기회가 있다면이 말은 항상 출력을 가능한 한 왼쪽으로 필터링하라는 것을 의미합니다.

필요하지 않은 경우 Where-Object를 사용하지 마십시오. 파이프라인을 통해 불필요한 개체를 처리하는 오버헤드가 없기 때문에 성능이 훨씬 빠릅니다.

Get-CimInstanceFilter 매개 변수는 Windows Query Language (WQL)을 사용합니다. WQL은 SQL의 작은 하위 집합입니다. Filter 매개 변수는 SQL이 기대하는 것과 동일한 제약 조건 WHERE 절 구문을 예상합니다.

IPEnabled 속성이 True로 설정된 Win32_NetworkAdapterConfiguration 클래스의 모든 CIM 인스턴스를 찾으려면 SELECT * FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled = 'True' WQL 쿼리를 사용하십시오.

이미 Get-CimInstance에서 ClassName 매개 변수 인수의 클래스 이름을 지정했으므로 Filter에서 IPEnabled = 'True'를 지정해야합니다. 이렇게하면 IP 주소가 있는 네트워크 어댑터만 반환됩니다.

Get-CimInstance -CimSession $cimSession -ClassName Win32_NetworkAdapterConfiguration -Filter "IPEnabled = 'True'" | Select-Object -Property *

위의 코드 스니펫을 실행하면 Get-CimInstance가 단일(또는 제한된 집합) 인스턴스만 반환하는 것을 볼 수 있습니다.

이제 단일 CIM 인스턴스가 있고 찾고 있는 속성인 IPAddress를 알았으니 어떤지 살펴보겠습니다. 이 경우 IPAddress 속성에 대해 세 개의 문자열을 반환하지만 단일 CIM 인스턴스를 반환합니다. 이중 IPV6 주소도 포함됩니다.

(Get-CimInstance -CimSession $cimSession -ClassName Win32_NetworkAdapterConfiguration -Filter "IPEnabled = 'True'").IPAddress

192.168.0.40
fe80::e4e1:c511:e38b:4f05
2607:fcc8:acd9:1f00:e4e1:c511:e38b:4f05

더 많은 요소를 필터링해야 합니다. WQL은 IPAddress 속성 값보다 깊은 수준으로 필터링할 수 없으므로 이제 IPv4 주소를 구문 분석해야 합니다.

IPv4 주소는 일반적으로 배열에서 정의된 첫 번째입니다. 아래와 같이 0 인덱스를 참조하여 해당 주소를 선택하십시오. 이렇게 하면 단일 IPV4 IP 주소 문자열만 반환됩니다.

(Get-CimInstance -CimSession $cimSession -ClassName Win32_NetworkAdapterConfiguration -Filter "IPEnabled = 'True'").IPAddress[0]

192.168.0.40

IPv4 주소가 항상 배열 요소 중 첫 번째인 것은 아닐 수 있습니다. 사실 IPAddress 속성은 배열일 필요가 없습니다. IP 구성은 어댑터 및 다양한 구성에 따라 크게 다릅니다. 필터링하는 데 창의적으로 접근해야 할 수도 있습니다.

결론

컴퓨터에서 IP 주소를 가져오려면 먼저 Get-NetIPAddress cmdlet을 살펴보십시오. 더 큰 스크립트를 작성하거나 어떤 이유로 이 명령을 실행할 수 없는 경우, Get-CimInstance 및 CIM 세션을 사용하여 작업을 수행하는 것을 고려해보십시오.

Source:
https://adamtheautomator.com/powershell-get-ip-address/