PowerShell

PowerShell Day 2014 @MVPSKILL.COM Part 2

ต่อเนื่องจากเมื่อวานเลยนะครับ หลังจากกินข้าวอร่อยๆ แล้วเราก็กลับมานั่งในห้องเหมือนเดิม พี่ฟูให้พวกเราโหวตว่าอยากฟังกลุ่มใน Present อีกครั้ง ซึ่งส่วนใหญ่ลงความเห็นว่าให้กลุ่ม 2 ที่พูดเรื่อง อ่านข้อมูล Login Fail จาก Event Log นั่นแหล่ะแต่คราวนี้ให้เวลาเหลือเฟือคือ 30 นาที

การอธิบายของสองหนุ่มดูจะไหลลื่นกว่าเมื่อเช้า มีการสอดแทรกความรู้เล็กๆ น้อยๆ ลงไปด้วย การพรีเซนต์ทำให้เห็นเลยว่าจริงๆ แล้วเขาก็เตรียมตัวกันมาไม่น้อยเลยเพียงแต่ว่าครั้งแรกมันตื่นๆ เวทีและเวลามันน้อยเท่านั้นแหล่ะ

เขาจำลองเหตุการณ์โดยใช้ Tools ทำ Dictionary Attack ยิงไปที่ Server มันก็เกิด Event Log จากนั้นก็ใช้ PowerShell อ่านมันออกมาเก็บใส่ csv file แล้วเปิดด้วย Excel ก็จะทำให้เห็นว่ามันมีการโจมตีจาก IP ไหนและ User ไหน จะได้จำกัดวงแล้วไปจัดการมันทัน จริงๆ แล้วผมว่าเขามีความรู้เรื่อง Security และประสบการณ์อย่างดี พร้อมให้คำแนะนำมือใหม่ๆ ไว้ด้วยว่า เหตุการณ์แบบเนี้ย อย่าพยายามไปตั้งให้มันส่งเมล์อัตโนมัติมาหา Admin นะเพราะถ้าโดนโจมตีเยอะๆ ไอ้ Script ที่เราเขียนไว้ไม่ดีๆ มันก็เหมือนเป็นการบอมเมล์ของ Admin ไปในตัวด้วยเช่นกัน

Session ต่อมา

New Feature PowerShell 4.0

Desired State Configuration 

