잊지 않겠습니다.

.NET 객체를 이용하는 PowerShell의 object들은 모두다 이용가능하지만, Powershell은 결정적으로 자신만의 .NET 객체를 만들지 못하는 단점을 가지고 있다.

그렇지만, 시스템 관리 및 MS에서 제공되는 대부분의 (SCVMM, Exchange, MS-SQL) 제품들은 Powershell에서 사용할 수 있는 방법 및 cmdlet을 제공하고 있고, 이를 이용하면 불편하게 시스템을 바닥까지 긁어가면서 개발을 하지 않아도 된다.

그리고, .NET 객체로 PowerShell을 이용해서 개발을 할 수 있는 방법을 역시 MS가 제공하고 있기 때문에.. PowerShell만 조금 알고, 약간의 개발을 한다면 손쉽게 PowerShell을 이용해서 시스템을 제어하는 프로그램을 만들어줄 수 도 있다.

PowerShell을 이용한 개발을 하기 위해서는 다음과 같은 절차가 이루어져야지 된다.

1. PowerShell Runspace를 정해준다.
2. 실행될 Script가 동작될 Pipeline을 만들어준다.
3. Command 생성
4. Pipeline을 통해서 Script를 invoke 시켜준다.


1. Runspace 생성
Runspace는 자신의 application이 동작할 system pool과 동일한 개념이다.
먼저 RunspaceConfiguration을 만들어준 후, 그 Configuration을 이용해서 Runspace를 만들어준다.

2. Pipeline 생성
Pipeline은 Powershell을 사용하면 쉽게 알 수 있는 하나의 cmdlet이 실행될 때, 그에 대한 output의 연결 통로이다. 예를 들어, 아래와 같은 script가 실행이 되었을때,
get-service에서 얻어지는 모든 객체를 ForEach-Object 구문으로 전달하게 되는 것이 get-service 명령어가 종료된 이후에 pipeline을 통해서 전달되게 된다. Pipeline의 생성 구문은 다음과 같다. IDispose Interface를 상속받고 있기 때문에 using을 사용하는 것이 code가 깔끔해진다.

3. Command 생성
이제 판을 벌인 상태이고, 여기에서 굿을 보던 떡을 팔던 할 차례이다. cmdlet을 Command로 만들어주고, 그 cmdlet의 parameter를 각각 넣어주면 된다. 여기에서 재미있는 점중 하나가.. 일반적으로 get-service "SMS" 라고 넣어주면 되었던 것들이 get-service -name "SMS" 라는 식으로 full name으로 들어가져야지 된다는 것이다. Name이 없이 넣는 방법은 못찾겠다. ;;

재미있는 것이 pipeline에 여러 command를 넣는 것이 가능하다는 것이다. 여러 command를 넣어서 여러 작업을 동시에 automation을 시킬때 편리할 듯 싶다.

4. Pipeline Invoke
Invoke를 통해서 실행을 하고 그 return 값을 받는데.. 이 받는 과정이 조금 재미있다. PowerShell은 .NET 을 이용한다. 따라서, 이 Invoke의 Return값도 .NET 객체 또는 Wmi Script의 결과가 나오게 되는데. .NET만이 나온다면 System.Object를 사용하면 될 것 같은데.. WMI Object 역시 지원하고 있기 때문에 PSObject라는 약간 생뚱 맞은 Object가 튀어나오게 된다. PSObject에서 ImmediateObject Property를 이용해서 .NET Object로 casting을 해줘서 .NET에서 사용해줘도 되고, 그냥 일반적으로 PSObject.ToString()을 호출해주면 PowerShell에서 나오는 결과와 동일한 결과를 나타나게된다.

casting을 시켜줄때가 가장 문제인것 같은데.;;


Posted by Y2K
,