Powershell script에서 Param 사용하여 컴퓨터 정보 확인하기


  • Powershell Script를 실행할 때마다 다른 컴퓨터 이름을 사용하고자 할 때 스크립트에 Param을 사용하면 유용하다
  • 만약에 컴퓨터의 OS 정보를 확인하고자 할 때는 다음과 같이 할 수 있다.
    Gwmi Win32_OperatingSystem | Select-Object BuildNumber, Caption, ServicePackMajorVersion

    Gwmi Win32_OperatingSystem -ComputerName server2 | Select-Object BuildNumber, Caption, ServicePackMajorVersion


  • 그런데 여기서 로컬 컴퓨터가 아닌 원격 컴퓨터의 정보를 알아 내기 위해서는 이렇게 긴 것을 다 쓰고 컴퓨터 이름만 바꿔서 써야 한다. 너무 힘들다. 그래서 스크립트를 만드는 것이다
  • 스크립트를 만들어서 저장할 때 .ps1 파일(pcname2.ps1)로 저장한다. 그런데 이 내용을 저장하면 하나의 컴퓨터 정보만 얻을 수 밖에 없다. 그래서 원격에 있는 컴퓨터의 정보를 얻기 위해서 Param ( )을 사용한다.
     



    여기서 $PC는 매개변수(Parameter)이다. 그러므로 스크립트 파일을 생성할 때 Param ( )을 사용한다는 것은 바로 해당 스크립트에 parameter를 사용하겠다는 것이고, 그 결과 다양하게 응용하겠다는 뜻이다.
     

  • 여기서 localhost라고 한 것은 어떤 컴퓨터에서 이 스크립트를 실행을 하든 컴퓨터 이름을 입력하지 않을 때 기본적으로(by default) 자신의 컴퓨터라는 것을 말하는 것이다.
    C:\MyScripts\pcname2.ps1
  • 이제는 이 스크립트 파일을 실행할 때 반드시 컴퓨터 이름을 입력하도록 해보자.
    C:\MyScripts\pcname2.ps1 server1
    (여기서 parameter를 사용하지 않더라도 제일 먼저 사용한 매개변수는 pc 이므로, pc 매개변수에 대한 값으로 server1을 인식한 것이다.)
    C:\MyScripts\pcname2.ps1
    -PC
    server1
    (Param에서 사용한 $pc는 parameter 이름이다. 그래서 여기서 -PC로 입력한 후 server1을 입력한 것이다.)
    C:\MyScripts\pcname2.ps1 -P
    server1
    (Param에서 사용한 parameter 중에서 p로 시작하는 것은 pc 밖에 없기 때문에 이렇게 해도 된다)
     

  • 즉, 이렇게 해야지 원하는 컴퓨터의 정보를 정확하게 얻을 수 있다. 이렇게 하려면 사용자에게 이 스크립트를 실행하는 방법을 알려주어야 하는 번거로움이 있다. 이것을 해결하는 것이 다음과 같이 Read-Host를 이용하는 것이다. 이렇게 하면 해당 스크립트를 실행하여 자동으로 화면(screen, host)에 창이 Popup되기 때문에 사용자가 원하는 컴퓨터 이름을 입력하게 되는 것이다.
     


     
     


Write-Host와 Write-Output의 차이점


  • 어떤 결과를 화면(Screen, Host)에 보여 주고자 할 때 Write-Host 및 Write-Output을 사용한다.
  • 결과를 화면에 보여 줄 때 가장 기본적으로 사용하는 것이 Write-Host이다. Write-Host는 콘솔 화면에 결과를 보여주면서 색깔 및 구분자 등을 이용하여 다양하게 지정할 수 있는 장점이 있다. 하지만 화면에 나타나는 결과를 Pipleline이 입력 값으로 사용할 수 없다. 그래서 활용도가 좀 떨어진다.
    Help Write-Host -full

    Write-Host “사랑합니다.”
    Write-Host “사랑합니다.” -ForegroundColor white -BackgroundColor black


    Write-Host “사랑”,”희락”,”화평”
    Write-Host “사랑”,”희락”,”화평” -Separator “->”
    Write-Host “사랑”,”희락”,”화평” -Separator “, “
    Write-Host “사랑”,”희락”,”화평” -Separator “, ” -fore red
     

  • Write-Output은 화면에 나타나는 결과를 Pipleline의 입력 값으로 보낼 수 있어서 활용도가 좋은 편이다. 하지만 화면에 표현할 때 색깔 등을 입혀서 화려하게 보여줄 수는 없다.
    Write-output “사랑합니다”,”희락”,”화평” | where {$_.length -gt 3}
    Write-output “사랑합니다”,”희락”,”화평” | Sort-Object -Descending
    Write-output “사랑합니다”,”희락”,”화평” | Export-Csv yslee.csv

     

