2010. 7. 28. 00:41
안녕하세요~

이번에는 윈도우 서버관리에 있어 중요한 오류 메시지를 확인 할 수 있는 이벤트 로그를 파워쉘을 이용하여 확인해 보도록 하겠습니다.

get-Eventlog Cmdlets을 이용하여 아래와 같이 보안에 관련된 이벤트 로그를 확인하였습니다.
사용자 삽입 이미지

Powershell의 기능을 좀더 활용 하여 아래와 같이 검색을 원하는 로그 파일을 종류 Application(응용프로그램), securuty(보안)등 원하는 로그에 대하여  -LogName (로그이름) -Message (*성공적*) 포함한 내용에 대하여  -After(검색을원하는기간)을 사용하여 로그를 조회 확인하였습니다.

Get-EventLog -LogName security -Message *성공적* -After 2010-07-26
사용자 삽입 이미지
로그를 확인하는 방법을 위와 같이 Powershell의 기능을 활용하여 다양한 방법으로 특정 로그에 대한 조회가 가능합니다.
이상으로 get-Eventlog Cmdlets을 이용하여 간략하게 이벤트 로그 확인법에 대하여 알아 보았습니다.

'Powershell > cyber1008' 카테고리의 다른 글

powershell에서 데이터 저장 (Out-File) 사용하기  (0) 2010.07.20
Posted by 알 수 없는 사용자
:
2010. 7. 26. 19:51

안녕하세요. 엉스데브 입니다.

PowerShell 로 필요한 스크립트를 만들던 중, MSSQL 서버에 저장 되어 있는 데이터를 참조해야 하는 경우가 생겼습니다.

PowerShell .NET Framework  기반의 언어이기 때문에 .NET Framework 가 제공하는 여러 클래스를 사용 할 수 있으며, 이 클래스 들 중에는 MSSQL 접속 및 데이터 조회 / 수정을 위한 클래스 들도 있습니다. 이 클래스 들을 이용해서 직접 사용 할 MSSQL 관련 함수들을 만들어 보았습니다. 

Function Query-Mssql
{
  Param(
    [parameter(Mandatory=$true)][String]$Query,
    [parameter(Mandatory=$true)][String]$Server,
    [parameter(Mandatory=$true)][String]$Id,
    [parameter(Mandatory=$true)][String]$Password,
    [parameter(Mandatory=$true)][String]$DBName,
    [Int32]$Timeout = "30"
  )

  $Conn = New-Object System.Data.SqlClient.SqlConnection
  $Conn.ConnectionString = "Server=" + $Server + ";Database=" + $DBName + ";User ID=" + $Id + ";Password=" + $Password
  $Conn.Open()

  $SqlCmd = New-Object System.Data.SqlClient.SqlCommand
  $SqlCmd.CommandText = $Query
  $SqlCmd.Connection = $Conn
  $SqlCmd.CommandTimeout = $Timeout

  Return $SqlCmd.ExecuteNonQuery()
}



Function Get-MssqlData
{
  Param(
    [parameter(Mandatory=$true)][String]$Query,
    [parameter(Mandatory=$true)][String]$Server,
    [parameter(Mandatory=$true)][String]$Id,
    [parameter(Mandatory=$true)][String]$Password,
    [parameter(Mandatory=$true)][String]$DBName,
    [Int32]$Timeout = "30"
  )

  $Conn = New-Object System.Data.SqlClient.SqlConnection
  $Conn.ConnectionString = "Server=" + $Server + ";Database=" + $DBName + ";User ID=" + $Id + ";Password=" + $Password
  $Conn.Open()

  $SqlCmd = New-Object System.Data.SqlClient.SqlCommand
  $SqlCmd.CommandText = $Query
  $SqlCmd.Connection = $Conn
  $SqlCmd.CommandTimeout = $Timeout
 
  $SqlDataAdapter = New-Object System.Data.SqlClient.SqlDataAdapter
  $SqlDataAdapter.SelectCommand = $SqlCmd

  $DataSet = New-Object System.Data.DataSet
  $SqlDataAdapter.Fill( $DataSet )

  Return $DataSet.Tables
}


Query-Mssql 함수는 Insert, Update, Delete 등 결과 레코드가 반환되는 것이 아닌 단순 실행 쿼리를 날릴 때 사용하며, Get-MssqlData 함수는 Select 등 리턴되는 데이터가 있는 쿼리를 날릴 때 사용합니다.

#아래 더보기를 클릭하시면 다소 복잡한 스크립트 설명을 볼 수 있습니다.#

 

이제 PowerShell 에서 MSSQL 데이터도 엑세스 및 수정 할 수 있으니, 좀 더 정교한 스크립트를 만들어 봐야 겠습니다. ^^


<참고 URL>
http://nsjokt.springnote.com/pages/5657751
Posted by 알 수 없는 사용자
:
2010. 7. 26. 19:13
안녕하세요. 엉스데브 입니다.

PowerShell 을 가지고 놀다 보니 Linux + Bash 를 사용할 때 유용하게 썼던 유틸인 wget 을 PowerShell 에서도 쓰고 싶어졌습니다.

