Powershell에서 Email 보내기


Send-MailMessage를 사용하여 자신의 상용 메일을 이용하여 상대방에게 이메일을 보낼 수 있다. 특히 아래와 같이 작업하여 mymessage.ps1을 만들어 보내면 쉽게 보낼 수 있다.

또한 Windows Server를 사용하여 smtp Server를 자신이 만들어서 사용한다면 불편하게 암호를 입력하지 않고도 쉽게 보낼 수 있다. 이렇게 하는 장점은 사용자가 로그온/로그오프 할 때 자동으로 이메일을 보낼 수 있다는 것이다.

1) Hotmail을 이용하여 SSL로 메시지 보내기

Send-MailMessage -From jesuswithme@hotmail.com -SmtpServer smtp.live.com -UseSsl $true -Port 587 -Credential (Get-Credential jesuswithme@hotmail.com) -To jesuswithme@gmail.com -Subject “This is my message from Powershell” -Body “How is it going?” -Attachments C:\temp\project.txt

** 이렇게 하면 Popup 창이 나타나는데 jesuswithme@hotmail.com의 자신의 password를 입력해야 한다

** .ps1 스크립틀 만들 때 Param()을 이용하면 To, Subject, Attachment등을 다양하게 입력하면서 이메일을 보낼 수 있다.

2) 로컬 SMTP Server를 이용하여 메일 보내기

Send-MailMessage -From jesuswithme@hotmail.com -SmtpServer localhost  -To jesuswithme@gmail.com -Subject “This is my message from Powershell” -Attachments C:\temp\project.txt

3) Param()을 이용하여 스크립트를 생성하여 메일 보내기

Param (
[Parameter(Mandatory=$True)]
$To,
[Parameter(Mandatory=$True)]
$Subject,
[Parameter(Mandatory=$True)]
$Body
)
Send-MailMessage -From jesuswithme@hotmail.com -SmtpServer localhost -To $To -Subject $Subject -Body $Body

** 이것을 SendMail.ps1 파일로 저장하여 실행하면 To:,  Subject:, $Body: 가 Popup이 되면 적절하게 입력하여 메일을 보낼 수 있다.

User Mailbox를 다른 Mailbox Database로 이동하기


  • 사용자의 사서함을 다른 서버의 Mailbox Database로 옮기고자 한다
  • 직원의 근무 부서를 옮기는 경우 그 직원이 근무하는 쪽에 있는 사서함 서버로 이동하는 것이 필요하다.
  • 한 사용자의 사서함을 옮기기 위해서는 다음과 같이 하면 된다.
    • 해당 Recipient를 선택한다
    • 마우스 우측 버튼을 클릭하여 [New Local Move Request]를 클릭한다.
    • [Target Mailbox Database] Browse를 클릭하여 이동하고자 하는 Mailbox Database를 선택한다
    • 이렇게 하면 사용자 사서함이 다른 곳으로 이동된다
  • 이것을 [Exchange Management Shell]을 사용하면 다음과 같이 하면 된다.
    • Get-Mailbox -Identity wei | New-MoveRequest -TargetDatabase “Accounting”
  • 만약 특정한 Mailbox Database에 저장된 모든 사용자 사서함을 몽땅 다른 Mailbox Database로 옮기고자 할 때는 다음과 같이 하면 
    된다.
    • 새로운 Mailbox Database를 생성한다.(MBX1) 이것은 옮길 Database이다.
    • Get-Mailbox -Database “Accounting” | New-MoveRequest -TargetDatabase “MBX1”


