Hey, Scripting Guy!물론 연결할 수 있습니다.

Microsoft Scripting Guys

이 칼럼은 Windows Vista의 시험판 버전을 기준으로 작성되었으며 수록된 일부 정보는 변경될 수 있습니다.

이 기사의 코드 다운로드: ScriptingGuys2006_11.exe (151KB)

아마도 이미 알고 있겠지만 자신의 능력을 키우는 가장 좋은 방법 중 하나는 네트워크를 구축하는 것입니다. 즉, 업계 내의 다른 사람들과 교류하면서 이러한 사람들을 통해 배우고, 정보를 공유하고, 새로운 직장을 얻을 수도 있습니다. Scripting Guy는 인적 네트워킹에 대해서는 잘 알지 못하지만 컴퓨터 네트워킹에 대해서는 한두 가지 알고 있기 때문에 스크립트를 통한 수많은 네트워킹 작업을 수행하는 데 많은 도움을 제공할 수 있습니다.

WMI(Windows® Management Instrumentation)는 네트워크 환경의 제어 및 모니터링에 사용할 수 있는 많은 클래스를 제공하는데 이러한 클래스 중에서 Win32_NetworkAdapter 및 Win32_NetworkAdapaterConfiguration 클래스를 사용하여 컴퓨터의 네트워크 어댑터 관련 작업을 수행할 수 있습니다.

"스크립트를 통해 네트워크 어댑터를 활성화하거나 비활성화하려면 어떻게 해야 합니까?"라는 질문을 자주 받는데 그 궁금증을 지금 풀어 드리겠습니다. 앞으로 다룰 내용은 지금 당장 할 수 있는 작업은 아닙니다. 적어도 Windows Vista™를 실행하기 전까지는 할 수 없습니다. Windows Vista에서는 Win32_NetworkAdapter 클래스에 Enable 및 Disable이라는 두 개의 새 메서드가 추가되었는데, 이들 메서드를 잠깐 살펴보겠습니다. 하지만 그 전에, 너무 실망하지 않도록 Windows Vista 이전의 운영 체제에서 수행할 수 있는 몇 가지 방법을 보여 주겠습니다. 먼저 시스템에서 실제로 사용할 수 있는 네트워크 어댑터를 찾아내는 방법을 설명하겠습니다(그림 1 참조). 마음에 드십니까?

Figure 1 네트워크 어댑터 찾기

strComputer = "." 
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\CIMV2") 
Set colItems = objWMIService.ExecQuery("SELECT * FROM Win32_NetworkAdapter")

For Each objItem in colItems 
    Wscript.Echo "Name: " & objItem.Name
    Wscript.Echo "Description: " & objItem.Description
    Wscript.Echo
Next

그림 1을 보면, 로컬 컴퓨터의 WMI 서비스에 연결하는 작업부터 시작합니다. 물론 GUI를 통해 로컬 컴퓨터의 네트워크 어댑터를 쉽게 찾을 수 있습니다. 그러나 GUI를 사용하여 원격 컴퓨터의 네트워크 어댑터에 대한 정보를 얻을 수도 있습니다. 바로 이 점이 이 스크립트를 비롯한 WMI 스크립트의 일반적인 장점입니다. strComputer의 값을 원격 컴퓨터 이름으로 변경하여 이와 동일한 스크립트를 원격 컴퓨터에 대해 실행할 수 있습니다.

WMI 서비스에 연결한 다음에는 Win32_NetworkAdapter 클래스를 쿼리합니다. 이 쿼리는 컴퓨터에 있는 모든 네트워크 어댑터 집합을 반환합니다. 이제 For Each 루프를 만들어 어댑터를 하나씩 조사하여 각 어댑터의 Name 및 Description을 출력하면 됩니다. 다음과 비슷한 결과가 출력됩니다.

Name: Broadcom NetXtreme 57xx Gigabit Controller
Description: Broadcom NetXtreme 57xx Gigabit Controller

Name: RAS Async Adapter
Description: RAS Async Adapter

Name: WAN Miniport (L2TP)
Description: WAN Miniport (L2TP)

Name: WAN Miniport (PPTP)
Description: WAN Miniport (PPTP)

DeviceID, Manufacturer 및 TimeOfLastReset과 같은 Win32_NetworkAdapter의 여러 가지 속성을 출력하여 네트워크 어댑터에 대한 다양한 정보를 검색할 수 있습니다. 자세한 내용은 스크립트 센터의 "Automating TCP/IP Networking on Clients(영문)을 참조하십시오.

