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

การใช้ 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 ของฉัน

หากคุณมีคำถามใด ๆ เพียงเพิ่มความคิดเห็นด้านล่าง

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