현재 세션에서만 .ps1 스크립트를 실행한 후 다시 스크립트를 실행하지 않도록 하기


  • Powershell 스크립트 파일인 .ps1 파일은 배치 파일이나 VB script 처럼 더블 클릭으로 실행되지 않는다. 그 이유는 보안적인 이유 때문이다.
  • 그래서 실행하려면 Powershell 콘솔, ISE 및 Group Policy를 통하여 실행될 수 있는데, 이것도 ExecutionPolicy에 따라 실행 여부가 결정된다. 기본 설정은 .ps1 파일을 실행하지 않도록 하는 Restricted로 설정되어 있다.
  • Get-ExecutionPolicy를 실행하면 현재 상태를 알 수가 있다.
  • 그런데 복잡하고 긴 명령어를 Script를 사용하면 편리하기 때문에, 꼭 .ps1 스크립트를 실행하고자 하면 다음과 같이 하면 된다.
    – [명령 프롬프트]나 [Powershell 콘솔] 프로그램을 실행한다.
    Powershell.exe -ExecutionPolicy RemoteSigned -File c:\myscripts\getprocess.ps1
  • 이렇게 하면 일시적으로 ExecutionPolicy가 RemoteSigned로 되었다가 .ps1 파일을 실행한 후 다시 원래대로 Restricted 모드로 돌아 가게 된다.
  • 이 작업은 관리자 뿐 아니라 일반 사용자도 할 수 있다. 정리를 하면 스크립트 실행 정책은 사용자의 편의를 위해서 만들어 둔 것이다. 그러므로 사용자가 원하면 언제든지 이렇게 바꾸어서 사용할 수 있다.
  • “Set-ExecutionPolicy RemoteSigned” 명령은 시스템 관리자만 실행하여 원하는 정책을 설정한다. 그렇지만 “powershell.exe -ExecutionPolicy Remotesigned”는 일반 사용자도 내릴 수 있다.
  • 좀 더 응용하여, 이것을 Batch 파일로 만들면 훨씬 활용도가 높다. , 배치 파일을 더블 클릭하여 이 작업을 할 수 있게 된다. (C:\myscripts\getprocess.bat)
    • @echo off
      powershell.exe -ExecutionPolicy Remotesigned -File c:\myscripts\getprocess.ps1

  • 그런데 이렇게 하면, 결과가 화면에 나타나지 않는다. 스크립트 결과를 파일로 저장하거나 이메일로 보내거나 프린터로 출력을 하면 괜찮지만, 그냥 화면에 출력하는 결과라면 실행한 사람이 자기 작업이 제대로 수행되었는지 알 수가 없다.
  • 그래서 배치 파일을 실행한 후 powershell console 화면을 그대로 남겨두고 싶으면 다음과 같이 -NoExit 매개변수를 배치 파일에 추가하면 된다.
    • @echo off
      powershell.exe -NoExit -ExecutionPolicy Remotesigned -File c:\myscripts\getprocess.ps1

              


효과적으로 Format-Table 사용하기


  • Format-Table은 화면에 표시되는 형식을 Table 형식으로 해주는 것이다
  • 그리고 주로 원하는 Property만 지정하여 화면에 보여줄 수 있다.
    • Get-Process -Name notepad
    • Get-Process -Name notepad | Format-Table
      (위의 것과 결과가 같으면 기본적인 매개변수만 출력된다)
    • Get-Process -Name notepad | Format-Table -Property name
    • Get-Process -Name notepad | FT -Property name, starttime, company
    • Get-Process -Name notepad | FT -Property name, starttime, company -Autosize
    • Get-Process | Group-Object -Property company
      (회사별로 프로그램을 묶어서 표시)


    • Get-Process | Sort-Object -Property company | FT -Groupby company
      (Format-Table의 -Groupby를 사용하여 표현)
    • Get-Process | Sort-Object -Property company | FT -Groupby company -Property name, description -Autosize

       
       

       
       

  • Format-Table에 주로 사용하는 Parameter는 -Property, -Groupby, -Autosize이다

