이번에는 윈도우 서버관리에 있어 중요한 오류 메시지를 확인 할 수 있는 이벤트 로그를 파워쉘을 이용하여 확인해 보도록 하겠습니다.
get-Eventlog Cmdlets을 이용하여 아래와 같이 보안에 관련된 이벤트 로그를 확인하였습니다.
Powershell의 기능을 좀더 활용 하여 아래와 같이 검색을 원하는 로그 파일을 종류 Application(응용프로그램), securuty(보안)등 원하는 로그에 대하여 -LogName (로그이름) -Message (*성공적*) 포함한 내용에 대하여 -After(검색을원하는기간)을 사용하여 로그를 조회 확인하였습니다.
PowerShell 로 필요한 스크립트를 만들던 중, MSSQL 서버에 저장 되어 있는 데이터를 참조해야 하는 경우가 생겼습니다.
PowerShell 은 .NET Framework 기반의 언어이기 때문에 .NET Framework 가 제공하는 여러 클래스를 사용 할 수 있으며, 이 클래스 들 중에는 MSSQL 접속 및 데이터 조회 / 수정을 위한 클래스 들도 있습니다. 이 클래스 들을 이용해서 직접 사용 할 MSSQL 관련 함수들을 만들어 보았습니다.
함수는 Insert, Update, Delete 등 결과 레코드가 반환되는 것이 아닌 단순 실행 쿼리를 날릴 때 사용하며, Get-MssqlData 함수는 Select 등 리턴되는 데이터가 있는 쿼리를 날릴 때 사용합니다.
#아래 더보기를 클릭하시면 다소 복잡한 스크립트 설명을 볼 수 있습니다.#
MSSQL 서버의 접속은 System.Data.SqlClient.SqlConnection 클래스를 이용합니다. New-Object cmdlet 으로 개체를 생성한뒤, ConnectionString 속성에 접속 관련 정보를 설정 해 둡니다. 그 후 Open() 메소드를 호출하면 접속 됩니다.
실행 할 쿼리는 System.Data.SqlClient.SqlCommand 클래스를 사용합니다. New-Object cmdlet 을 통해 개체를 생성하고, CommandText 속성에 실행 할 쿼리를 넣어 준 뒤 Connection 속성에 기존에 열었던 MSSQL 서버 접속 개체를 지정 해 줍니다. CommandTimeout 이란 속성을 통해 해당 쿼리의 실행 시간을 제한 할 수도 있습니다.
쿼리를 실행하는 방법은 해당 쿼리의 종류에 따라 두가지로 나뉩니다. 바로 SELECT 등의 결과셋 반환 쿼리와 INSERT, UPDATE, DELETE 등의 비반환 쿼리이지요.
결과셋 비반환 쿼리의 경우, System.Data.SqlClient.SqlCommand 개체의 ExecuteNonQuery() 메소드를 이용해서 실행 할 수 있습니다. 리턴되는 값은 영향을 받은 행의 개수이지요.
결과셋 반환 쿼리의 경우, System.Data.SqlClient.SqlDataAdapter 개체를 사용합니다. New-Object cmdlet 으로 개체를 만들어 주고, SelectCommand 파라미터에 만들어 둔 System.Data.SqlClient.SqlCommand 개체를 지정 해 줍니다. 그 뒤, Fill() 메소드를 호출해서 쿼리를 실행 할 수 있습니다. Fill() 메소드에는 System.Data.DataSet 타입의 개체를 넣어주어야 하는데, 미리 New-Object cmdlet 으로 System.Data.DataSet 개체를 만든 뒤 지정 해주면 됩니다.
반환 값은 System.Data.DataSet 형식의 개체입니다.
이제 PowerShell 에서 MSSQL 데이터도 엑세스 및 수정 할 수 있으니, 좀 더 정교한 스크립트를 만들어 봐야 겠습니다. ^^
Windows 7, Windows 2008 R2 부터 IIS 를 설치 시 PowerShell 용 IIS 관리 모듈이 같이 설치 됩니다. 이 모듈의 이름은 “WebAdministration” 이며, PowerShell 에서 Import-Module cmdlet 으로 불러들여서 사용 할 수 있습니다.
먼저, WebAdministration 모듈이 존재하는지 확인 합니다.
Get-Module -ListAvailable
해당 모듈을 사용 할 수 있도록 Import 합니다.
Import-Module -Name WebAdministration
“IIS 구성 데이터에 액세스하려면 프로세스에서 높은 상태를 가져야 합니다.” 라는 오류메시지가 나오는 군요. PowerShell 을 관리자 권한으로 실행 시켜야겠네요.
잘 만들어 졌습니다. 자동으로 시작 상태가 되었군요.
WebAdministration 모듈은 IIS: 라는 Provider 도 제공 합니다. 해당 Provider 를 통해 마치 하드디스크의 파일 내용을 탐색 하듯이 탐색 해 볼 수가 있습니다.
IIS:\ 의 내용을 살펴 보면, 다음과 같은 내용을 확인 할 수 있습니다.
AppPools 에는 현재 만들어진 모든 ApplicationPool 이 들어있고, Sites 엔 현재 만들어진 모든 사이트가 들어있습니다.
만들어진 아이템(ApplicationPool, 사이트)의 속성을 변경하고 싶다면, Set-ItemProperty cmdlet 을 사용하면 됩니다. PhysicalPath 를 “C:\wwwroot” 로 변경 해 보았습니다.
주석은 스크립트의 내용 파악 및 이해를 쉽게 해 주기 때문에
나중에 다른사람이 스크립트를 재사용 하거나 유지 보수 작업을 할 때 크게 도움이 됩니다.
또 아무리 본인이 만든 스크립트라도 6개월, 1년 정도 지나면 파악이 쉽지 않은 경우가 많기 때문에, 본인에게도 크게 도움이 됩니다.
때문에 적절한 주석을 달아 두는 작업은 매우 중요합니다. 귀찮더라도 주석을 잘 달아 둡시다!
하지만 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 이 내부적으로 어떻게 처리하는지 알게되었습니다.
기존에 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 를 설정해서 사용해 보세요~!
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 등을 할 수 있습니다.
압축파일을 다운로드 하면 파일이 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을 사용할 수 있습니다.
(프로필을 통해서 자동으로 로드 되도록 할 수도 있습니다.)
## "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 명령을 통해 해당 스냅인을 로드해야 합니다. 기억하세요.
- Get-ExecutionPolicy 를 입력하시면 현재 설정된 실행정책(Execution_Policy)를 확인 할 수가 있습니다. 별도로 재설정을 하지 않았다면, 대부분 Restricted로 설정되어 있을 것 입니다. 이 실행정책을 변경하여 로컬에서 만든 스크립트를 실행 하려면 다음 명령을 입력하시면 됩니다.