구글링을 통해, 어느 외국 유저분께서 만든 PowerShell 에서 wget 처럼 사용 할 수 있는 함수를 찾을 수 있었습니다.
(*링크 : http://huddledmasses.org/wget-2-for-powershell/, by "Joel 'Jaykul' Bennett" )

뭐든 내용을 파악하고 사용 해야죠? 스크립트를 살펴 보겠습니다.
먼저 함수의 이름은 Get-WebFile 로 PowerShell 의 명령어 명명법에 잘 맞는 이름이네요.(동사 + 명사)

System.Net.HttpWebRequest Class 를 사용해서 구현 한 것이네요.
MSDN 에서 해당 Class 를 찾아보니 HTTP, 혹은 HTTPS 요청을 처리할 수 있는 Class 군요.
이런 .NET Class 는 MSDN 에서 검색 해 보면 그 Class 가 어떤 기능과 속성들을 가지고 있는지 알 수 있습니다.
(*링크 : http://msdn.microsoft.com/en-us/library/system.net.httpwebrequest.aspx )

함수를 사용 하려면, Profile 에 함수를 추가 해 두면 됩니다.

사용법은 아래와 같습니다.

Get-WebFile { 다운로드 받을 웹 파일 } { 저장 될 파일 명 }
예) Get-WebFile "http://svrstudy.tistory.com" "svrstudy.tistory.com.html"



어디 잘 받아졌는지 내용을 확인 해 볼까요?
cat(Get-Content 명령어의 Alias) 으로 파일을 열어 봅니다. -totalcount 파라미터로 처음 5줄만 보겠습니다.


웹 페이지의 내용이 잘 저장 되어 있네요.

저장하지 않고, -Passthru 파라미터를 줘서 화면에 바로 출력 시킬 수도 있습니다.


-Quiet 파라미터로, 다운로드 진행 상태를 표시하지 않도록 할 수도 있군요.

이 함수를 이용하면 추후 REST 등의 HTTPRequest 로 요청 하는 서비스를 PowerShell 에서도 활용 할 수 있는등,
앞으로 대단히 유용하게 사용 될 것 같습니다.

그러나 아직은 Linux 의 wget 유틸에 비해 여러가지 기능이 부족 하네요.
나중에 시간 되면 제가 wget 유틸 사용시 많이 썼던 기능(HTTP 로그인 기능 지원, FTP 프로토콜 지원 등)은 직접 추가 해야 겠습니다.^^

<참고 URL>
http://huddledmasses.org/wget-2-for-powershell/
Posted by 알 수 없는 사용자
:
2010. 7. 26. 17:40

안녕하세요. 엉스데브 입니다.

Windows 7, Windows 2008 R2 부터 IIS 를 설치 시 PowerShell IIS 관리 모듈이 같이 설치 됩니다. 모듈의 이름은 “WebAdministration” 이며, PowerShell 에서 Import-Module cmdlet 으로 불러들여서 사용 할 수 있습니다.

먼저, WebAdministration 모듈이 존재하는지 확인 합니다.

Get-Module -ListAvailable


해당 모듈을 사용 할 수 있도록 Import 합니다.

Import-Module -Name WebAdministration



“IIS 구성 데이터에 액세스하려면 프로세스에서 높은 상태를 가져야 합니다.” 라는 오류메시지가 나오는 군요. PowerShell 을 관리자 권한으로 실행 시켜야겠네요.

, 스크립트를 실행 할 권한이 없다고도 나오는 군요. 이 부분은 실행 정책을 “RemoteSigned” 로 변경해서 처리 할 수 있습니다.(링크 : PowerShell 자체 인증서 생성과 스크립트 인증 하기)

관리자 권한으로 PowerShell 을 실행하고, 실행 권한도 조정 한 후 다시 Import 했습니다.

별다른 오류 없이 잘 넘어가는 군요.

WebAdministration 모듈이 Import 되었으니, 새로 추가 된 명령어들을 확인 해 봅시다.

Get-Command -Module WebAdministration


여러 명령어가 추가 된 것을 확인 할 수 있습니다.

도움말을 통해 각 cmdlet 을 어떻게 사용 하는지 확인 해 보는 것을 추천 합니다.

, 그럼 먼저 웹사이트를 하나 만들어 볼까요?
웹사이트를 운영하려면, 먼저 해당 웹사이트가 사용 할 ApplicationPool 을 만들어야 합니다. New-WebAppPool 명령어로 만들 수 있습니다.

New-WebAppPool -Name "Test Site"



잘 만들어 졌네요.

이제, 사이트의 내용이 들어갈 홈디렉토리를 만들어 주어야 합니다. “C:\wwwroot\TestSite” 로 만들었습니다.
Force 파라미터를 주면 부모 디렉터리가 존재하지 않을 경우 강제로 만들어 줍니다.

mkdir C:\wwwroot\TestSite -Force

 

 

이제 웹 사이트를 만들어 봅시다. New-Website cmdlet 을 이용 합니다.

New-Website -Name "Test Site" -ApplicationPool "Test Site" -PhysicalPath "C:\wwwroot\TestSite"




이런, 오류가 발생하는군요.
배열 범위가 벗어났다는 오류가 발생하는데, 구글링 결과 기존에 만들어진 사이트가 전혀 없어 ID 값을 자동으로 생성 해 내지 못했기 때문이라고 합니다. ID 값을 1로 강제 지정 하고 다시 시도 합니다.

New-Website -Name "Test Site" -ApplicationPool "Test Site" -PhysicalPath "C:\wwwroot\TestSite" -Id 1



잘 만들어 졌습니다. 자동으로 시작 상태가 되었군요.

WebAdministration
모듈은 IIS: 라는 Provider 도 제공 합니다.
해당 Provider 를 통해 마치 하드디스크의 파일 내용을 탐색 하듯이 탐색 해 볼 수가 있습니다.
IIS:\
의 내용을 살펴 보면, 다음과 같은 내용을 확인 할 수 있습니다.


AppPools
에는 현재 만들어진 모든 ApplicationPool 이 들어있고, Sites 엔 현재 만들어진 모든 사이트가 들어있습니다.



만들어진 아이템(ApplicationPool, 사이트)의 속성을 변경하고 싶다면, Set-ItemProperty cmdlet 을 사용하면 됩니다. PhysicalPath “C:\wwwroot” 로 변경 해 보았습니다.

Set-ItemProperty "IIS:\Sites\Test Site" -Name "physicalPath" -Value "C:\wwwroot"




physical Path 값이 잘 변경 되었네요.

만약, ApplicationPool 을 재생하고 싶다면, Get-Item cmdlet 으로 재생하고자 하는 ApplicationPool 을 선택 한 뒤, .Recycle() 메소드를 호출 하면 됩니다.

(Get-Item "IIS:\AppPools\Test Site").Recycle()


, 해당 ApplicationPool 을 중지 하고 싶다면 Stop() 메소드를, 시작하고 싶다면 Start() 메소드를 사용 할 수 있으며, state 속성을 보면 현재 실행 상태를 확인 할 수 있습니다.

(Get-Item "IIS:\AppPools\Test Site").state
(Get-Item "IIS:\AppPools\Test Site").Start()
(Get-Item "IIS:\AppPools\Test Site").Stop()



ApplicationPool의 시작, 중지, 재시작 등의 작업은 Start-WebAppPool, Stop-WebAppPool, Restart-WebAppPool 등의 cmdlet 을 사용해서도 할 수 있습니다. 자세한 내용은 get-help 를 통해 확인 해 보세요!

이제 다 가지고 놀았으니 정리해야 겠네요 ^^
지금까지 만든 모든 웹사이트와 ApplicationPool 을 삭제했습니다.

Remove-WebAppPool *
Remove-Website *



깔끔히 지워졌네요.

지금까지 WebAdministration
모듈을 간단히 살펴봤는데, 아주 잘 만들어진 것 같습니다.
PowerShell 만으로도 IIS 세팅에 관한 원하는 모든 작업을 할 수 있을 것 같네요.

앞으로 WebAdministration 모듈을 적극 이용해서 사이트 설정 등을 자동화 하면 좋을 것 같습니다.

<참조 문서>
Get-Help about_Modules

<참조 URL>
http://www.winserverhelp.com/2010/07/automating-iis-with-powershell/
http://learn.iis.net/page.aspx/447/managing-iis-with-the-iis-70-powershell-snap-in/

Posted by 알 수 없는 사용자
:
2010. 7. 22. 13:58
안녕하세요. 엉스데브 입니다.

대부분의 프로그래밍 언어와 마찬가지로, PowerShell 스크립트 역시 내부에 주석을 달아 둘 수 있습니다.

주석이란, 프로그램 혹은 스크립트가 실행 될 때 무시되는 부분으로, 주로 스크립트의 흐름이나 각 부분의 역할 등을 설명하는 내용의 문자열로 이루어 집니다.

PowerShell 로 스크립트를 작성시 주석을 넣으려면, #(샵) 문자를 주석 맨 앞에 넣어주면 됩니다.
아래 예제를 살펴 봅시다. 청록색 글씨 부분이 주석입니다.
# show_uptime.ps1 { $Machine }
# 지정 한 서버의 uptime 을 출력합니다.


param([string] $Machine = ".")

# Win32_OperationSystem 오브젝트를 변수에 저장.
$OS = Get-WmiObject Win32_OperatingSystem -ComputerName $Machine

# 시스템 관리용 시간 값을 일반적인 시간 값으로 변경하여 변수에 저장.
$LastBootUpTime = [System.Management.ManagementDateTimeconverter]::ToDateTime($OS.LastBootUpTime)

# 현재 시간을 구함.
$Now = Get-Date

# Uptime 계산.
$UpTime = $Now - $LastBootUpTime

# 각 값을 계산하여 string 형식으로 변환 후 출력
[string]$UpTime.Days + " Days, " + [string]$UpTime.Hours + " Hours, " + [string]$UpTime.Minutes + " Minutes."

만약, 여러 줄의 주석을 넣고자 할 경우에는 <# #> 과 같은 형태로 감싸주면 됩니다. 아래 예제를 참고하세요.
<#
  여러 줄을 주석처리 하고 싶을 때
  이렇게 감싸주면 됩니다.
#>

<# 여러줄이 아니어도 상관은 없습니다. #>

<# 이런식으로도
    주석 처리가 됩니다. #>



스크립트를 작성 도중, 잠시 실행이 되지 않도록 처리 하고 싶은 부분이 있을 때에도 주석은 유용하게 사용 됩니다.
# $Machine = "."
$Machine = "MyServer01"

<#
$OS = Get-WmiObject Win32_OperatingSystem -ComputerName $Machine
$LastBootUpTime = [System.Management.ManagementDateTimeconverter]::ToDateTime($OS.LastBootUpTime)
#>


$LastBootUpTime = [System.Management.ManagementDateTimeconverter]::ToDateTime((Get-WmiObject Win32_OperatingSystem -ComputerName .).LastBootUpTime)

이상 PowerShell 에서 주석을 다는 방법을 알아 보았습니다.

주석은 스크립트의 내용 파악 및 이해를 쉽게 해 주기 때문에
나중에 다른사람이 스크립트를 재사용 하거나 유지 보수 작업을 할 때 크게 도움이 됩니다.
또 아무리 본인이 만든 스크립트라도 6개월, 1년 정도 지나면 파악이 쉽지 않은 경우가 많기 때문에, 본인에게도 크게 도움이 됩니다.

때문에 적절한 주석을 달아 두는 작업은 매우 중요합니다. 귀찮더라도 주석을 잘 달아 둡시다!
Posted by 알 수 없는 사용자
:
2010. 7. 22. 13:26
안녕하세요. 엉스데브 입니다.

PowerShell 에서는 도움말이 필요 할 때 Get-Help 명령어를 사용합니다.

하지만 Linux 환경에 익숙한 저는 자꾸 Get-Help 대신 man 명령어를 입력하게 되더군요.

다행히도 PowerShell은 이런 Unix 형태의 명령어의 일부를 그대로 입력 할 수 있게끔 지원 해 줍니다.
아니, 오히려 자동으로 페이지 단위로 끊어주는 등(more)  Get-Help 보다 더 좋은 기능을 제공 하는군요!

왜, 어떻게 이렇게 실행되는지 궁금합니다.
사실 저는 잘 모르는 것을 사용하는 것에 거부감을 느끼는 사람입니다.
그래서 man 명령어를 실행하면 무슨일이 일어나는지 추적 해 보기로 했습니다.

먼저 man 명령어의 정보를 봅니다.

man 명령어는 help 로 Alias 설정이 되어 있군요.

help 명령어의 정보를 봅니다.

help 명령어는 function 으로 선언되어 있는 명령어 군요.
function 일 경우, Definition 속성을 통해 내용을 확인 할 수 있습니다.
헌데 Definition 컬럼의 값이 "..." 로 표시 되는군요. 내용이 너무 길어서 표시 할 수 없는 경우 입니다.

Definition 값을 확인 해 봅시다.

help function 의 내용을 보니 상당히 복잡하군요..! 자세한 분석은 하지 않겠습니다.
다만 마지막 줄에 보니 Get-Help 명령어를 호출하고 more 를 통해 페이지를 나누어 주는군요!

이것으로 man 명령어를 실행시 PowerShell 이 내부적으로 어떻게 처리하는지 알게되었습니다.

앞으로는 마음 놓고 man 커맨드로 각종 도움말을 봐야 겠습니다. ^^

Posted by 알 수 없는 사용자
:
2010. 7. 22. 11:40
안녕하세요. 엉스데브 입니다.

기존에 Linux 및 bash 에 익숙한 저는 PowerShell 의 Prompt가 영 낯설게 느껴집니다.
그래서 Bash 스타일로 Prompt를 변경하는 방법을 찾아보았습니다.

먼저 도움말 목록에서 Prompt 에 관련된 항목이 있나 검색 해 보려합니다.
도움말에 내가 찾는 항목이 있는지 확인 해 볼 때에는, powershell_ise 에 포함되어 있는 도움말을 참고하는게 편하더군요.

먼저 powershell_ise 를 켜고..


도움말을 엽니다.


검색 탭을 선택해서 찾고자 하는 키워드를 넣고 검색 합니다.


about_prompt 라는 항목으로 도움말이 존재하네요. 읽어 봅시다.

...

대강 읽어 본 결과, 아래의 내용을 확인 할 수 있었습니다.
PowerShell 은 "prompt" 라는 이름의 함수를 통해 Prompt 를 어떻게 표시 할 것인지를 결정합니다.
"prompt" 함수는 기본적으로 PowerShell 에 의해 자동으로 만들어 지지만,
함수를 재정의해서 Prompt 표시 내용을 마음대로 변경 할 수도 있습니다.
또, 재정의 한 "prompt" 함수를 Windows PowerShell Profile 에 등록 해 두면, 항상 재 정의 된 Prompt 로 작업할 수 있습니다.

그럼 먼저 PowerShell 이 기본 제공 해 주는 "prompt" 함수의 내용을 살펴보겠습니다.
선언 되어 있는 함수의 내용을 살펴보려면, 해당 함수의 Deninition 속성을 확인 하면 됩니다.
Get-Item 명령어로 Function Provider 를 통해 "Prompt" 함수를 확보 한 뒤, Definition 속성을 확인 합니다.
(Get-Item Function:\prompt).Definition



PowerShell 에서 기본 제공 하는 "prompt" 함수의 내용은 이렇군요.

자~ 그럼 Bash 스타일로 바꾸기 위해서 "prompt" 함수를 재정의 해 봅시다.
구글링을 통해 Bash 스타일의 "prompt" 함수 예제를 찾을 수 있었습니다. 바로 아래 코드 입니다.
Function prompt { 
  "[$env:username@$([System.Net.Dns]::GetHostName()) $(Get-Location)]$ "
}

코드를 실행 해 보니, 아래와 같이 표시 됩니다.


음~ 이제 Bash 스타일과 많이 비슷 해 졌는데.. 경로명 표시하는 부분이 마음에 들지 않네요.

제가 주로 사용하던 CentOS + Bash 조합의 기본 Prompt 는 경로명을 표시 할 때 전체 경로가 아닌 현재 작업 중인 디렉토리의 이름만 표시하게끔 되어 있습니다. "prompt" 함수를 고쳐서 현재 디렉토리의 이름만 표시 하도록 변경 하겠습니다.

Function prompt { 
  "[$env:username@$([System.Net.Dns]::GetHostName()) $((Get-Item (Get-Location)).Name))]$ "
}

자, 아래와 같이 표시가 변경 되었습니다.


이제 친숙한 모습의 Prompt 를 사용 할 수 있게 되었습니다. 만족스럽네요.

자, 이제 마지막으로, Profile 파일에 이 함수를 추가 해서 PowerShell 실행 시 기본적으로 이 Prompt 를 쓸 수 있도록 해야 겠습니다.

먼저 현재 사용되고 있는 Profile 파일의 경로 및 살재 존재여부를 확인 해 봤습니다.


경로는 "C:\Users\ungs.SDS.000\Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1" 이고, 이미 존재 하는 파일 이네요.

Profile 파일을 열어서 새로 만든 prompt 함수를 추가 합니다.



메모장으로 추가 한 내용을 저장 하고, 새로운 PowerShell 창을 띄워서 잘 되는지 확인 할 차례입니다.


음! 잘 되는군요.
이제 익숙한 스타일의 Prompt 로 PowerShell 을 사용 할 수 있겠네요.

위 기록을 참고해서 여러분들도 각자 자신이 편한대로 Prompt 를 설정해서 사용해 보세요~!



<참고 문서>
Windows Power Shell 도움말 > Windows PowerShell About 도움말 항목 > about_Prompts
man "about_Prompts" -full

<참고 URL>
http://itnervecenter.com/content/make-your-windows-powershell-prompt-look-your-bash-prompt
Posted by 알 수 없는 사용자
:
2010. 7. 22. 11:25
안녕하세요. 엉스데브입니다.

PowerShell 을 사용하다보면, 현재 어떤 변수들이 선언되어 있는지 궁금 해 질 때가 있습니다.
해서 도움말을 뒤척거려 현재 선언되어 있는 변수를 확인할 수 있는 방법을 검색 해 보았습니다.

1. Get-Variable 명령 사용

Get-Variable 명령어를 아무런 추가 파라미터 없이 사용하면, 현재 선언되어 있는 모든 변수를 확인 할 수 있습니다.


2. 변수 공급자(Variable Provider) 사용

파워쉘은 일반 드라이브처럼 접근해서 사용 할 수 있도록 변수 공급자(Variable Provider)를 제공합니다.
dir(Get-ChildItem 의 Alias)명령어로 "Variable:" 드라이브의 내용을 확인 해 보면, 선언된 변수들이 보입니다.



만약, 특정 변수가 선언되어 있는지를 확인 하려면, 아래의 명령어를 사용 하면 됩니다.
Test-Path Variable:\{변수명}
예) $PROFILE 변수가 선언되어 있는지 확인 하려면, 아래의 명령어를 실행 합니다.
     Test-Path Variable:\PROFILE