Get-Childitem의 매개변수인 Filter와 Include의 차이점


  • 파일 내용을 보기 위해서 사용하는 cmdlet가 Get-Childitem이다.
  • 그냥 Get-Childitem으로도 사용할 수 있지만 매개변수(Parameter)를 사용하면 더욱 빛을 발하게 된다. 다음 내용을 한 번 보자.
    • Get-Childitem -Path $home
    • Get-Childitem -Path $home, C:\imsi
      (-Path에 2개 이상의 값을 사용하는 예제)
    • Get-Childitem -Path $home -Recurse
      (하위 폴더까지 검색하는 것이 -Recurse이다)
    • Get-Childitem -Path $home -Recurse -Force
      (숨겨진 파일까지 확인하는 것이 -Force이다)
    • Get-Childtem -Path \\fileserver\sharedfolder -Recurse -Force
      (파일 검색을 로컬 컴퓨터뿐만 아니라 원격이 File Server도 가능하다)
    • Get-Childitem -Path $home -Recurse -Force -Filter *.txt
      (원하는 내용만 검색하되 빨리 검색하는 좋은 옵션이다. 꼭 사용하기를 권한다.)
    • Get-Childitem -Path $home -Recurse -Force -Filter *.txt -Exclude re*.txt
      (특정한 것을 제외하는 것이 -Exclude이다)
  • 그런데 만약에 -Path 매개변수처럼 여러 개의 값(value)을 사용해 보고자 한다.
    • Get-Childitem -Path $home, C:\imsi -Recurse -Filter *.txt, *.doc
      (이렇게 하면 실패한다. 즉, -Filter는 검색 속도는 빠르지만 여러 개의 값을 사용할 수 없다)
  • 원하는 것만 검색을 하되 여러 가지 값을 사용할 수 있는 것이 -Include 매개 변수이다. 이것은 -Filter보다 검색 속도는 느리지만 이런 장점이 있으니 상황에 따라 -Filter를 사용할지 -Include를 사용할지 결정해야 한다.
    • Get-Childitem -Path $home -Recurse -Include *.txt, *.doc        
  • Get-Childitem의 Alias는 Dir이다. 그래서 Dir를 사용할 때는 기본적으로 사용을 권하는 매개변수는 -Recurse, -Force, -Filter이다.

환경변수를 이용하여 유용한 정보 알아보기


  • Powershell에서도 명령 프롬프트와 같이 다양한 환경 변수를 확인할 수 있다. 이러한 환경 변수를 활용하면 유용하게 활용할 수 있으니 잘 알아두면 좋다.
  • 환경 변수 전체를 확인하는 방법은 다음과 같다.
    • Dir Env:\
  • 환경 변수 내용이 많이 나타난다. 여기에서 몇 가지를 알아 두면 유용하게 사용할 수 있다. 만약에 사용자의 프로필 경로 아래에 폴더 및 파일을 생성하고 싶을 때 환경 변수를 이용하면 좋다.다음과 같이 환경 변수를 이용하여 작업을 해본다.
    • $env:logonserver
      (도메인 환경에서 컴퓨터가 어느 DC로 로그온했는지 알 수 있다.)
    • $env:computername
    • $env:userprofile
    • $env:systemroot
    • Mkdir $env:userprofile\myfolder        
    • Export-Clixml $env:userprofile\documents\text.xml
    • Invoke-Command -ComputerName PC1, PC2 {$env:NUMBER_OF_PROCESSORS}
      (원격 컴퓨터들의 CPU 수량 확인하기)
    • Invoke-Command -ComputerName PC1, PC2 {$env:PROCESSOR_IDENTIFIER}
      (원격 컴퓨터들의 CPU 종류 확인하기)

