[玩转系统] 使用 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 存储库中找到完整的脚本和电子邮件模板。
如果您有任何疑问,请在下面添加评论。
猜你还喜欢
- 03-30 [玩转系统] 如何用批处理实现关机,注销,重启和锁定计算机
- 02-14 [系统故障] Win10下报错:该文件没有与之关联的应用来执行该操作
- 01-07 [系统问题] Win10--解决锁屏后会断网的问题
- 01-02 [系统技巧] Windows系统如何关闭防火墙保姆式教程,超详细
- 12-15 [玩转系统] 如何在 Windows 10 和 11 上允许多个 RDP 会话
- 12-15 [玩转系统] 查找 Exchange/Microsoft 365 中不活动(未使用)的通讯组列表
- 12-15 [玩转系统] 如何在 Windows 上安装远程服务器管理工具 (RSAT)
- 12-15 [玩转系统] 如何在 Windows 上重置组策略设置
- 12-15 [玩转系统] 如何获取计算机上的本地管理员列表?
- 12-15 [玩转系统] 在 Visual Studio Code 中连接到 MS SQL Server 数据库
- 12-15 [玩转系统] 如何降级 Windows Server 版本或许可证
- 12-15 [玩转系统] 如何允许非管理员用户在 Windows 中启动/停止服务
取消回复欢迎 你 发表评论:
- 精品推荐!
-
- 最新文章
- 热门文章
- 热评文章
[影视] 黑道中人 Alto Knights(2025)剧情 犯罪 历史 电影
[古装剧] [七侠五义][全75集][WEB-MP4/76G][国语无字][1080P][焦恩俊经典]
[实用软件] 虚拟手机号 电话 验证码 注册
[电视剧] 安眠书店/你 第五季 You Season 5 (2025) 【全10集】
[电视剧] 棋士(2025) 4K 1080P【全22集】悬疑 犯罪 王宝强 陈明昊
[软件合集] 25年6月5日 精选软件22个
[软件合集] 25年6月4日 精选软件36个
[短剧] 2025年06月04日 精选+付费短剧推荐33部
[短剧] 2025年06月03日 精选+付费短剧推荐25部
[软件合集] 25年6月3日 精选软件44个
[剧集] [央视][笑傲江湖][2001][DVD-RMVB][高清][40集全]李亚鹏、许晴、苗乙乙
[电视剧] 欢乐颂.5部全 (2016-2024)
[电视剧] [突围] [45集全] [WEB-MP4/每集1.5GB] [国语/内嵌中文字幕] [4K-2160P] [无水印]
[影视] 【稀有资源】香港老片 艺坛照妖镜之96应召名册 (1996)
[剧集] 神经风云(2023)(完结).4K
[剧集] [BT] [TVB] [黑夜彩虹(2003)] [全21集] [粤语中字] [TV-RMVB]
[实用软件] 虚拟手机号 电话 验证码 注册
[资源] B站充电视频合集,包含多位重量级up主,全是大佬真金白银买来的~【99GB】
[影视] 内地绝版高清录像带 [mpg]
[书籍] 古今奇书禁书三教九流资料大合集 猎奇必备珍藏资源PDF版 1.14G
[电视剧] [突围] [45集全] [WEB-MP4/每集1.5GB] [国语/内嵌中文字幕] [4K-2160P] [无水印]
[剧集] [央视][笑傲江湖][2001][DVD-RMVB][高清][40集全]李亚鹏、许晴、苗乙乙
[电影] 美国队长4 4K原盘REMUX 杜比视界 内封简繁英双语字幕 49G
[电影] 死神来了(1-6)大合集!
[软件合集] 25年05月13日 精选软件16个
[精品软件] 25年05月15日 精选软件18个
[绝版资源] 南与北 第1-2季 合集 North and South (1985) /美国/豆瓣: 8.8[1080P][中文字幕]
[软件] 25年05月14日 精选软件57个
[短剧] 2025年05月14日 精选+付费短剧推荐39部
[短剧] 2025年05月15日 精选+付费短剧推荐36部
- 最新评论
-
- 热门tag