มันก็เหมือนเป็นการกำหนด State ว่าเราต้องการให้เครื่องเป้าหมายมันมีสถานะแบบนี้ๆ โดยเราเตรียม DSC File (MOF file)  หน้าตาประมาณนี้ไว้ (ผมเอาตัวอย่างมาจาก http://mattblogsit.com/windows/powershell-v4-desired-state-configuration-deep-dive)

2014-03-02_14h35_50

แล้วเราสั่ง Start-DscConfiguration มันก็จะไปตรวจสอบกับเครื่องเป้าหมายว่ามี configuration ตามนี้ไหม เช่นตามตัวอย่าง WindowsFeature IIS จะต้อง Enabled (“Present” state) แล้วมัน Enabled อยู่ไหม ถ้าไม่ มันก็จะไป Enable ให้อัตโนมัติ

 

มีคนถามว่าแล้วทำไมต้องใช้ DSC ล่ะ ก็ในเมื่อ PowerShell ธรรมดาๆ มันก็สั่งติดตั้งอะไรแบบนี้ได้ … ผมจับใจความได้ว่าพี่คนบรรยายเขาบอกว่า เรื่องบางเรื่องอย่างการจัดการ Registry เนี่ย PowerShell ธรรมดาจะทำอย่างไรล่ะ?

ซึ่งจริงๆ แล้วผมว่าถ้าอธิบายให้เห็นภาพว่าไอ้เจ้า DSC เนี่ย Microsoft เขาออกมาเพื่อให้ท่านทำ Configuration Management ด้วย PowerShell

หน้าที่ของ System Admin ไม่ใช่แค่ Config Network ลงโปรแกรมแล้วเพิ่ม Role จัดการเรื่อง Security แล้วเอาไปใช้งานจริงๆ แล้วจบๆ กันไป สิ่งที่คุณควรทำก็คือ ตรวจสอบ และทำให้มั่นใจตลอดเวลาว่าเครื่องๆ นั้น ยังมี Configuration ตามที่กำหนด พร้อมสำหรับการใช้งานอยู่ตลอดเวลา ตั้งแต่ช่วงเริ่มติดตั้งจนถึงการถอดเครื่องนั้นออกจากระบบ โดยที่ไม่มีอะไรไปเปลี่ยน Configuration มันแล้วทำให้ Application หรือระบบที่เกี่ยวข้องเกิดปัญหา นั่นเป็นที่มาทำไมเราถึงควรจะทำ Configuration Management

ในโลก System Admin ที่ไม่ได้อยู่บน Windows Platform เขาก็มี Open Source Tools อย่าง Chef , Puppet ที่เขาเอาไว้ใช้ทำ configuration management (จริงๆ แล้วก็เอาไปใช้บน Windows ได้นะ แต่ผมไม่รู้ว่ามันครอบคลุมแค่ไหน) 

 

นอกจากนี้ก็ยังมี Session ของ EMC ที่มาพูดเรื่องการจัดการ Storage ของ EMC โดยใช้ PowerShell

มี Session ของคุณ Ken ที่พูดถึงการจัดการกับ Server แบบ Remote ซึ่งคุณเคนอธิบายสถานการณ์ได้ค่อนข้างดีมาก เช่นเวลาที่จะ Setup เครื่องใหม่ มันก็จะอยู่บน VLAN วงนึงที่ใช้สำหรับการ Setup โดยเฉพาะ เมื่อ Config อะไรเรียบร้อยแล้ว ก็ต้องเปลี่ยน IP ย้ายมันไปอยู่ใน VLAN อีกวงนึง ซึ่งอธิบายให้เห็นว่าแล้วเราจะ Automated มันยังไง มันมีปัญหาอะไรบ้าง

มี Session เล็กๆ เกี่ยวกับ Sharepoint Online ที่บอกว่า เราสามารถเขียน .Net Programming แล้วใช้งานบน PowerShell ได้

 

งานก็จบลงอย่างสวยงาม ขอบคุณทีมงานที่เสียสละเวลาส่วนตัวมาแบ่งปันกันครับ

 

PowerShell

PowerShell Day 2014 @MVPSKILL.COM

วันนี้มางาน PowerShell Day 2014 ที่ทางกลุ่ม mvpskill จัดขึ้นที่บริษัท Microsoft บนถนนวิทยุ

ช่วงเช้าเป็นการ Demo การทำ PowerShell ไปใช้ในงานต่างๆ เช่น เอาไปทำงานที่เกี่ยวกับ MS  Exchange, Microsoft Visualization (Hyper-V), งานด้าน Security, Desktop Management, Office 365, System Center โดยแบ่งกัน Present เป็น 6 ทีม

คนที่มา Demo ก็น่าจะเป็นสมาชิกกลุ่มดังกล่าวซึ่งงานนี้น่าจะเป็นการพูดเป็นครั้งแรกของหลายคนแล้วก็เตรียมตัวมาไม่เยอะ แล้วก็ยังไม่แม่นเรื่องที่ Present เท่าไหร่ ทำให้รูปแบบงานช่วงเช้าก็ไม่ค่อยดีเท่าไหร่

ตัวอย่างการทำงานกับ MS Exchange

ก็คือ เขา Demo ให้ดูว่า เอ๊ะถ้าอยากรู้ว่า User ที่ใช้ Mailbox Storage สูงสุด 10 คนมีใครบ้างแล้วใช้ไปคนละเท่าไหร่

ซึ่งจากเดิม Tools ของ MS Exchange มันไม่มีบอก ถ้าอยากรู้ต้อง Click เข้าไปดูทีละคน เขาก็เลยติดตั้ง Module PowerShell สำหรับ MS Exchange แล้วอ่านค่า Mailbox Usage ออกมา แล้วก็ทำเป็น Graph โดยใช้ .Net Framework Object นี่แหล่ะ

 

กลุ่มที่สองพูดถึงงานด้าน Security

คือเขายกตัวอย่างกรณีจริงอันนึงคือธนาคารแห่งนึงเขาโดน Malware โจมตีโดยพยายาม Login เข้าระบบ แต่ระบบก็ฟ้องซึ่งใน Log มี Fail Log เกิดขึ้นกว่า 20,000 รายการภายในเวลาแป๊บเดียว ซึ่งการที่เข้าไปไล่ดูใน Event Log เป็นเรื่องที่เหนื่อยมากเพราะต้องเข้าไป Click ทีละ Item และข้อมูลเยอะมากทำให้ช้าด้วย (ผมไม่เคยนึกมาก่อนเลยว่า Admin ฝั่ง Windows ต้องทำงานแบบเจ็บปวดขนาดนี้นะ) เขาก็เลยใช้ PowerShell ไปอ่านค่า Event Log แล้วก็ Filter เอาสิ่งที่ต้องการ

 

เรื่องที่สามก็เกี่ยวกับ Microsoft Visualization (Hyper-V)

ทีมนี้ Present ดีสุดเลยเตรียมตัวมาดีมาก ยกตัวอย่าง Scenario 3 อัน คือ เครื่อง Virtual Memory ไม่พอต้องขยายเพิ่ม, Bandwidth ไม่พอ รวมถึง Disk IOPs ด้วย เขาก็จัดการโดย Config ทุกอย่างบน CSV file ซึ่งสามารถเปลี่ยนค่าได้โดยใช้ Excel แล้วก็ส่งไปเป็น Input เพื่อให้ PowerShell ปรับเปลี่ยน Config ตามค่าใน csv file.

 

เรื่อง Desktop Management Tools

เขาก็ไปหยิบเอา PowerShell Script ที่มีการ share อยู่ที่  http://gallery.technet.microsoft.com/Arposh-Windows-System-a1beb102  เอามาลองใช้ให้ดู

Session Office365

ก็คล้ายกับกลุ่มอื่นๆ ก็ยกตัวอย่างการอ่านค่าจากมันเอามาทำ Report เขายกตัวอย่างการอ่านข้อมูลจาก Sharepoint ออกมา

System Center  SCVMM ก็เป็นการ Add Host Group กับ เพิ่ม VM เข้าไปใน Host Group โดยใช้ PowerShell

 

ปล. ขณะที่พิมพ์อยู่นี้ งานตอนบ่ายยังไม่เริ่ม

PowerShell

PowerShell ตอน Select-Object property

ช่วงแรกๆ นี้ขอแตะๆ cmdlet ใน PowerShell ไปก่อนนะครับ ก่อนที่จะไปเขียน script กันจริงๆ

ตอนก่อนๆ ผมเคยใช้ Select-Object ในการที่จะเลือก property ที่มาแสดงผลแล้วคราวนี้ถ้าเราอยากจะได้ property จากการคำนวนค่าจากส่วนอื่นๆ บ้าง

ผมยกตัวอย่างจากหนังสือเลยละกัน (ในหนังสือเขายกตัวอย่าง chrome แต่ผมเปิด chrome ไว้เยอะอ่ะ ขอเป็น SkyDrive แทน)

2014-02-23_17h00_46

มาทำความเข้าใจไอ้ที่เขาเขียนนี่กันหน่อยดีกว่าครับ

อันนี้ผม Get-Process เพื่อดูข้อมูลเกี่ยวกับ Process ที่ชื่อ SkyDrive

2014-02-23_16h34_06

ในหนังสือเขายกตัวอย่างว่า ถ้าเขาต้องการทราบ Total Memory ที่ Process นี้ใช้เป็นเท่าไหร่ โดยเอา

NonpagedSystemMemorySize + PagedMemorySize + VirtualMemorySize + WorkingSet

เราก็จะเขียนคำสั่งได้อย่างนี้

2014-02-23_16h43_13

จะเห็นว่าก็แค่ระบุชื่อ Property กับค่าให้อยู่ใน format   @{Name=”ชื่อ”; Expression= {ค่า}}

และจะเห็นว่า ในส่วนที่เป็นทศนิยมคำนวนออกมาได้น่าเกลี๊ยดน่าเกลียด อยากจะให้มันแสดงแค่ 2 หลักก็พอก็สามารถจัด Format มันได้ ซึ่งการจัด NumberFormat ก็จะมี pattern ดังตัวอย่างนี้

"{0:N2}" -f 554.22272

ผลลัพธ์มันจะได้ทศนิยม 2 ตำแหน่งเป็น

554.22

สรุปสุดท้ายถ้าเขาเขียนแล้วจัด FormatNumber เต็มๆ แบบนี้ ก็จะได้ผลลัพธ์ตามรูปนี้

Get-Process SkyDrive | Select-Object Name, Handles, Threads, NonpagedSystemMemorySize, PagedMemorySize, VirtualMemorySize, WorkingSet, PrivilegedProcessorTime, UserProcessorTime, TotalProcessorTime,  @{Name="Total Memory (M)";Expression= {"{0:N2}" -f (($_.NonpagedSystemMemorySize + $_.PagedMemorySize + $_.VirtualMemorySize + $_.WorkingSet)/1MB)}}

2014-02-23_17h03_33

เพิ่มเติมอีกนิด  ใน PowerShell ไม่ได้มี Library เฉพาะมาสำหรับจัด Format ตัวเลขนะครับ สิ่งที่มันทำคือมันไปใช้ Library ของ .Net Framework ดังนั้น รูปแบบวิธีการจัด Format เราสามารถดูได้จากเอกสารของ .Net Framework ได้เลย

ซึ่งจากตัวอย่างที่ยกมา  {0:N2}

N2  คือ จัดรูปแบบตัวเลขให้เป็นทศนิยม 2 ตำแหน่ง

หรือเราก็สามารถ custom ได้แบบใน .Net Framework เลย เป็นแบบนี้ก็ได้

{0:#.99}

2014-02-23_17h11_21

ดู custom format เพิ่มเติมได้ที่ http://msdn.microsoft.com/en-us/library/dwhawy9k(v=vs.110).aspx

PowerShell

PowerShell ตอน อ่านข้อมูลจากเว็บ

ในการเขียน shell script บน linux บางครั้งก็จะมีการใช้คำสั่งพวก curl , wget ในการอ่านข้อมูลที่อยู่บน internet มาทำนู่นนี่นั่น

อ๊ะ แล้วฝั่ง windows จะทำยังไง?

ค้นไปค้นมาก็เจอไอ้เจ้านี่ครับ Invoke-RestMethod ใน PowerShell

ผมยกตัวอย่างดังนี้ครับ ผมต้องการหาอัตราแลกเปลี่ยนจากเงิน USD มาเป็น THB จากเว็บดังรูป

pic21

จะเห็นว่าเว็บเขา return ผลลัพธ์กลับมาเป็น JSON

ทีนี้เราลองใช้ Invoke-RestMethod ดูบ้าง

pic20

ซึ่งนั่นก็หมายความว่า มันเข้าใจและอ่าน JSON รู้เรื่องด้วย ดังนั้นผมทำแบบนี้ก็ได้น่ะสิ

Invoke-RestMethod -Uri "http://rate-exchange.appspot.com/currency?from=USD&to=THB" | Select-Object  from, to , rate

ก็ไม่มีปัญหาอีหยังครับ 🙂

pic22

PowerShell

PowerShell Comparison Operators

พักนี้ขอลงเรื่อง PowerShell บ่อยหน่อยนะครับ … พอดีบางคนแถวนี้จะต้องเอาไปใช้ รวมทั้งตัวผมด้วยก็เลยอ่านหนังสือไป Blog ไปแบบนี้แหล่ะ

เรื่องมันจำเป็น  ของมันจำเป็น ก็เรื่องมันจำเป็นทำยังไงได้ …. (ใครเกิดทันก็สารภาพมาซะดีๆ ….555 )

จากตอนก่อนๆ ผมเคยใช้ Comparison Operator ไปบ้างแล้ว เช่น   “-match” ส่วนตัวอื่นๆ ก็มีดังนี้

-eq
-ne
-gt
-ge
-lt
-le
-Like
-NotLike
-Match
-NotMatch
-Contains
-NotContains
-In
-NotIn
-Replace

ดูแล้วก็ไม่น่ามีประเด็นอะไรใช่ไหมครับ รู้ๆ เดาๆ กันได้อยู่แล้ว

-eq ก็ย่อมาจาก equal ก็เท่ากัน … ก็หมายความว่าจะเปรียบเทียบซ้ายเท่ากับขวา
-ne ก็ย่อมาจาก not equal ก็หมายถึง ฝั่งซ้าย ไม่เท่ากับฝั่งขวา

ประเด็นที่ต้องบล็อกเรื่องนี้ เพราะมันไม่ได้มีแค่นี้สิครับ!!

อันแรก  เราใส่ตัว “c” เพิ่มเข้าไปข้างหน้าเป็น

-ceq
-cne

การเติมเข้าไปอย่างนี้จะเป็นการตรวจสอบแบบ  “case-sensitive” คือภาษาอังกฤษตัวพิมพ์เล็กกับตัวใหญ่มีผลต่างกัน

snapshot146

 

ประเด็นที่ 2  ความหมายของ -eq  มันไม่ได้เปรียบเทียบแค่ซ้ายกับขวาว่าเท่ากันไหมแล้วให้ผลลัพธ์กลับมาเป็น True/False เท่านั้น Microsoft เขาใช้คำว่า ” Includes an identical value” ผมไม่รู้จะแปลว่าอย่างไร … คือถ้าเราจะเปรียบเทียบ collection (หรือ array) กับ scalar สิ่งที่มัน return กลับมาคือข้อมูลที่เหมือนกับ scalar value ตัวอย่างเช่น

snapshot147

 

จะเห็นว่า ในคำสั่งแรก  -eq มันจะคืนค่า สมาชิกตัวที่เหมือนกับสิ่งที่อยู่ขวามือ
ส่วนคำสั่งที่สอง -ne จะเห็นว่ามันคืนค่าสมาชิกทุกตัวที่ไม่เหมือนกับสิ่งที่อยู่ขวามือ

 

หนังสือหลายเล่มไม่ได้อธิบายและพูดถึง 2 ประเด็นนี้ไว้นะครับ ถ้าอยากอ่านละเอียดๆ ไปอ่านที่เว็บของ Microsoft โลด

http://technet.microsoft.com/en-us/library/hh847759(v=wps.630).aspx