컴퓨터의 사용자 프로파일을 사용하여 이 컴퓨터에서 최근에 작업한 시간을 알아보기


  • 사용자의 프로파일 정보를 이용하면 필요한 내용을 얻을 수 있다. 다음은 WmiObject를 이용하여 사용자 정보를 추출하는 것이다.
    • Get-WmiObject -Class Win32_UserProfile
  • 이렇게 해보니 속성(Property) 값이 너무 많다. 그래서 우리가 원하는 속성 값만 보고자 한다.
    • Gwmi -Class Win32_UserProfile | Format-Table localpath, lastusetime -Autosize


    • 여기를 보면 어떤 사용자 계정이 있으며, 그 사용자 계정이 마지막으로 작업한 한 시간도 나온다. 중요한 것은 이것은 실시간 정보가 아니고 이전 정보라는 것이다. 그래서 특정한 컴퓨터에 접속하여 작업한 시간을 알 수 있다는 것이다.
    • 위의 결과가 나오려면 반드시 Administrator 계정으로 실행해야 한다. 다른 계정으로 실행하면 자신에 대한 정보만 나온다.        
  • 여기서 문제가 있다. 마지막으로 작업한 시간을 이해하기 어렵다. 그래서 형식을 좀 변경해서 볼 필요가 있다. 즉, lastusetime을 다른 형식으로 표현해보자.
    • Gwmi -Class Win32_UserProfile | ft localpath, @{Name=”LastUse”;Expression={[System.Management.ManagementDateTimeconverter]::ToDateTime($_.lastusetime)}} -AutoSize
    • 이것이 너무 길므로 Powershell Script 파일(test.ps1)로 저장하여 실행하면 쉽다.


  • 원격 컴퓨터에서 사용자들이 최근에 작업한 시간을 알아보고자 한다. 이럴 때도 Powershell script를 이용하거나 Function을 이용하면 된다.

    • 여기를 잘 보면 Win2012_Server나 Win2012_Core 컴퓨터에서 Domain의 administrator 계정 정보에 대한 최근 사용 시간이 같음을 알 수 있다. 그 이유는 멤버 서버에서 도메인으로 로그온했을 때 모든 시간 정보는 DC에서 가져오기 때문이다. 그렇기 때문에 도메인 환경에서 사용자 작업 시간을 도메인 컨트롤러에서 가져온다는 사실에 유의한다.

      그리고 Aduser1은 Win2012_server에서 도메인으로 로그온 하였고, Aduser2는 Win2012_Core 컴퓨터에서 도메인으로 로그온 한 것이다. 두 사용자의 최근 작업 시간이 다름을 확인할 수 있다.         

    • 만약에 Function을 사용하면 원격 컴퓨터의 사용자 작업 시간 정보를 얻을 수 있다. 그런데 유의할 것을 로컬로 로그온 하여 작업한 시간만 확인할 수 있다는 것이다. 위의 예처럼 도메인으로 로그온하여 작업한 시간을 알 수가 없다.