만약, 필요 없는 변수를 제거하고자 한다면, 아래의 명령어를 사용 하면 됩니다.
Remove-Item Variable:\{변수명}
혹은
Remove-Variable {변수명}

예) $ProfileHome 변수를 삭제하고자 한다면, 아래의 명령어를 실행 합니다.
    Remove-Item Variable:\ProfileHome
    혹은
    Remove-Variable "ProfileHome"





PowerShell 은 상당히 직관적이고 유연하게 변수를 운용 할 수 있다는 느낌을 받았습니다. 
스크립트 제작시 상당히 편리할것 같네요.

<참고 문서>
Windows PowerShell 도움말 > Windows PowerShell 공급자 도움말 항목 > Variable Provider
Get-Help "about_Variables" -full
Posted by 알 수 없는 사용자
:
2010. 7. 22. 09:00


안녕하세요? 윈디안입니다!

파워쉘 스냅인 중 흥미로운 녀석이 있어 소개해 드리려 합니다.

WASP(Windows Automation Snapin for Powershell)
http://wasp.codeplex.com/

이 녀석은 무엇일까요?

이름에도 나와 있듯이 자동화(Automation)를 구현할 수 있는 스냅인입니다.

그럼 어떻게 자동화를 구현할까요?

AutoHotkey라는 프로그램 들어 보신적 있나요? 매크로를 이용한 자동화 프로그램입니다.
저는 이 것과 유사하다고 느꼈습니다.

