当前位置:网站首页 > 更多 > 玩电脑 > 正文

[玩转系统] 使用 PowerShell 从 CSV 文件更新 AD 用户

作者:精品下载站 日期:2024-12-14 03:39:41 浏览:13 分类:玩电脑

使用 PowerShell 从 CSV 文件更新 AD 用户


我需要向一群 AD 用户更新他们的新职位。新的一年开始了,一些人升职并获得了新的职位。我收到了 HR 发来的一份 Excel 文件,其中包含他们的全名和新头衔。因为这种情况每年都会发生,所以是时候为其创建一个 PowerShell 脚本了。

作为奖励,我们还将向用户发送一封电子邮件,通知他们职位已更改。因此他们无需再联系 IT 部门。

在 PowerShell 中导入 CSV 文件

为了更新 AD 用户,我们将使用 CSV 文件。这允许我们在 PowerShell 中使用 Import-CSV cmdlet。我使用了以下 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

建议

默认情况下,分隔符是逗号(,),但您可以使用-Delimiter参数更改为逗号。正如您所看到的,我使用 $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 循环来遍历用户列表。

foreach($user in $promotions){
    # Find user
    $ADUser = Get-ADUser -Filter "displayname -eq '$($user.name)'"
}

所以我们正在努力让表中的每个用户都得到促销。现在一个好的做法是在用户不存在的情况下实现捕获。也许 HR 犯了一个拼写错误,可能会导致找不到该用户。

此外,我们稍后需要用户的电子邮件地址才能向他发送通知。将属性邮件添加到 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 来更新属性。在本例中为标题属性,但可以是任何与 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))
    }
}

如果您只想从 CSV 文件更新 AD 用户,那么您就完成了。如果您还想向他们发送电子邮件以通知他们有关更改的信息,请继续阅读。

向用户发送电子邮件

我正在使用电子邮件模板向用户发送电子邮件。 该模板是一个 HTML 文件,您可以在 GitHub 上将其与此脚本一起下载。在发送电子邮件之前,我们需要用用户名和新标题替换一些占位符。此外,我们还需要一个 SMTP 服务器来发送电子邮件。

设置 STMP 详细信息

下面是一个包含 SMTP 详细信息的简单数组,例如服务器和发件人地址。

#SMPT Details to send the email
$smtp = @{
	"address" = "stonegrovebank.mail.protection.outlook.com"
	"from" = "[email protected]>"
	"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 循环中,在 Set-ADuser cmd 之后,我们添加以下行来调用该函数并构建电子邮件正文:

 $emailBody = Get-EmailTemplate -user $ADUser -JobTitle $user.jobtitle

发送电子邮件

最后一个功能是发送电子邮件。它从 SMTP 数组中获取 SMTP 详细信息,并使用提供的信息发送电子邮件。我在其中添加了一个假设变量,以便您可以在发送实际电子邮件之前运行测试。

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 循环现在看起来像这样:

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 标志。一份用于设置 ADUser,一份用于发送邮件。这样,您可以在实际更改或发送任何内容之前运行脚本来测试它。

结论

我希望上面的代码可以帮助您使用 PowerShell 从 CSV 文件更新 AD 用户。您可以在我的 GitHub 存储库中找到完整的脚本和电子邮件模板。

如果您有任何疑问,请在下面添加评论。

您需要 登录账户 后才能发表评论

取消回复欢迎 发表评论:

关灯