Powershell Script에 포함된 Parameter 값을 강제적으로 입력하도록 화면에 보여주기


  • Powershell script 파일 안에 Parameter를 사용하는 경우가 많다. 이런 경우에 해당 Parameter를 꼭 사용하도록 명기하는 것이 필요하다. 이렇게 하면 사용자의 입력 실수를 방지할 수 있다.
  • 우리가 주로 보고자 하는 작업은 CPU를 많이 사용하거나 Physical Memory(pm)를 많이 사용하는 프로세스를 확인하고자 한다.
    • Get-Process | Sort-Object -Property cpu -Descending | Select-Object -First 5
    • Get-Process | Sort-Object -Property pm -Descending | Select-Object -First 5
  • 그래서 이것을 스크립트로 만들어서 사용자가 cpu, pm, 수량을 입력하도록 하고자 한다.
    먼저 다음과 같이 Powershell sciprt 파일을 생성해 본다.
    • Param (
      $item,
      $amount
      )
      Get-Process | Sort-Object -Property $item -Descending | Select-Object -First $amount

    • 이렇게 하여 test.ps1 파일로 저장한다.
  • 이제 test.ps1 파일을 다음과 같이 실행하여 본다. 모두 오류가 발생하게 된다. 그 이유는 반드시 2개의 Parameter를 사용해야 하는 Powershell Script인데, 사용자가 그것을 모르고 실행하였기 때문이다.
    • .\test.ps1
    • .\test.ps1 cpu
    • .\test.ps1 -item cpu
  • 이제는 이 스크립트가 어떻게 구성되어 있는지 알고 있어서 다음과 같이 필요한 parameter 값을 입력하여 실행하여 본다. 모두 성공이다.
    • .\test.ps1 cpu 5
    • .\test.ps1 -item cpu -amount 5
  • 자, 그렇다면 사용자가 스크립트에 어떤 매개변수(parameter)가 있는지 모를 경우를 대비하여 Parameter를 강제로 사용하도록 만들어 본다.
    • Param (
      [Parameter(Mandatory=$true)]
      $item,
      [Parameter(Mandatory=$true)]
      $amount
      )
      Get-Process | Sort-Object -Property $item -Descending | Select-Object -First $amount

    • 주의 사항은 Parameter 마다 각각 [Parameter(Mandatory=$true)]을 입력해야 한다는 사실이다.

       
  • 이렇게 한 후 test.ps1 파일을 다음과 같이 실행을 하면 콘솔 화면에 item 및 amount를 입력하라는 항목이 강제로 나타난다. 그러면 사용자는 적절한 값을 입력해주면 되는 것이다.


    • 물론 이렇게 작업을 해도 위에서와 같이 .\test.ps1 pm 8로 입력하거나 .\test.ps1 -item pm -amount 5로 입력해도 정상적인 결과가 나오게 된다.         

     
     

로컬 컴퓨터에 로그온 한 사용자에 대한 정보 확인하기(Quser.exe)


  • Quser.exe를 사용하여 자신이 사용하고 있는 로컬 컴퓨터에 현재 로그온 하고 있는 사용자 계정의 상태를 확인하고자 할 때 유용하다
  • 다음과 같이 실행해본다.


  • Quser.exe는 현재 켜져 있는 컴퓨터에 로그온 하고 있는 사용자에 대한 정보만 확인한다. 예전에 로그온한 사용자 정보는 확인할 수 없다.
  • 이제는 원격 컴퓨터에서 로컬로 로그온 한 사용자에 대한 정보를 확인해보자.
    이렇게 해 보는 이유는 원격 컴퓨터들에 어떤 사용자가 현재 로그온 되어 있는지 확인하여 직원들이 현재 작업하고 있는지, 또는 몇 시에 컴퓨터를 켰는지를 알 수 있는 것이다.


  • 또는 원격 컴퓨터에 있는 사용자에게 메시지를 보낼 수도 있다. Msg.exe를 이용하여 메시지를 보낼 때는 반드시 현재 로그온 한 사용자 정보를 알고 있어야 한다.
    • 먼저 Win2012_DC에서 다음과 같이 메시지를 Win2012_Server의 aduser1에게 보낸다.


    • 그러면 Win2012_Server 컴퓨터에서 현재 콘솔로 로그온하여 작업하고 있는 사용자에게 메시지가 나타난다.


      ** 만약 원격 컴퓨터에 어느 사용자가 로그온하여 사용하고 있는지를 모르는 경우에 메시지를 보내고자 하면 Msg * /server:win2012_server “Let’s have a break.”라고 하면 된다.

  • 만약에 원격에 있는 컴퓨터에 어떤 원격 세션이 연결되어 있는지 확인하기 위해서는 net session을 이용하면 된다. 아래 그림은 win2012_dc가 Win2012_Server 컴퓨터의 공유된 폴더인 Test에 연결한 후 Win2012_DC에서 원격으로 확인해 본 것이다.