การใช้ PowerShell เพื่ออัปเดตผู้ใช้ AD จากไฟล์ CSV
ฉันจำเป็นต้องอัปเดตผู้ใช้ AD จำนวนหนึ่งด้วยตำแหน่งงานใหม่ของพวกเขา เริ่มต้นปีใหม่แล้ว บ้างก็เลื่อนตำแหน่งและได้รับตำแหน่งงานใหม่ ฉันจึงได้รับไฟล์ Excel พร้อมชื่อเต็มและชื่อใหม่จากฝ่ายทรัพยากรบุคคล เนื่องจากสิ่งนี้เกิดขึ้นทุกปี ถึงเวลาสร้างสคริปต์ PowerShell แล้วหรือยัง
นอกจากนี้ เรายังจะส่งอีเมลถึงผู้ใช้เพื่อแจ้งให้ทราบว่าตำแหน่งงานของพวกเขามีการเปลี่ยนแปลง พวกเขาจึงไม่ต้องติดต่อฝ่ายไอทีอีกต่อไป
การนำเข้าไฟล์ CSV ใน PowerShell
เพื่ออัปเดตผู้ใช้ AD เราจะใช้ไฟล์ CSV ซึ่งช่วยให้เราใช้ Import-CSV cmdlet ใน PowerShell ฉันใช้ตาราง Excel ต่อไปนี้ซึ่งฉันได้บันทึกเป็น CSV
- name
ตำแหน่งงาน
- John Doe
ผู้จัดการบัญชีอาวุโส
- Jane Doe
-
ผู้จัดการบัญชี
- Salina Scott
วิศวกร
- Jasper Rempel
วิศวกรรุ่นน้อง
ด้วยพารามิเตอร์ csvPath เราสามารถระบุตำแหน่งของไฟล์ CSV ที่เราต้องการนำเข้าได้
Set-UserPromotions.ps1 -csvPath c:\temp\promotions.csvตอนนี้เพื่อนำเข้าไฟล์ CSV ไปยัง PowerShell เราจะใช้คำสั่งต่อไปนี้ในภายหลัง:
$promotions = Import-Csv -Delimiter ";" -Path $csvPathคำแนะนำ
ตามค่าเริ่มต้น ตัวคั่นจะเป็นลูกน้ำ ( , ) แต่คุณสามารถเปลี่ยนได้โดยใช้พารามิเตอร์ -ตัวคั่น อย่างที่คุณเห็นว่าฉันกำลังใช้ $rootPath เพื่ออ้างอิงถึงตำแหน่งสคริปต์ คุณสามารถกรอกเส้นทางที่แน่นอนไปยังไฟล์ได้ที่นี่
ผลลัพธ์ของ $promotions คือ:
name jobtitle
-------------
John Doe senior accountmanager
Jane Doe accountmanager
Salina Scott Engineer
Jasper Rempel junior engineer
ค้นหาผู้ใช้ AD ที่จะอัปเดต
ขั้นตอนต่อไปคือการค้นหาผู้ใช้ใน Active Directory เราจำเป็นต้องค้นหาผู้ใช้ตามชื่อเต็มของพวกเขา เราจะใช้ Get-ADUser cmdlet สำหรับสิ่งนี้และกรองผลลัพธ์ตามชื่อที่แสดง
เราไม่มีผู้ใช้เพียงรายเดียว แต่มีรายชื่อทั้งหมด ดังนั้นเราจะใช้ foreach loop เพื่อเดินผ่านรายชื่อผู้ใช้
foreach($user in $promotions){
# Find user
$ADUser = Get-ADUser -Filter "displayname -eq '$($user.name)'"
}ดังนั้นเราจึงพยายามให้ผู้ใช้แต่ละคนอยู่ในโปรโมชันตาราง แนวทางปฏิบัติที่ดีในตอนนี้คือการใช้ catch ในกรณีที่ไม่มีผู้ใช้อยู่ บางทีฝ่ายทรัพยากรบุคคลอาจพิมพ์ผิดซึ่งอาจส่งผลให้ไม่พบผู้ใช้
นอกจากนี้ เราต้องการที่อยู่อีเมลของผู้ใช้ในภายหลังเพื่อส่งการแจ้งเตือนถึงเขา เพิ่มจดหมายคุณสมบัติไปที่ Get-ADUser cmd
foreach($user in $promotions){
#find user
$ADUser = Get-ADUser -Filter "displayname -eq '$($user.user)'" -Properties mail
if ($ADUser){
# <update the user>
}else{
Write-Warning ("Failed to update " + $($user.user))
}
}การอัปเดตผู้ใช้ AD
หากมีผู้ใช้อยู่ใน Active Directory เราสามารถใช้ Set-ADUser เพื่ออัปเดตแอตทริบิวต์ได้ ในกรณีนี้คือแอตทริบิวต์ title แต่อาจเป็นแอตทริบิวต์ที่เกี่ยวข้องกับผู้ใช้ AD ก็ได้
คำแนะนำ
อ่านเพิ่มเติมเกี่ยวกับ Set-ADUser cmdlet ในบทความนี้
foreach($user in $promotions){
# Find user
$ADUser = Get-ADUser -Filter "displayname -eq '$($user.name)'" -Properties mail
if ($ADUser){
Set-ADUser -Identity $ADUser -Title $user.jobtitle
}else{
Write-Warning ("Failed to update " + $($user.name))
}
}หากคุณต้องการอัปเดตผู้ใช้ AD จากไฟล์ CSV เท่านั้น แสดงว่าคุณดำเนินการเสร็จแล้ว หากคุณต้องการส่งอีเมลเพื่อแจ้งให้ทราบเกี่ยวกับการเปลี่ยนแปลง โปรดอ่านต่อ
การส่งอีเมลถึงผู้ใช้
ฉันใช้เทมเพลตอีเมลเพื่อส่งอีเมลถึงผู้ใช้ เทมเพลตนี้เป็นไฟล์ HTML ที่คุณดาวน์โหลดได้ที่นี่บน GitHub พร้อมกับสคริปต์นี้ ก่อนที่เราจะสามารถส่งอีเมลได้ เราจำเป็นต้องแทนที่ตัวยึดตำแหน่งบางส่วนด้วยชื่อผู้ใช้และชื่อใหม่ นอกจากนี้เรายังต้องมีเซิร์ฟเวอร์ SMTP สำหรับการส่งอีเมล
การตั้งค่ารายละเอียด STMP
ด้านล่างนี้เป็นอาร์เรย์แบบง่ายที่มีรายละเอียด SMTP เช่น เซิร์ฟเวอร์และที่อยู่จาก
#SMPT Details to send the email
$smtp = @{
"address" = "stonegrovebank.mail.protection.outlook.com"
"from" = "itdept@stonegrovebank.com>"
"subject" = "Jobtitle updated."
}การสร้างเนื้อหาอีเมล
ฉันมีฟังก์ชันที่ใช้สร้างเนื้อหาอีเมล การใช้ฟังก์ชันช่วยให้ฉันสามารถใช้โค้ดบางส่วนในสคริปต์ต่างๆ ซ้ำได้ ฟังก์ชันแรกจะได้รับเทมเพลตอีเมลและแทนที่ตัวยึดตำแหน่งด้วยข้อมูลที่ถูกต้อง
Function Get-EmailTemplate {
<#
.SYNOPSIS
Get the eamil template which is located in the same location as the script
#>
PARAM(
[parameter(Mandatory=$true)]
$user,
[parameter(Mandatory=$true)]
$jobtitle
)
PROCESS
{
#Get the mailtemplate
$mailTemplate = (Get-Content ($rootPath + '\MailTemplate.html')) | ForEach-Object {
$_ -replace '{{user.jobtitle}}', $jobtitle`
-replace '{{user.firstname}}', $user.givenName
} | Out-String
return $mailTemplate
}
}ใน foreach loop หลังจาก Set-ADuser cmd เราจะเพิ่มบรรทัดต่อไปนี้เพื่อเรียกใช้ฟังก์ชันและสร้างเนื้อหาอีเมล:
$emailBody = Get-EmailTemplate -user $ADUser -JobTitle $user.jobtitleกำลังส่งอีเมล
ฟังก์ชั่นสุดท้ายคือการส่งอีเมล ใช้รายละเอียด SMTP จากอาร์เรย์ SMTP และใช้ข้อมูลที่ให้มาเพื่อส่งอีเมล ฉันได้เพิ่มตัวแปร what-if ลงไปเพื่อให้คุณสามารถทดสอบก่อนส่งอีเมลจริงได้
Function Send-Mail {
<#
.SYNOPSIS
Send the user a mail.
#>
PARAM(
[parameter(Mandatory=$true)]
$emailBody,
[parameter(Mandatory=$true)]
$user,
[parameter(Mandatory=$false)]
[bool]$whatIf
)
PROCESS
{
#Set encoding
$encoding = [System.Text.Encoding]::UTF8
Try
{
if ($whatIf -ne $true)
{
send-MailMessage -SmtpServer $smtp.address -To $user.mail -From $smtp.from -Subject $smtp.subject -Encoding $encoding -Body $emailBody -BodyAsHtml
}
else
{
Write-host ("Send mail to -SmtpServer " + $smtp.address + " -To " + $user.mail + " -From " + $smtp.from + " -Subject $smtp.subject")
}
}
Catch
{
Write-Error "Failed to send email to, $_"
}
}
}
เราเรียกฟังก์ชันนี้ด้วย cmd ต่อไปนี้ที่เราเพิ่มไว้ใต้เนื้อหาอีเมล:
Send-Mail -user $ADUser -EmailBody $emailBody
ดังนั้น foreach loop ที่สมบูรณ์ตอนนี้จะมีลักษณะดังนี้:
foreach($user in $promotions){
#find user
$ADUser = Get-ADUser -Filter "displayname -eq '$($user.user)'" -Properties mail
if ($ADUser){
Set-ADUser -Identity $ADUser -Title $user.jobtitle -WhatIf
$emailBody = Get-EmailTemplate -user $ADUser -JobTitle $user.jobtitle
Send-Mail -user $ADUser -EmailBody $emailBody -whatIf $true
}else{
Write-Warning ("Failed to update " + $($user.user))
}
}โปรดสังเกตว่าฉันได้เพิ่มแฟล็ก WhatIf สองรายการ หนึ่งรายการสำหรับ Set-ADUser และอีกรายการหนึ่งสำหรับ Send-mail วิธีนี้ทำให้คุณสามารถเรียกใช้สคริปต์เพื่อทดสอบก่อนที่จะเปลี่ยนแปลงหรือส่งสิ่งใดจริงๆ
บทสรุป
ฉันหวังว่าโค้ดข้างต้นจะช่วยคุณอัปเดตผู้ใช้โฆษณาของคุณจากไฟล์ CSV ด้วย PowerShell คุณสามารถค้นหาสคริปต์และเทมเพลตอีเมลฉบับสมบูรณ์ได้ที่นี่ในพื้นที่เก็บข้อมูล GitHub ของฉัน
หากคุณมีคำถามใด ๆ เพียงเพิ่มความคิดเห็นด้านล่าง