ค้นหาเว็บไซต์

การใช้ GitHub Copilot กับ Microsoft 365 PowerShell


ความช่วยเหลือ AI มีมูลค่า $10/เดือนสำหรับการพัฒนา PowerShell หรือไม่

ดังที่บางท่านอาจสังเกตเห็น ฉันชอบเขียน PowerShell เพื่อทำให้การทำงานของ Microsoft 365 เป็นอัตโนมัติ ในช่วงไม่กี่ปีที่ผ่านมา ฉันได้สะสมสคริปต์จำนวนหนึ่งในพื้นที่เก็บข้อมูล Office 365 for IT Pros GitHub ฉันไม่ใช่นักพัฒนามืออาชีพ และการเขียนโค้ดเป็นเรื่องที่พลาดไม่ได้มาโดยตลอด โดยเฉพาะอย่างยิ่งเมื่อเรียนรู้เกี่ยวกับ cmdlets ใหม่ เช่น หลายพันรายการใน Microsoft Graph PowerShell SDK หลายเดือนที่ผ่านมา Andy Schneider รายงานผลลัพธ์ที่ดีโดยใช้ GitHub Copilot เพื่ออัปเกรดสคริปต์เพื่อใช้ Microsoft Graph PowerShell SDK เนื่องจากฉันใช้ SDK บ่อยครั้ง ทุกอย่างชี้ไปที่เครื่องมือที่ควรค่าแก่การลองใช้ ซึ่งเป็นสิ่งที่ฉันทำในช่วงสี่เดือนที่ผ่านมา

ด้วยราคา $10/เดือนสำหรับใบอนุญาตส่วนบุคคล GitHub Copilot การลงทุนจึงเป็นเรื่องง่าย GitHub กล่าวว่าข้อความคาดการณ์ช่วยให้นักพัฒนาทำงานเสร็จเร็วขึ้น 55% กล่าวอีกนัยหนึ่ง AI ควรช่วยฉันประหยัดเวลา 30 นาทีสำหรับสคริปต์ที่ปกติจะใช้เวลาเขียนหนึ่งชั่วโมง นี่ควรปล่อยเวลาในการดื่มกาแฟ ฉันใช้การรวม Copilot กับ Visual Studio Code ซึ่งทำงานได้ดีมาก

ข้อมูลพื้นฐานเกี่ยวกับนักบินอวกาศ

GitHub Copilot ปฏิบัติตามแนวทางเดียวกันกับที่ Microsoft Copilot อื่นๆ ดำเนินการ ผู้ใช้โต้ตอบผ่านแอปพลิเคชัน (เช่น Visual Studio Code) เพื่อป้อนข้อมูลพร้อมท์ ข้อความแจ้งให้ GitHub Copilot ทราบว่าต้องทำอย่างไร เนื่องจากเรากำลังจัดการกับโค้ด ข้อความแจ้งจึงครอบคลุมสิ่งต่างๆ เช่น การสร้างฟังก์ชันหรือการเขียนสคริปต์หรือโปรแกรม GitHub Copilot ประมวลผลพร้อมท์กับ Large Language Model (LLM)

GitHub ฝึกอบรม LLM โดยใช้ข้อความและโค้ดภาษาธรรมชาติที่จัดเก็บไว้ในที่เก็บ GitHub สาธารณะและแหล่งข้อมูลอื่นๆ ที่เปิดเผยต่อสาธารณะ สิ่งนี้สำคัญเพราะมันหมายความว่า GitHub Copilot จะเก่งขึ้นเมื่อสามารถทำงานกับโค้ดที่รู้จักจำนวนมากได้ ตัวอย่างเช่น พรอมต์ที่แสดงในรูปที่ 1 ขอให้ GitHub Copilot สร้างฟังก์ชัน PowerShell เพื่อจัดรูปแบบขนาดเป็นไบต์และส่งออกขนาดเป็น KB, MB หรือ GB