시스템에서 제공하는 Variable(변수)을 확인하기 활용하기


  • 시스템 제공 변수(variable)를 활용하면 여러 가지 유익하다. 일단 기본적인 변수를 확인하여 사용한 후 사용자가 필요에 따라서 변수를 만들어서 사용하는 것이 좋다.
  • 시스템 제공 변수를 확인하려면 다음과 같이 한다.
    Get-PSDrive
    cd variable:
    dir 또는 ls

    또는 처음부터
    dir variable:


  • 여기에 있는 것들에다가 앞에 $만 붙여서 사용하면 여러 가지 쓸모 있는 작업을 할 수 있다.


CSV 파일과 Pipeline을 이용하여 Active Directory에 사용자 계정 한꺼번에 많은 개수로 만들기


  • 확장자 csv 파일과 Active Directory Module의 New-ADuser를 사용하여 많은 수의 사용자 계정을 한꺼번에 만들 수 있다.
  • 먼저 New-ADuser의 Get-Member를 찾아 본다.
    New-ADUser | Get-Member
    (여기에 나오는 Parameter를 이용하여 사용자 계정을 만드는 것이다.)

    Help New-ADuser를 실행해 보면 name은 꼭 사용해야 함을 알 수 있다.

  • Csv 파일을 만들 때 처음부터 New-ADuser의 Parameter를 사용하는 것이 제일 편하다.
  • Csv 파일은 엑셀 프로그램이나 메모장 프로그램에서 만들면 된다. 특히 메모장에서 만들 때 저장할 때 UTF-8로 저장하면 한글을 사용할 수 있다.


  • 다음과 같이 진행하여 csv 파일을 AD에 생성하고 생성되었는지 확인한다
    Import-Csv c:\creatingmultiusers.csv
    Import-Csv c:\creatingmultiusers.csv | New-ADuser
    Get-ADuser -Filter {name -like “용식”}        
  • 이제는 csv 파일을 만들 때 New-ADuser의 Parameter와 다르게 만들어서 진행해보자.


  • 아래와 같이 사용자 계정을 만들어 본다.
    Import-Csv c:\creatingmultiusers_1.csv
    Import-Csv c:\creatingmultiusers_1.csv | new-Aduser (성공)
    (성공은 했지만 job title 항목이 입력되지 않았다. 여기서 알 수 있는 것은 csv 파일을 이용할 때는 new-aduser의 매개변수만 골라서 작업을 처리한다는 것이다.)
  • 이제는 job title의 내용을 포함해서 다시 처리해보자. 금방 생성한 계정은 삭제한다.
    그리고 Select-Object와 Custom Parameter를 사용하여 Job Title도 입력하도록 하자.
    Import-Csv c:\creatingmultiusers_1.csv | Select-Object -Property name, surname, givenname, samaccountname,department,city, @{Label=”Title”;Expression={$_.”Job Title”}}

    Import-Csv c:\creatingmultiusers_1.csv | Select-Object -Property name, surname, givenname, samaccountname,department,city, @{L=”Title”;E={$_.”Job Title”}} | New-ADuser (성공)

  • 생성한 계정을 Enable 시킨다.
    Get-ADuser -Filter {name -like “이*”}
    Get-ADuser -Filter {name -like “이*”} | Enable-ADaccount

     

     
     

     
     

