Exchange 2010에서 New-MailContact를 사용하여 연락처를 한꺼번에 여러개 생성하기


1) 다음과 같이 C:\customers.csv라는 파일을 생성한다.
Name, Email, OUPath
Yongshik Lee, jesuswithme@gmail.com, powershell.kr/customers/Samsung
Pyeonghwa Lee, peace@hotmail.com, powershell.kr/customers/LG
** 사전에 AD에서 Customers OU 아래에 각각 Samsung, LG OU를 생성해두어야 한다.

2) 다음과 같이 CreateContacts,ps1 파일을 생성하여 실행한다.
Import-CSV C:\customers.csv | ForEach-Object {
New-MailContact -ExternalEmailAddress $_.Email -Name $_.Name -OrganizationalUnit $_.OUpath
}

** 여기서 알 수 있듯이 무엇보다도 csv 파일을 잘 만든 것이 중요하다.
** 일단 기본적인 정보를 가지고 만든 후, 나머지 속성들은 나중에 수정해 넣으면 된다.

 

 

Exchange Server에서 사용자 계정과 그에 대한 사서함을 한꺼번에 만들기


1) 메모장 및 엑셀 프로그램으로 csv 파일 생성
** 제일 위줄을 잘 적어야 한다
name, surname, givenname, samaccountname, city
yslee, lee, yongshik, yslee, seoul
peace, lee, pyeonghwa, peace, seoul
comforter, lee, lowoon, comforter, seoul

** name, samaccountname는 필수 항목. 이 항목은 Get-ADuser -Identity administrator | Get-Member 로 속성(property)를 확인한 것이다. 그리고 반드시 도움말 Help new-aduser를 확인한다.
** 만들 csv 파일을 확인하기 위해 import-csv c:\userlist.csv

2) csv 파일을 이용하여 한꺼번에 AD 계정 생성하기
import-csv c:\userlist.csv | new-aduser
** Active Directory Module for Windows Powershell에서 작업

3) 생성한 계정을 lab OU로 이동한다.
4) 암호 재설정하기
Get-ADuser -Filter * -Searchbase “ou=lab, dc=powershell, dc=kr” |
Set-ADAccountPassword -Reset -NewPassword (Read-Host -Promt “Your password” -AsSecureString)

** 암호는 Pa$$w0rd로 입력한다.

5) 계정 Enable 하기
Get-ADuser -Filter * -Searchbase “ou=lab, dc=powershell, dc=kr” | Enable-ADAccount

6) 한꺼번에 여러개의 사서함 만들기
Get-User -OrganizationalUnit “lab” | Enable-Mailbox -Database “Accounting”
** Exchange Management Shell에서 작업

Param()을 이용하여 Exchange Server에서 사용자 사서함을 쉽게 생성하기


Exchange Management Shell에서 사용자 사서함을 만드는 방법은 크게 두 가지가 있다.

1) Active Directory에 이미 사용자 계정이 만들어져 있는 경우, 그 계정을 이용해서 각각의 사서함을 만들어 주는 경우

2) 처음부터 직원들의 이메일을 받을 수 있는 사서함을 만들면서 AD에 로그온 하는 계정도 만드는 경우

여기서 먼저 Active Directory에 있는 기존 사용자를 이용하여 사서함을 한꺼번에 여러 개를 만들어 보자

– Get-User -OrganizationalUnit Marketing
– Get-User -OrganizationalUnit Marketing | Enable-Mailbox -Database “Mailbox Database 1”
이렇게 만드는 것이 제일 쉽고 일반적인 방법이다. 이렇게 하면 Marketing OU에 소속된 모든 사용자에게 사서함을 배정하여 줄 수 있다.

좀더 간단한 방법을 사용한다면… 위의 내용을 스크립트로 만들어서 활용하면 더욱 쉽고도 잘 활용할 수 있다.
스크립트 내용은 다음과 같다.
Param (
$OU
)
Get-User -OrganizationalUnit $OU | Enable-Mailbox -Database “Mailbox Database 1”

이렇게 한 후 스크립트 내용을 CreatingMailboxForExistingUsers.ps1로 저장하여 다음과 같이 실행하면 된다.
.\CreatingMailboxForExistingUsers.ps1 Sales
.\CreatingMailboxForExistingUsers.ps1 -OU “HR”
.

이제는 사서함을 만들면서 AD에 사용자 계정도 만들어 보자.

New-Mailbox -Name jesuswithme -Password (Read-Host -Prompt “Your Password” -AsSecureString) -UserPrincipalName jesuswithme@powershell.kr -Database “Mailbox Database 1” -ResetPasswordOnNextLogon $true

이렇게 만들어 보니 너무 어렵다. 앞으로 새로운 사원이 들어 올 때만다 이렇게 만들면 너무 어려우니 스크립트 파일을 이용해보자.

Param (
  $name,
  $upn
)
New-Mailbox -Name $name -Password (Read-Host -Prompt “Your Password” -AsSecureString) -UserPrincipalName $upn -Database “Mailbox Database 1” -ResetPasswordOnNextLogon $true

이렇게 한 후 스크립트 내용을 CreatingMailboxWithNewUsers.ps1로 저장하여 다음과 같이 실행하면 된다.
.\CreatingMailboxWithNewUsers.ps1 aduser1 aduser1@powershell.kr
.\CreatingMailboxWithNewUsers.ps1  -Name aduser2 -Upn aduser2@powershell.kr