ฟังก์ชันที่คล้ายกันนี้น่าจะถูกสร้างขึ้นมาหลายครั้งแล้ว (เช่นเดียวกับในสคริปต์ที่ใช้สร้างรายงานเกี่ยวกับไฟล์ในบัญชี OneDrive for Business) ดังนั้น GitHub Copilot จึงไม่มีปัญหาในการประมวลผลพร้อมท์เพื่อสร้าง Convert-BytesToSize ฟังก์ชั่น:

function Convert-BytesToSize {
    param (
        [Parameter(Mandatory = $true)]
        [long]$Bytes
    )

    $Kilobytes = $Bytes / 1KB
    $Megabytes = $Bytes / 1MB
    $Gigabytes = $Bytes / 1GB

    if ($Gigabytes -ge 1) {
        return "{0:N2} GB" -f $Gigabytes
    }
    elseif ($Megabytes -ge 1) {
        return "{0:N2} MB" -f $Megabytes
    }
    elseif ($Kilobytes -ge 1) {
        return "{0:N2} KB" -f $Kilobytes
    }
    else {
        return "{0:N2} bytes" -f $Bytes
    }
}

ความสามารถในการสร้างฟังก์ชันเช่นนี้ได้ภายในไม่กี่วินาทีถือเป็นการแสดงที่น่าประทับใจว่า AI จะทำอะไรได้บ้างเมื่อได้รับการฝึกฝนให้ทำงานดังกล่าวแล้ว ดังที่เราจะเห็นว่า จะไม่ค่อยน่าประทับใจนักเมื่อถูกขอให้รับมือกับ API ที่มีตัวอย่างในการฝึกอบรม LLM น้อยลง นี่เป็นเรื่องจริงโดยเฉพาะอย่างยิ่งสำหรับ Microsoft Graph API ล่าสุดบางส่วน

ตัวอย่างเช่น Microsoft เพิ่งอัปเดต Planner Graph API เพื่อรองรับสิทธิ์ของแอปพลิเคชัน มีการเผยแพร่ตัวอย่างการใช้ Planner Graph API ไม่มากนัก Practical365.com มีบทความและสคริปต์ตัวอย่างบางส่วน เช่น การซิงโครไนซ์งานจากศูนย์การจัดการ Microsoft 365 และการวิเคราะห์งานที่ไม่สมบูรณ์ อย่างไรก็ตาม แม้ว่าสคริปต์จะถูกจัดเก็บไว้ใน GitHub แต่สคริปต์และตัวอย่างอื่นๆ อาจไม่ปรากฏเมื่อ GitHub สร้าง LLM

หลังจากที่ LLM ประมวลผลพร้อมท์ GitHub Copilot จะส่งกลับผลลัพธ์ไปยังแอปพลิเคชัน ผู้ใช้สามารถยอมรับหรือลบรหัสแล้วลองอีกครั้งจนกว่ารหัสที่สร้างขึ้นจะเป็นที่น่าพอใจ

ไม่ต้องสงสัยเลยว่า GitHub Copilot จะดูแลงานทั่วไปบางอย่างได้เป็นอย่างดี เช่น การใส่ความคิดเห็นลงในโค้ด นอกจากนี้ยังเรียนรู้การเขียนโค้ดอย่างรวดเร็วเหมือนกับผู้ใช้ที่ลงชื่อเข้าใช้ ตัวอย่างเช่น ฉันใช้คำสั่ง Write-Host ในลักษณะเฉพาะที่ GitHub Copilot ยินดีอย่างยิ่งที่จะทำซ้ำ