지원하는 Cmdlet은 아래와 같습니다.


  • Select-Window - pick windows by process name or window caption (with wildcard support)
  • Select-ChildWindow - pick all owned windows of another window (eg: dialogs, tool windows)
  • Select-Control - pick controls (children) of a specific window, by class and/or name and/or index (with wildcard support) -- NOTE: the "Window" can be specified as "-Window 0" to get all parentless windows, which includes windows, dialogs, tooltips, etc... With -Window 0 this returns a true superset of the Select-Window output.
  • Send-Click - send mouse clicks (any button, with any modifier keys)
  • Send-Keys - Windows.Forms.SendKeys lets you send keys ... try this: Select-Window notepad | Send-Keys "%(ea)Testing{Enter}{F5}" (and for extra fun, try it with multiple notepad windows open).
  • Set-WindowActive - yeah, just activates the window
  • Set-WindowPosition - set any one of (or all of) top, left, width, height on a window ... or maximize/minimize/restore
  • Get-WindowPosition - get the position (kind-of redundant, actually, since the Window object has it's position as a property)
  • Remove-Window - closes the specified window
  • Cmdlet을 보시면 느낌이 확 오시죠? 윈도우를 선택, 활성화,창크기 변경, 창 닫기, Keyboard,Mouse Action 등을 할 수 있습니다.

    http://wasp.codeplex.com/releases/22118/download/55849

    압축파일을 다운로드 하면 파일이 3개 있는데 이 중 Install.ps1을 파워쉘에서 실행하시면 됩니다.
    저는 -Force 스위치를 사용하여 설치했습니다.

    PS C:\Users\windian7.SDS\Downloads\WASP\WASP> dir


        디렉터리: C:\Users\windian7.SDS\Downloads\WASP\WASP


    Mode                LastWriteTime     Length Name
    ----                -------------     ------ ----
    -a---      2009-01-20  오전 12:50       2570 Install.ps1
    -a---      2009-01-20  오전 12:53        520 UnInstall.ps1
    -a---      2009-01-21  오전 11:13      43008 WASP.dll


    PS C:\Users\windian7.SDS\Downloads\WASP\WASP> .\Install.ps1 -force
    You're running PowerShell 2.0, so you don't need to Install this as a PSSnapin,
    you can use Import-Module (or Add-Module in CTP2) to load it.  If you still want
     to install it as a PSSnapin, re-run this script with -Force
    Microsoft (R) .NET Framework Installation utility Version 2.0.50727.4927
    Copyright (c) Microsoft Corporation. All rights reserved.


    트랜잭트 설치를 실행하고 있습니다.

    설치의 Install 단계를 시작하고 있습니다.
    C:\Users\windian7.SDS\Downloads\WASP\WASP\WASP.dll 어셈블리의 진행 상황을 보려면
     로그 파일 내용을 검토하십시오.
    파일은 C:\Users\windian7.SDS\Downloads\WASP\WASP\WASP.InstallLog 위치에 있습니다
    .
    어셈블리 'C:\Users\windian7.SDS\Downloads\WASP\WASP\WASP.dll'을(를) 설치하고 있
    습니다.
    영향을 받는 매개 변수:
       assemblypath = C:\Users\windian7.SDS\Downloads\WASP\WASP\WASP.dll
       logfile = C:\Users\windian7.SDS\Downloads\WASP\WASP\WASP.InstallLog
       logtoconsole =

    Install 단계는 완료되었으며 Commit 단계를 시작하고 있습니다.
    C:\Users\windian7.SDS\Downloads\WASP\WASP\WASP.dll 어셈블리의 진행 상황을 보려면
     로그 파일 내용을 검토하십시오.
    파일은 C:\Users\windian7.SDS\Downloads\WASP\WASP\WASP.InstallLog 위치에 있습니다
    .
    어셈블리 'C:\Users\windian7.SDS\Downloads\WASP\WASP\WASP.dll'을(를) 커밋하고 있
    습니다.
    영향을 받는 매개 변수:
       assemblypath = C:\Users\windian7.SDS\Downloads\WASP\WASP\WASP.dll
       logfile = C:\Users\windian7.SDS\Downloads\WASP\WASP\WASP.InstallLog
       logtoconsole =

    Commit 단계가 완료되었습니다.

    트랜잭트 설치가 완료되었습니다.

    CommandType     Name                            Definition
    -----------     ----                            ----------
    Cmdlet          Get-WindowPosition              Get-WindowPosition [-Window]...
    Cmdlet          Remove-Window                   Remove-Window [-Window] <Win...
    Cmdlet          Select-ChildWindow              Select-ChildWindow [-Window]...
    Cmdlet          Select-Control                  Select-Control [[-Index] <In...
    Cmdlet          Select-Window                   Select-Window [[-ProcessName...
    Cmdlet          Send-Click                      Send-Click [[-Left] <Int32>]...
    Cmdlet          Send-Keys                       Send-Keys [-Keys] <String> [...
    Cmdlet          Set-WindowActive                Set-WindowActive [-Window] <...
    Cmdlet          Set-WindowPosition              Set-WindowPosition [[-Left] ...
    To load the Windows Automation Snapin in the future, you need to run:
    Add-PSSnapin WASP

    You can also add that line to your Profile script to load it automatically.



    설치 완료 후 다음 파워쉘 실행 시 "Add-PSSnapin WASP"을 통해서 스냅인을 로드해야 Cmdlet을 사용할 수 있습니다.
    (프로필을 통해서 자동으로 로드 되도록 할 수도 있습니다.)


    그럼 예제를 보겠습니다.

    ## 윈도우를 두개 실행합니다.
    notepad.exe
    explorer.exe


    ## 윈도우 리스트를 출력합니다.
    Select-Window | ft –auto

    ## 노트패드를 활성화합니다.
    Select-Window notepad* | Set-WindowActive

    ## 탐색기를 종료합니다.
    Select-Window explorer | Select -First 1 | Remove-WIndow

    ## 노트패드를 여러개 실행합니다.
    notepad; notepad; notepad; notepad;

    ## 노트패드 위치 변경하기
    $i = 1;$t = 100; Select-Window notepad | ForEach { Set-WindowPosition -X 20 -Y (($i++)*$t) -Window $_ }

    ## 노트패드에 텍스트를 입력합니다.
    Select-Window notepad | Send-Keys "테스트입니다!!!"

    ## 첫번째 notepad를 ALT+F4로 종료합니다.
    Select-Window notepad | Select -First 1 | Send-Keys "%{F4}"

    ## "Remove-Window" Cmdlet을 통해 notepad를 종료합니다. 키 명령을 통해서 저장하지 않고 종료합니다.
    Select-Window notepad | Select -First 1 | Remove-Window -Passthru | Select-ChildWindow | Send-Keys "n"

    ##  ProcessID 파이프를 통해 Kill 명령으로 notepad를 종료합니다.
    Select-Window notepad | Select -First 1 | kill

     

    이렇게 파워쉘을 통해서 윈도우를 컨트롤 할 수 있습니다.
    응용하기에 따라 유용한 도구가 될 것 같습니다.

    그럼 다음 포스팅에서 뵙겠습니다.

    PS. 스냅인 사용을 위해서는 Add-PSSanpin 명령을 통해 해당 스냅인을 로드해야 합니다. 기억하세요.

    Posted by 알 수 없는 사용자
    :
    2010. 7. 21. 11:35

    1. PowerShell의 인증

    PowerShell
    사용하면서 외부의 스크립트를 실행하거나, 로컬에서 스크립트를 실행해야 하는 경우가 발생하게 되는데, 이때 대부분 실행정책(Execution_Policy) 인하여 정상적인 실행이 되지 않는 경우가 발생 합니다.

     

    문제를 해결하기 위해서는 Execution Policy RemoteSigned 수정하거나, 인증서를 생성하여 인증 절차를 진행해야 하는데, RemoteSigned 대한 내용은 너무 쉽고 간단하므로, 인증서를 발급받아 처리 하는 과정에 대하여 보도록 하겠습니다.

    - RemoteSigned 설정 방법 보기 ▼ more Click!


    우선
    인증서를 생성하기 위해서는 인증 과정을 알아야 입니다.

    PowerShell 이러한 인증 과정에 대하여 상세하게 매뉴얼로 설명을 하고 있으며, 매뉴얼을 PowerShell 내에서도 확인 수가 있습니다.


    - About_Signing
    관련 문서 : http://technet.microsoft.com/ko-kr/library/dd347649.aspx

    - About_Signing 매뉴얼 명령어 : [Get-Help about_signing]

     

    Microsoft에서 제공하는 뉴얼을 보면 스크립트 서명 방법에 대하여 2가지를 제시하고 있습니다.

    • 공인 인증 기관에서 만든 인증서 : 공인 인증기관에서 유료로 사용자에게 발급하는 코드 서명 인증서
    • 사용자가 만든 인증서 :사용자가 자신의 컴퓨터를 인증기관 역할을 있도록 설정하여 자체 서명된 인증서를 발급하므로 무료로 발급하여 사용이 가능.


    PowerShell
    공부하는데 돈이 들어가면 안되겠죠? 우리는 여기서 사용자가 만든 인증서(개인 인증서)를 이용하도록 하겠습니다.


    2. PowerShell의 개인 인증서 만들기
     

    인증서를 만들기 위해서는 우선 인증서 생성 도구가 있어야 하며, 도구는 .Net Framework SDK 1.1 이상 버전에 포함되어 있으며 아래 URL에서 다운로드 받을 있습니다.

  • .NET Framework SDK 2.0 Download : http://www.microsoft.com/downloads/details.aspx?familyid=fe6f2099-b7b4-4f47-a244-c96d69c35dec&displaylang=en
  • Window SDK Download : http://msdn.microsoft.com/ko-kr/windows/bb980924.aspx
  • MakeCert 관련 문서 : http://go.microsoft.com/fwlink/?LinkId=119097
  •  

     

    저는 제가 사용중인 Windows7 맞는 SDK Microsoft Windows SDK for Windows 7 and .NET Framework 3.5 SP1 다운로드 받아 설치하였습니다.

     

    모든 설치가 완료 되었다면, 이제 인증서 생성 도구인 makecert 실행해야 하지만, 그전에 사전 준비 작업을 진행하도록 하겠습니다.

    1) 우선 시
    버튼을 누른 mmc.exe 실행 하도록 합니다.


    2) 콘솔 창이 열리면 [파일] -> [스냅인 추가/제거] 버튼을 눌러 스냅인 페이지를 띄워줍니다. (단축키는 Ctrl + M)
    3)
    [스냅인 추가/제거] 창이 열리면 [인증서] 선택 추가 버튼을 누릅니다.


    4) 스냅인이 관리할 인증서 대상은 [ 사용자 계정] 선택 마침을 눌러 스냅인을 완료 합니다.
     

    스냅인이 완료 되었다면, 이제 실제 개인 인증서를 생성해야 합니다. 이를 생성하기 위해서는 위에서 말씀 드린바와 같이 makecert 툴을 사용해야 합니다.


    Windows SDK
    설치한 경우라면, Windows 7 SDK 포함된 CMD 띄워서 실행하도록 하겠습니다.


     

    위와 같이 makecert 실행되는 것을 확인 했다면, 다음 명령어를 실행하여 인증서를 생성하도록 합니다.
     

    <Root 인증서>

    makecert -n "CN=PowerShell Local Certificate Root" -a sha1 -eku 1.3.6.1.5.5.7.3.3 -r -sv root.pvk root.cer -ss Root -sr LocalMachine


    Root
    인증서를 생성하기 위해 위와 같이 명령어를 실행했다면, 아래 그림과 같이 개인키 암호 만들기 라는 창이 보여질 입니다.

     

    보안상 암호를 설정 하도록 하겠습니다.

    2번의 암호 설정 입력이 끝나면, 입력한 암호에 대하여 확인하는 암호 입력창이 다시 한번 출력됩니다.



     정상적으로 Root 인증서와 사용자 인증서가 설치되었다면, MMC에서 해당 내용을 확인 있습니다.

    [MMC 실행 인증서 스냅인 추가] -> [신뢰할 있는 루트 인증기관] -> [인증서] -> [PowerShell Local Certificate Root]


     

    관리자 인증서 생성이 완료되었으니, 이제 사용자 인증서를 생성해 보도록 하겠습니다.


    <사용자 인증서>
     

    makecert -pe -n "CN=PowerShell User" -ss MY -a sha1 -eku 1.3.6.1.5.5.7.3.3 -iv root.pvk -ic root.cer


    Root 인증서를 만들때와 마찬가지로 개인키 암호를 입력하는 창이 출력되며, 해당 창에 개인키에 대한 암호를 입력하시면 정상적으로 생성이 됩니다.


     

    이제 Root 인증서와 사용자 인증서 2 모두 생성이 되었으니, 사용자 인증서에 대한 내용을 PowerShell에서 확인해 보도록 하겠습니다.

     

    PowerShell 창에서 아래 명령어 입력을 통해 확인이 가능 합니다.

    PS C:\Windows\system32> Get-Childitem cert:\CurrentUser\my -codesigning

     

        디렉터리: Microsoft.PowerShell.Security\Certificate::CurrentUser\my

     

    Thumbprint                                                  Subject

    ----------                                                      -------

    A9BB73523B24247BCFBE9B7B7E0B7723F559209C  CN=PowerShell User


    생성된 인증서는 MMC 스냅인을 통해서도 확인이 가능 합니다.

     

    정상적으로 인증서를 만들었다면, 인증서를 이용해서 자신이 실행하고자 하는 스크립트 또는 작성한 스크립트에 Signing 진행해 보도록 하겠습니다.

    아래 내용은 Sign 되지 않은 스크립트와 Sign 스크립트의 실행 결과 차이 입니다.

     

    PS C:\Users\mrmsm.SDS> Set-ExecutionPolicy Allsigned

    PS C:\Users\mrmsm.SDS> .\GetProcess_Script.ps1

    C:\Users\mrmsm.SDS\GetProcess_Script.ps1 파일을 로드할 수 없습니다. C:\Users\mrmsm.SDS\GetProcess_Script.ps1 파일에 디

    지털 서명하지 않았습니다. 스크립트가 시스템에서 실행되지 않습니다. 자세한 내용은 "get-help about_signing"을 참조하십시오..

    위치 줄:1 문자:24

    + .\GetProcess_Script.ps1 <<<<

        + CategoryInfo          : NotSpecified: (:) [], PSSecurityException

        + FullyQualifiedErrorId : RuntimeException

     

    PS C:\Users\mrmsm.SDS> $cert = @(Get-ChildItem cert:\CurrentUser\My -codesigning)[0]

    PS C:\Users\mrmsm.SDS> Set-AuthenticodeSignature .\GetProcess_Script.ps1 $cert

     

        디렉터리: C:\Users\mrmsm.SDS

     

    SignerCertificate                                             Status                                 Path

    -----------------                                               ------                                 ----

    79DBB89D221B3B7A4266E39D8F79F049CE03A644  Valid                                  GetProcess_Script.ps1

     

    PS C:\Users\mrmsm.SDS> .\GetProcess_Script.ps1

     

    Handles  NPM(K)    PM(K)      WS(K) VM(M)   CPU(s)     Id ProcessName

    -------  ------    -----      ----- -----   ------     -- -----------

        420      10     6140       8696    88     9.80   3532 atbsvc

        535       5     1304       1868    49            1356 atieclxx

         97       4      820       1240    27             940 atiesrxx

        118       5    15352      14208    40            5108 audiodg

         74       4     1672       1388    55            4032 CKAgent

         75       7    11044        532    84     0.08   5864 ClientSM

         95       5     4956       9364    64     1.97   6272 conhost

     

                            --- 생략 ---



    위의 내용을 보면 ExecutionPolicy Allsigned 설정함으로써 Sign 스크립트만 실행하도록 설정하였고, Sign되지 않은 스크립트는 로드 되지 않고 에러메세지가 출력됨을 확인 있습니다. 스크립트에 Set-AuthenticodeSignature 명령을 이용하여 Sign 진행 하였고, 실행 결과가 정상적으로 출력됨을 확인 있습니다.

     

    Set-AuthenticodeSignature 명령에 대한 자세한 사용 방법은 [Get-Help Set-AuthenticodeSignature] 명령을 입력하여 확인이 가능 합니다.



    !! 알고 가세요

     PowerShell ISE에서 작성한 스크립트를 Signature 경우 아래 내용과 같이 정상적인 Signing 되지 않는 현상이 발생 있습니다. 이는 PowerShell ISE 버그로 ISE에서 생성된 스크립트는 Signing 되지 않음을 아래 URL에서 확인하실 있습니다.

    # notepad에서 작성한 Script

    PS C:\Users\mrmsm.SDS> Set-AuthenticodeSignature .\GetProcess_Script.ps1 $cert

     

        디렉터리: C:\Users\mrmsm.SDS

     

    SignerCertificate                                         Status                                 Path

    -----------------                                            ------                                  ----

    79DBB89D221B3B7A4266E39D8F79F049CE03A644  Valid                                  GetProcess_Script.ps1

     

    # PowerShell ISE에서 작성한 Scirpt

    PS C:\Users\mrmsm.SDS> Set-AuthenticodeSignature .\ISE_Script.ps1 $cert

     

        디렉터리: C:\Users\mrmsm.SDS

     

    SignerCertificate                      Status                                     Path

    -----------------                         ------                                       ----

                                              UnknownError                           ISE_Script.ps1

    - ISE 버그 관련 참고 URL : http://connect.microsoft.com/PowerShell/feedback/details/483431/set-authenticodesignature-fails-on-scripts-created-from-iSe


    !! 알고 가세요
     Set-ExecutionPolicy 사용하는데에 있어 실행 정책들이 어떤 내용을 가지고 있는지 모르고 설정 하면 안되겠죠?
    다음 내용은 ExecutionPolicy 대한 변수들의 설명입니다.

    • Restricted : 구성 파일을 로드하거나 스크립트를 실행하지 않습니다. 기본값 입니다.
    • AllSigned : 로컬 컴퓨터에 ㅈ가성하는 스크립트를 포함하여 모든 스크립트 구성파일에 신뢰된 게시자가 서명해야 합니다.
    • RemoteSigned : 인터넷에서 다운로드한 모든 스크립트 구성파일에 대해 신뢰된 게시자가 서명해야 합니다. (, 로컬에서 작성한 스크립트는 문제가 없습니다.)
    • Unrestricted : 모든 구성파일을 로드하고 모든 스크립트를 실행합니다. 인터넷에서 다운로드한 서명되지 않은 스크립트를 실행할 경우 실행하기 전에 사용권한을 묻는 메시지가 표시됩니다.
    • ByPass : 아무것도 차단하지 않으며, 경고나 메시지도 표시되지 않습니다.
    • Underfinded : 현재 할당된 실행 정책을 현재 범위에서 제거 합니다. 매개변수는 그룹정책 범위에 설정된 실행 정책을 제거하지 않습니다.

    우리가 흔히 Local 상에서 작성한 스크립트가 실행되지 않을 [Set-ExecutionPolicy RemoteSigned] 실행하라고 합니다. 명령을 실행하면 인터넷에서 다운로드한 모든 스크립트에 대해서만 Signature 필요하기 때문에 Local에서 작성한 스크립트는 아무런 제약 없이 실행 수가 있는 것입니다.

    <참고 URL>
    http://technet.microsoft.com/ko-kr/library/dd347649.aspx
    http://www.hanselman.com/blog/SigningPowerShellScripts.aspx
    http://technet.microsoft.com/ko-kr/library/dd347628.aspx

    Posted by 마성민
    :

    BLOG main image
    Windows Server를 공부 하는 사람들의 팀블로그 by 마성민

    카테고리

    분류 전체보기 (76)
    Windows (2)
    Powershell (56)
    AD (0)
    Exchange (6)
    System Center (9)
    IIS (0)
    SQL (3)
    Sharepoint (0)

    태그목록

    Tistory Cumulus Flash tag cloud by BLUEnLIVE requires Flash Player 9 or better.

    Total :
    Today : Yesterday :