변화에 대한 적응

Win32_NetworkAdapter 클래스를 사용하면 네트워크 어댑터에 대한 정보를 검색만 할 수 있을 뿐입니다. 어댑터 설정을 실제로 변경하려면 Win32_NetworkAdapterConfiguration 클래스를 사용해야 합니다. 이 클래스는 Win32_NetworkAdapter에 없는 속성을 통해 어댑터에 대한 추가 정보를 제공할 뿐 아니라 네트워크 어댑터를 연결에 사용할 수 있도록 구성하는 메서드도 여러 개 제공합니다.

예를 들어 어댑터를 활성화 및 비활성화할 수 없다고 하더라도 TCP/IP를 사용하는 각 어댑터의 DHCP(Dynamic Host Configuration Protocol)를 활성화하거나 비활성화할 수 있습니다. 그림 2에서는 TCP/IP를 사용하는 모든 어댑터를 검색하여 각 어댑터에 대해 DHCP가 활성화되었는지 확인한 다음 활성화되어 있지 않은 경우 DHCP를 활성화하는 스크립트를 보여 줍니다.

Figure 2 DHCP 활성화

strComputer = "." 
Set objWMIService = GetObject _
    ("winmgmts:\\" & strComputer & "\root\CIMV2") 
Set colItems = objWMIService.ExecQuery( _
    "SELECT * FROM Win32_NetworkAdapterConfiguration Where IPEnabled = 'True'")

For Each objItem in colItems
    If objItem.DHCPEnabled = False Then
        Wscript.Echo objItem.Caption
        intReturn = objItem.EnableDHCP
        Select Case intReturn
            Case 0
                Wscript.Echo "DHCP enabled"
            Case 1
                Wscript.Echo "You must reboot before DHCP will be enabled"
            Case Else
                Wscript.Echo "Error occurred"
        End Select
        Wscript.Echo
    End If
Next

그림 1의 스크립트와 마찬가지로 그림 2의 스크립트에서도 로컬 컴퓨터의 WMI 서비스에 연결합니다. 그런 다음 Win32_NetworkAdapterConfiguration 클래스를 쿼리합니다. TCP/IP를 사용하는 어댑터에만 관심이 있기 때문에 Where 절이 쿼리에 포함되었습니다.

Where IPEnabled = 'True'

이 절은 IPEnabled 속성이 True인 Win32_NetworkAdapterConfiguration 클래스의 인스턴스(이 인스턴스와 연관된 어댑터가 TCP/IP를 사용한다는 것을 뜻함)만을 원한다는 것을 지정합니다.

이제 For Each 루프를 사용하여 쿼리에서 반환된 어댑터 집합을 하나씩 조사합니다. 루프 내에서는 먼저 각 어댑터의 DHCPEnabled 속성을 확인합니다. 이 속성이 False로 설정되어 있으면 DHCP가 활성화되지 않았다는 뜻이므로 DHCP를 활성화하게 됩니다. 이 작업은 각 어댑터 개체의 EnableDHCP 메서드를 호출하여 수행합니다. 이제 필요한 작업이 모두 완료되었습니다.

스크립트에서 어떤 작업이 이루어지는지 쉽게 확인하기 위해 Caption 속성을 출력합니다. 이렇게 하면 작업 중인 어댑터를 확인할 수 있습니다. 또한 일반 사용자를 위해 Select Case 문을 추가하고 가능한 각 결과에 대한 설명자를 만들었습니다. EnableDHCP 메서드는 완료될 때 정수를 반환합니다. 값 0은 메서드가 성공적으로 실행되어 DHCP가 활성화되었음을 의미합니다. 값 1은 메서드가 성공적으로 실행되었지만 변경 내용을 적용하기 위해 컴퓨터를 다시 시작해야 한다는 것을 의미합니다. 그 외의 값들은 오류가 발생하여 DHCP가 활성화되지 않았음을 뜻합니다. 여기에서는 Select Case 문을 사용하여 이러한 정수 값을 확인하고 적절한 메시지를 반환합니다.

어댑터의 정적 IP 주소와 서브넷 마스크를 설정하여 DHCP를 비활성화할 수도 있습니다(그림 3 참조).

Figure 3 IP 주소 설정

arrIPAddress = Array("192.168.0.12")
arrSubnetMask = Array("255.255.255.0")