แต่การคัดลอกสไตล์ของใครบางคนหรือการแสดงความคิดเห็นไม่ใช่เรื่องมหัศจรรย์ GitHub Copilot ให้บริการนักพัฒนาที่เขียนหลายภาษาบนหลายแพลตฟอร์ม PowerShell เป็นเพียงหนึ่งในภาษาเหล่านั้น และ Microsoft 365 PowerShell ก็เป็นหนึ่งในแพลตฟอร์ม มาดูการใช้ GitHub Copilot กับ PowerShell ประเภทที่คุณคาดว่าจะใช้งานเพื่อทำให้ Microsoft 365 เป็นอัตโนมัติ

โปรแกรมควบคุม GitHub และ Microsoft 365

ฉันตัดสินใจขอให้ GitHub Copilot เขียนฟังก์ชันเพื่อรายงานวันที่ลงชื่อเข้าใช้ครั้งล่าสุดสำหรับบัญชี Entra ID รูปที่ 2 แสดงพรอมต์และฟังก์ชันที่สร้างโดย GitHub Copilot

เมื่อดูเผินๆ โค้ดก็ดูน่าประทับใจ แต่ไม่ใช่เพราะใช้ Get User Activities Graph API ซึ่งออกแบบมาเพื่อดึงรายละเอียดกิจกรรมภายในแอพ กล่าวโดยสรุป ฟังก์ชันนี้ใช้งานไม่ได้

การใช้เครื่องมือ AI เจนเนอเรชั่นให้ประสบความสำเร็จนั้นขึ้นอยู่กับความสมบูรณ์ของพร้อมท์ที่ผู้ใช้ส่งมาเพื่อการประมวลผล AI ไม่ได้ล้มเหลว: ฉันแค่ไม่แม่นยำเพียงพอให้ AI รู้ว่าฉันต้องการอะไร ฉันจึงลองอีกครั้งพร้อมข้อความแจ้งนี้:

เขียนฟังก์ชันเพื่อส่งคืนวันที่ลงชื่อเข้าใช้สำเร็จครั้งล่าสุดสำหรับบัญชีผู้ใช้ Entra ID ตามบันทึกการลงชื่อเข้าใช้ Entra ID

รูปที่ 3 แสดงผลลัพธ์ อีกครั้งที่โค้ดดูดี แต่ก็ใช้ไม่ได้อีกครั้ง

ปัญหาในครั้งนี้คือ GitHub Copilot มีอาการประสาทหลอนเล็กน้อยและสร้าง cmdlet หรือฟังก์ชันที่เรียกว่า Get-EntraIDSignInLogs ที่ไม่มีอยู่จริง บางทีอาจมีอยู่ที่ไหนสักแห่งในที่เก็บ GitHub แต่นั่นไม่ดีสำหรับฉัน

ณ จุดนี้ คุณอาจคิดว่าฉันมีความสำคัญอย่างยิ่งเกี่ยวกับความสามารถของ GitHub Copilot ในการสร้างโค้ด ฉันไม่ได้. โค้ดมีโครงสร้างและระบุขั้นตอนที่จำเป็นในการส่งคืนผลลัพธ์ที่ต้องการ ดังนั้นจึงมีประโยชน์ ปัญหาอาจเป็นได้ว่า Copilot มีข้อมูลไม่เพียงพอในโมเดลภาษาขนาดใหญ่ที่จะคิดวิธีแก้ปัญหาอย่างใดอย่างหนึ่งจากสองวิธีที่มนุษย์คนนี้พิจารณา:

  • ใช้วันที่ลงชื่อเข้าใช้สำเร็จครั้งล่าสุดที่บันทึกไว้สำหรับบัญชีผู้ใช้ Entra ID
  • การใช้บันทึกการลงชื่อเข้าใช้ Entra ID เพื่อค้นหาเหตุการณ์การลงชื่อเข้าใช้ที่สำเร็จครั้งล่าสุดสำหรับผู้ใช้ การเข้าถึงบันทึกการลงชื่อเข้าใช้โดยทางโปรแกรมต้องใช้ใบอนุญาต Entra ID P1