스크립트에서 사용하는 Param()의 다양한 사용법


  • Powershell script 를 사용할 때 스크립트 내에 Param()을 사용하면 참 편리하다. 이것은 스크립트에 매개변수(Parameter)를 사용하는 것을 말한다.
  • , 사용자가 생성한 스크립트에도 사용자가 원하는 Parameter를 생성하여 사용할 수 있다는 것이다.
  • 다음은 다양한 방법으로 Param()을 사용하는 예이다.
    • Param (
      $ComputerName
      )

    • Param (
      $ComputerName = “localhost”
      )
      ** 매개 변수를 입력하지 않았을  Default 값을 지정한 것이다
       
    • Param (
      $ComputerName,
      $Item
      )
      ** 여러 개의 매개변수를 사용할 때는 comma로 구분해 준다
       
    • Param (
      [Parameter(Mandatory=$true)]
      $ComputerName
      )
      ** 관리자가 매개변수 값을 모르더라도 강제적으로 입력하라고 화면에 보여준다
       
    • Param (
      [Parameter(Mandatory=$true)]
      $ComputerName,
      [Parameter(Mandatory=$true)]
      $Item
      )
      ** 매개변수가 여러 개일 경우에는 각각에 모두 [Parameter(Mandatory=$true)] 작업을 해준다

    • Param (
      $ComputerName = (Read-Host -Prompt “Enter your computer name”)
      )
      ** 화면에 어떻게 입력할 것인지를 정확하게 알려주고 싶을 때 사용한다
              
    • Param (
      $ComputerName= (Read-Host -Prompt “Enter your computer name”),
      $Item = (Read-Host -Prompt “Type your item to see”)
      )

    • Param (
      [string]$ComputerName = “localhost”,
      [int]$Newest = 5
      )

      ** 입력하는 값의 데이터 형식을 지정해준다. 이렇게 하면 컴퓨터 이름을 입력하는 항목에 숫자를 사용하면 오류가 발생하게 된다.
  • 이제 스크립트 파일을 생성하여 테스트해 본다.
    • C:\pro.ps1 파일을 생성한다


    • 이제 한 번 테스트 해 본다



매개변수 -CompuerName 사용법


  • Get-Process, Get-Service 등등을 실행할  -ComputerName이라는 매개변수(Parameter)를 사용하게 된다. 이  -Computername을 사용하지 않으면 기본적으로 로컬 컴퓨터 이름이 입력된다.
  • 하지만 -ComputerName을 사용할 때는 그 뒤에 컴퓨터 이름을 반드시 사용해주어야 한다.
  • 그렇다면 컴퓨터 이름을 어떻게 사용하는지 알아본다. 다음과 같은 방법으로 사용된다.
    • 그냥 뒤에 컴퓨터 이름을 직접 입력하면 된다.
      Get-Process -ComputerName pc1, pc2

    • 컴퓨터 이름을 Text 파일에 입력된 것을 불러 와서 사용한다. 이렇게 하면 늘 검사하는 컴퓨터 이름을 입력되어 있기 때문에 사용하는데 추가로 입력할 필요가 없어서 편리하다.
      Get-Service -ComputerName (Get-Content c:\computers.txt)

    • 컴퓨터 이름을 어떤 cmdlet의 결과 값을 사용한다.
      Get-Hotfix -ComputerName (Get-ADComputer -Filter * | Select-Object -ExpandProperty name)
      Invoke-Command -ComputerName (Get-ADComputer -Filter {Name -like “nyc-svr*”} | Select-Object -ExpandProperty name) -ScriptBlock {ipconfig}

      ** 여기서 Select-Object -ExpandProperty Name으로 하면 결과가 나오고,  Select-Object -Property Name으로 하면 결과가 나오지 않으니 주의한다.  그 이유는 아래의 그림을 보면
      알 수 있다.


      ** Select-Object -Property를 사용하면, 값만 나오는 것이 아니라 부가적인 정보나오기 때문에 문제가 되는 것이다. 우리가 원하는 것은 (컴퓨터 이름)만 나와야지 다음 단계를 처리할 수 있기 때문에 Select-Object -ExpandProperty를 사용해야 하는 것이다.
      ** 여기서 우리는 Select-Object에서 사용 가능한 매개변수인 -Property -ExpandProperty의 차이점을 알 필요가 있다.

      ** 특히 여러 개의 컴퓨터 이름을 이용할 , 즉 Active Directory에 있는 컴퓨터 이름을 활용하는 이 형식을 알아 두면 참 편리하다. 꼭 기억해 두기를…
      Get-Hotfix -ComputerName (Get-ADComputer -Filter * | Select-Object -ExpandProperty name)
       

      • 컴퓨터 이름을 파이프라인의 입력 값 중에서 특정한 속성 값을 사용한다.
        Get-ADComputer -Filter * | ForEach-Object {Invoke-Command -ComputerName $_.DnsHostname-ScriptBlock {gpupdate.exe /force}}
        Get-ADComputer -Filter * | ForEach-Object {Invoke-Command -ComputerName $_.Name -ScriptBlock {mkdir c:\powershell}}
        ** -computername $_.Name도 되고 -computername $_.DnsHostName도 모두 가능하다. , Get-ADComputer -Filter *에서 나온 결과를 보면 DnsHostName nyc-svr1.contoso.com이고 Name nyc-svr1이기 때문에 결과를 도출하는데는 아무 문제가 없다.
        ** c.번과 d.번의 결과는 동일한 것임을 알 수 있다. , C.번 형식으로 하나 D.번 형식으로 하나 동일한 표현이라는 것이다.