strComputer = "." 
Set objWMIService = GetObject _
    ("winmgmts:\\" & strComputer & "\root\CIMV2") 
Set colItems = objWMIService.ExecQuery( _
    "SELECT * FROM Win32_NetworkAdapterConfiguration Where IPEnabled = 'True'")

For Each objItem in colItems
    If objItem.DHCPEnabled = True Then
        Wscript.Echo objItem.Caption
        intReturn = objItem.EnableStatic(arrIPAddress, arrSubnetMask)
        Select Case intReturn
            Case 0
                Wscript.Echo "Static address assigned"
            Case 1
                Wscript.Echo "You must reboot before the static address will take effect"
            Case Else
                Wscript.Echo "Error occurred"
        End Select
        Wscript.Echo
    End If
Next

그림 3의 스크립트는 그림 2의 스크립트와 비슷하지만 몇 가지 차이점이 있습니다. 스크립트의 시작 부분에서 arrIPAddress와 arrSubnetMask라는 두 배열을 선언하고 각 배열에 값을 할당합니다. 그런 다음 For Each 루프에서 DHCPEnabled가 False인지 확인하는 대신 True인지 확인합니다. 즉, DHCP를 비활성화하기 위해 DHCP가 활성화되었는지 확인합니다. 그런 다음 해당 어댑터 개체의 EnableStatic 메서드를 호출합니다. EnableStatic 메서드에는 EnableDHCP 메서드와는 달리 매개 변수가 있습니다. 이러한 매개 변수는 새 정적 IP 주소와 서브넷 마스크가 포함된 앞에서 선언한 배열입니다.

Windows Vista에서 추가된 항목

Scripting Guy는 약속을 어기지 않기 위해 최선을 다하기 때문에 앞에서 약속한 대로 이제부터 Windows Vista에서 수행할 수 있는 작업을 보여 드리겠습니다. 앞에서 말한 것처럼 Windows Vista의 WMI 클래스 Win32_NetworkAdapter에는 네트워크 어댑터를 활성화하고 비활성화하는 데 사용할 수 있는 Enable과 Disable이라는 새 메서드 두 개가 추가되었습니다. 또한 어댑터가 활성화되어 있으면 True를 반환하고 그렇지 않으면 False를 반환하는 NetEnabled라는 새로운 속성도 생겼습니다. 그림 4는 컴퓨터에서 비활성화되어 있는 모든 네트워크 어댑터를 찾아서 활성화하는 스크립트를 보여 줍니다.

Figure 4 네트워크 어댑터 활성화

strComputer = "." 
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\CIMV2") 
Set colItems = objWMIService.ExecQuery( _
    "SELECT * FROM Win32_NetworkAdapter Where NetEnabled = 'False'")

For Each objItem in colItems 
    Wscript.Echo "Name: " & objItem.Name
    Wscript.Echo "Description: " & objItem.Description
    objItem.Enable
    Wscript.Echo
Next

이 스크립트는 그림 1의 스크립트와 거의 동일합니다. 아직 모르고 계신 분도 있겠지만 저희는 코드 재사용을 강력히 지지합니다. 로컬 컴퓨터의 WMI 서비스에 연결한 다음 Win32_NetworkAdapter의 모든 인스턴스를 쿼리합니다. 비활성화된 어댑터에만 관심이 있기 때문에 다음과 같은 Where 절을 추가했습니다.

Where NetEnabled = 'False'

이 Where 절에서는 새로운 NetEnabled 속성을 사용하여 NetEnabled가 False로 설정된 어댑터 즉, 비활성화된 네트워크 어댑터만 쿼리에서 반환되어야 함을 지정합니다. 쿼리에서 반환된 네트워크 어댑터 개체 집합에 대해 다시 한번 더 For Each 루프를 설정합니다. 어댑터의 Name 및 Description을 출력한 후 Enable 메서드를 호출하여 어댑터를 활성화합니다.

정말 간단하죠? 다른 유형의 네트워킹에 대해 충분한 정보만 얻을 수 있다면 말입니다.

Microsoft Scripting Guys는 Microsoft의 직원입니다. 이들은 야구를 비롯한 다양한 활동을 하거나 감독하거나 관람하지 않을 때는 TechNet 스크립트 센터를 운영합니다. www.scriptingguys.com(영문)을 확인하십시오.

© 2008 Microsoft Corporation 및 CMP Media, LLC. All rights reserved. 이 문서의 전부 또는 일부를 무단으로 복제하는 행위는 금지됩니다..