จากโครงสร้างที่สร้างโดย GitHub Copilot ฉันสามารถหย่อนโค้ดลงไปเพื่อซักถามบันทึกการลงชื่อเข้าใช้ Entra ID และทำงานให้เสร็จได้ การมีโครงสร้างอยู่แล้วช่วยประหยัดเวลาได้ อาจจะไม่เพียงพอสำหรับกาแฟ แต่บางนาทีอย่างแน่นอน

โค้ดมนุษย์ที่สร้างขึ้นด้วยมือใช้ Get-MgAuditLogSignIn cmdlet เพื่อค้นหาเหตุการณ์การลงชื่อเข้าใช้สามรายการล่าสุดสำหรับผู้ใช้ จากนั้นแยกการลงชื่อเข้าใช้ที่สำเร็จครั้งแรกออกจากชุดเพื่อส่งคืนการประทับเวลาสำหรับเหตุการณ์ .

function Get-LastSuccessfulSignInDate {
    param (
        [Parameter(Mandatory = $true)]
        [string]$UserId
    )
    $StartDate = Get-Date (Get-Date).AddDays(-14) -format 'yyyy-MM-dd'
    $EndDate = (Get-Date -format 'yyyy-MM-dd')
    
    # Retrieve the first three sign-in logs for the specified user account
    [array]$SignInRecords = Get-MgAuditLogSignIn -Filter "createdDateTime gt $StartDate and createdDateTime lt $EndDate and UserId eq '$UserId'" -Top 3 -Sort "createdDateTime DESC"

    # Make sure that we have successful
    $LastSignInRecord = $SignInRecords | Where-Object {$_.Status.errorcode -eq 0} | Select-Object -First 1

    # Return the date of the last successful sign-in
    if ($LastSignInRecord) {
        return $LastSignInRecord.CreatedDateTime
    } else {
        return $null
    }
}

ตัวอย่างการแลกเปลี่ยนออนไลน์

Exchange PowerShell มีมาตั้งแต่ปลายปี 2549 ดังนั้นจึงมีสคริปต์ Exchange จำนวนมากซ่อนอยู่ในที่เก็บ GitHub ฉันขอให้ GitHub Copilot “ค้นหากล่องจดหมายของผู้ใช้ Exchange Online ทั้งหมดที่มีที่อยู่อีเมลหลักที่เป็นของโดเมนที่ระบุ” GitHub Copilot ตอบกลับด้วย:

$domain = "example.com"
$mailboxes = Get-EXOMailbox -Filter "EmailAddresses -like '*@$domain'"

foreach ($mailbox in $mailboxes) {
    # Do something with each mailbox
    Write-Output $mailbox.UserPrincipalName
} 

รหัสใช้งานได้หากคุณอัปเดตตัวแปร $domain ด้วยชื่อโดเมน อย่างไรก็ตาม รหัสดังกล่าวไม่ดีนักเนื่องจากไม่ได้กรองกล่องจดหมายของผู้ใช้ตามที่ร้องขอ และกรองตามคุณสมบัติ EmailAddresses แทนที่จะเป็นที่อยู่ SMTP หลัก ไม่ว่าในกรณีใด มันเป็นสิ่งที่ต้องดำเนินการอย่างแน่นอน

ผู้ดูแลระบบ Exchange Online ได้เขียนสคริปต์เพื่อรายงานขนาดกล่องจดหมายเป็นเวลาหลายปี ฉันเพิ่งกล่าวถึงหัวข้อนี้ ดังนั้นจึงดูเหมือนเป็นการทดสอบที่ดีสำหรับ GitHub Copilot นี่คือพรอมต์ที่ฉันใช้:

เขียนสคริปต์ PowerShell เพื่อค้นหากล่องจดหมายของผู้ใช้ Exchange Online ทั้งหมด และรายงานจำนวนรายการและขนาดรายการรวม (เป็น MB) สำหรับแต่ละกล่องจดหมาย