Windows 8의 WordPress.com의 App에서 처음으로 글을 쓴다


Windows 8의 WordPress.com 앱을 사용하여 작업을 하고 있다.
일단 편집하는 창이 화면 전체를 사용하니 좀 어색하다.
그리고 Windows 8을 사용하기 때문에 UI를 익히는데 시간이 좀 걸리지만,
새로운 것을 배울 수 있다는 기쁨이 있다.
글을 쓰면서 직접 사진을 찍어서 올릴 수도 있구나.

Workgroup 및 other domain 환경에서 Powershell을 사용하여 원격으로 접속하기 위한 설정


  • Powershell 원격 관리는 매우 유용한 기능이다. 이것을 구현하기 위해서는 Domain 환경이 구축되어야 한다.
  • 그런데 현업에서는 Workgroup에 속한 컴퓨터에 접속하거나 다른 도메인에 속한 컴퓨터를 원격으로 관리해야 할 일이 존재한다.
  • 그래서 동일한 도메인에 존재하지 않는 원격 컴퓨터를 원격으로 접속하여 관리하기 위해서는 다음과 같이 작업한다.
    • Powershell 콘솔 프로그램을 반드시 관리자 권한으로 실행한다
    • 관리를 당하는 원격 서버에서의 설정:
      Enable-PSRemoting -Force
      방화벽 끄기
      (원격 서버에서 방화벽을 끄지 않으면 접속이 안 된다. 이 문제는 해결해야 한다.)
      원격 컴퓨터가 Windows XP라고 하면 SecPol.msc에서 다음 설정도 해야 한다.
       


    • 원격으로 접속하는 클라이언트 컴퓨터에서의 설정:
      Set-Item WSMan:\localhost\client\trustedhosts * -Force
    • 만약 접속할 원격 컴퓨터를 특정하게 지정하고 싶다면

      Set-Item WSMan:\localhost\client\trustedhosts -Value PC1, PC2
      Set-Item WSMan:\localhost\client\trustedhosts -Value 10.10.0.10
      Set-Item WSMan:\localhost\client\trustedhosts -Value *.powershell.kr

  • 이제 클라이언트에서 원격 서버에 접속해 본다.
    Enter-Pssession -CompuerName RemoteServer1 -Credential RemoteServer1\administrator
  • 아래와 같이 실습을 하면 성공함. 접속하는 로컬 컴퓨터는 jesuswithme-pc이고 원격 컴퓨터는 win2008R2SP1이다.         


     
     


Background에서 Powershell Job(작업) 실행하기


  • Powershell console에서 작업을 하면, 즉 여러 가지 cmdlet를 실행하거나 스크립트 파일(.ps1)을 실행할 때는 Interactively, Synchronously하게 처리된다. 즉, 이것은 한 명령어를 실행한 후 다음 명령어를 실행하려면 첫 번째 명령어의 결과가 화면에 나타난 후 그 다음 명령어를 실행할 수 있다는 것이다.
  • 문제는 그 다음 명령어를 실행하려고 하는데 첫 번째 명령어가 아직 계속 진행 중이라면 문제가 발생하게 되는 것이다.
  • 이것을 해결하려면 첫 번째, 또 다른 Powershell console 프로그램을 실행해서 처리하면 된다. 그러면 부가적으로 메모리와 CPU를 더 사용하게 된다. 그래서 두 번째 방법이 있다. 그것을 바로 Background에서 작업을 실행하게 하는 것이다.
  • Background에서 작업을 할 때는 -AsJob이라는 매개변수를 이용하거나 Start-Job이라는 cmdlet를 이용하는 방법이 있다.
  • -AsJob은 Parameter이기 때문에 모든 cmdlet에서 사용할 수 없다. 하지만 간단하게 사용할 수 있는 장점이 있다.
    • Gwmi -computername pc1, pc2 -Class cim_datafile
      (이렇게 하면 시간이 많이 걸린다)
    • Gwmi -computername pc1, pc2 -Class cim_datafile -AsJob
      (이렇게 하면 백그라운드로 작업이 되므로 다른 명령어를 실행할 수 있다.)
    • 작업이 진행중인지 끝났는지 확인하려면 Get-Job으로 확인할 수 있다.
       
  • Start-Job의 장점은 다음과 같다.
    • 모든 cmdlet에 사용할 수 있다.
      Start-Job -Scriptblock {Get-Process -Computername PC1, PC2}
    • Powershell Script 파일도 background로 작업을 할 수 있다.
      Start-Job -FilePath c:\myscript.ps1
    • 현재 로그온한 사용자가 아닌 다른 사용자 계정으로 실행할 수 있다.
      Start-Job -Scriptblock {Get-Eventlog -Logname system} -Credential Contoso\user01
    • Job name을 사용자가 명기할 수 있다. -AsJob은 Default로 Job name이 붙는다.
      Start-Job -Name WinRmTask -Scriptblock {get-process winrm}        
  • 백그라운드로 작업한 내용을 보기 위해서는 다음과 같이 한다.
    • Get-Job으로 Job 현황을 본다.
    • Receive-Job -Id 1 -Keep로 첫 번째 Job 내용을 본다. 여기서 -Keep을 사용한 이유는 이것을 사용하지 않으면 한 번만 내용을 볼 수 있기 때문이다.

       

현재 세션에서만 .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이다.