Pipeline 이해하기-중급


  • Powershell의 cmdlet은 명령 프롬프트에 비하여 기능이 좋은 것 중에 하나가 파이프라인을 사용하는 것이다. 파이프라인은 앞의 결과를 입력 값으로 받아서 처리하는 것을 말한다.
  • 보통 우리는 다른 컴퓨터의 자원의 정보를 보기 위해서는 [Get-Process -ComputerName pc1]으로 사용한다. 여러 대의 컴퓨터를 지정하기 위해서는 -ComputerName pc1, pc2, pc2로 하든가, 아니면 -ComputerName (Get-Content c:\computers.txt)로 사용한다.
  • 그리고 어떠한 프로세스를 중지하기 위해서 Stop-Process -Name notepad 라고 하고, 여러 개의 프로세스를 중지하려면 Stop-Process -Name notepad, mspaint, wordpad로 하거나 Stop-Process -Name (GC c:\list.txt)로 하면 된다.
  • 만약 회사의 모든 컴퓨터에 대하여 조사를 하고자 한다면 어떻게 할까? 그것은 바로 Active Directory에 소속 컴퓨터의 목록을 이용하면 된다. 그러면 기본적으로 AD의 컴퓨터 목록을 먼저 불러 오고 그 결과를 Get-Process의 입력으로 처리하면 된다. 이 때 사용하는 것이 바로 Pipeline이다.
  • 다음과 같이 일반적인 파이프라인 작업을 해 보자.
    • Get-Process | Select-Object -Property vm, cpu | Format-Table -Autosize
    • Get-Process | Sort-Object -Property cpu -Descending
    • Get-Process | Sort-Object -Property cpu -Descending | Select-Object -First 5
    • Get-Service | Where-Object {$_.status -eq “stopped”}
    • Get-Process -Name notepad, wordpad | Stop-Process
      (일단 2개의 프로세스가 실행 중인지를 먼저 확인한 후 중지시키는 것이다.)
    • gwmi win32_bios -ComputerName (Get-ADcomputer -Filter * | Select-Object -ExpandProperty name)
      (이것은 좀 특이한 경우이다. -ComputerName에 괄호를 하고 Get-Content c:\computers.txt로 사용하지 않고 AD의 컴퓨터 이름을 가지고 온 경우이다.)
  • 이제는 수많은 컴퓨터 이름을 활용해 보자. 즉, AD의 구성원 목록을 이용하자는 것이다. Get-Process, Stop-Process 등을 사용할 때 앞에서 먼저 컴퓨터 목록을 확인하여 이용하고자 한다. 이럴 때는 반드시 도움말을 참고하는 습관을 들여야 한다. 즉, 다음과 같이 한 번 도움말을 참고하여 본다.
    • Help Get-Process -Parameter ComputerName        
    • Help Get-Service -Parameter Name
    • Help Stop-Service -Parameter Name
    • Help Stop-Process -Parameter Name
    • Help Gwmi -Parameter ComputerName
  • 위의 결과를 보면 다음과 같다.

Pipeline의 입력을 받는 cmdlet

매개변수

파이프라인 입력 적용 여부

Get-Process

ComputerName

ByPropertyName

Get-Service / Stop-Service

Name

ByValue, ByPropertyName

Stop-Process

Name

ByPropertyName

Get-WmiObject

ComputerName

false

  • 여기서 보면 Gwmi의 -ComputerName은 다른 cmdlet의 결과값을 입력 값으로 받아서 처리할 수 없음을 알 수 있다.
    그리고 Get-Service 및 Stop-Service의 -Name은 ByValue(일반 문자열 값) 및 ByPropertyName(앞 명령어의 Property 이름과 동일한 값)을 사용해야 한다.
    마지막으로 Get-Process 및 Stop-Process의 -Name은 반드시 앞 명령어의 Property 이름과 동일한 것만을 사용해야 한다는 것이다. 이것을 주의해야 한다.
  • 만약 Get-Adcomputer -Filter *의 결과를 보면 Name이라는 Property(속성)은 있지만 뒤에서 사용할 Get-Process의 -ComputerName과 다르다. 이럴 때는 꼭 기존의 Name을 이용하여 ComputerName을 생성해주어서 처리해야 한다.
  • 아래 예제를 한 번 본다.
    • Get-Adcomputer -Filter * (성공)
    • Get-Adcomputer -Filter * | Get-Process (실패)
    • Help Get-Process -Parameter computername (파이프라인 입력 적용여부:ByPropertyName)
    • Get-Adcomputer -Filter * | Select-Object @{Label=”ComputerName”;Expression={$_.name}} (computername이라는 object에 컴퓨터 목록이 나타남)
    • Get-Adcomputer -Filter * | Select-Object @{Label=”ComputerName”;Expression={$_.name}} | Get-Process (성공)
    • Get-Adcomputer -Filter * | Select-Object @{Label=”ComputerName”;Expression={$_.name}} | Get-WmiObject Win32_BIOS (실패)
      (이것이 실패한 이유는 Get-WmiObject의 -ComputerName은 파이프라인을 사용할 수 없기 때문이다.)
    • gwmi win32_bios -ComputerName (Get-ADcomputer -Filter * | Select-Object -ExpandProperty name) (성공)