GitHub Copilot สร้างสคริปต์นี้:

# Connect to Exchange Online
Connect-ExchangeOnline

# Get all user mailboxes
$mailboxes = Get-Mailbox -ResultSize Unlimited

# Iterate through each mailbox
foreach ($mailbox in $mailboxes) {
    $mailboxName = $mailbox.DisplayName
    $itemCount = (Get-MailboxStatistics -Identity $mailboxName).ItemCount
    $totalItemSize = (Get-MailboxStatistics -Identity $mailboxName).TotalItemSize.Value.ToMB()

    Write-Host "Mailbox: $mailboxName"
    Write-Host "Number of Items: $itemCount"
    Write-Host "Total Item Size: $totalItemSize MB"
    Write-Host "------------------------"
}

มันเป็นสคริปต์พื้นฐานที่ดูราวกับว่ามันอาจจะทำงานได้แต่ไม่ได้ผล Get-MailboxStatistics cmdlet ไม่มีวิธี ToMB ดังนั้นสคริปต์จึงล้มเหลวสำหรับทุกกล่องจดหมายที่มีข้อผิดพลาดนี้: “การเรียกใช้เมธอดล้มเหลวเนื่องจาก [Deserialized.Microsoft .Exchange.Data.ByteQuantifiedSize] ไม่มีเมธอดชื่อ 'ToMB'”

สิ่งที่ดีที่สุดที่สามารถพูดได้เกี่ยวกับสคริปต์ที่สร้างขึ้นคืออาจเป็นจุดเริ่มต้นสำหรับใครบางคนในการโจมตีปัญหา แต่เนื่องจากมีการเขียนสคริปต์จำนวนมากเพื่อแก้ไขปัญหานี้ ฉันจึงผิดหวังที่ GitHub Copilot ไม่ได้ให้ผลลัพธ์ที่ดีกว่านี้

โดยรวมแล้ว GitHub Copilot นั้นคุ้มค่ากับราคา

เช่นเดียวกับ generative AI คุณไม่สามารถสรุปได้ว่าทุกสิ่งที่ AI สร้างขึ้นนั้นแม่นยำและมีประโยชน์ ดังที่เราได้เห็นแล้วว่าโค้ดที่สร้างโดย GitHub Copilot ไม่ได้ทำงานตลอดเวลา และเมื่อเป็นเช่นนั้น โค้ดอาจจำเป็นต้องได้รับการปรับแต่งเพื่อให้ได้ผลลัพธ์ตามที่ต้องการ

นี่อาจเป็นสิ่งที่เฉพาะเจาะจงในการจัดการกับ PowerShell cmdlets จากโมดูล Microsoft 365 เพราะฉันไม่เห็นปัญหาเดียวกันกับ PowerShell สำหรับการใช้งานทั่วไป อัตราความสำเร็จของฉันในการสร้างโค้ดที่ดีอาจดีขึ้นเมื่อมีพร้อมท์ที่ดีขึ้นเช่นกัน

คำแนะนำที่ดีที่สุดที่ฉันสามารถให้ได้คือ คุณควรลองใช้ GitHub Copilot หากคุณยังไม่ได้ใช้งาน ฉันสงสัยว่าหากฉันเป็นนักพัฒนามืออาชีพ ฉันจะพบว่าการดึงข้อมูลจาก GitHub Copilot มีคุณค่ามากขึ้น สำหรับตอนนี้ ฉันพอใจกับความช่วยเหลือที่ AI มอบให้และคิดว่ามันคุ้มค่า 10 ดอลลาร์ต่อเดือน เมื่อเวลาผ่านไป ความสามารถของ GitHub Copilot ในการสร้างโค้ด PowerShell ที่ดีสำหรับ Microsoft 365 มีแนวโน้มที่จะดีขึ้น และราคาจะดูเหมือนเป็นการต่อรองราคาที่แท้จริง

บทความที่เกี่ยวข้อง