PowerShell 替换 Office365 用户主邮件地址

最近公司一个部门改组,所有人的主邮件都需要改成新的后缀。我们使用的是Office365,用户信息都是通过DirSync同步本地的AD到云上,因此不能直接使用Exchange的命令修改,而需要在本地的AD上改完之后,再同步到Azure AD上。

基本思路,修改用户和组的proxyaddresses参数,这个就是一大串字符串;大写的SMTP表示主地址,小写的代表别名。 修改之后同步的O365就行了。

这些用户的新的邮件地址我之前已经通过以下的方式添加为别名了,因此只需要在指定时间和现在的主地址交换一下就行了。 这些改动都可以通过 ADSI Edit的界面来查看属性。

set-aduser user -add @{proxyaddresses="smtp:XXXXXX"}

交换的代码如下

#首先我得获取一个名单,这个名单一部分是现有AD里面的,还有一部分是通过Excel发给我的

[email protected]()
$users=get-aduser -Filter {proxyaddresses -like "*old.com.au*"} -Properties proxyaddresses -SearchBase "ou=old,ou=melbourne,dc=test,dc=com,dc=au"
foreach( $user in $users){
foreach ($address in $user.proxyAddresses)
{
   if($address -like "*@old.com.au*"){
   
   $rappaddress=$address.Substring(5)
   break;
   
   }
   
}
$temp=[pscustomobject]@{"Full Name"=$user.Name;"Current Email"=$rappaddress}
$result+=$temp
}
#$result
$a=import-csv C:\temp\newuserList.csv | select "Full Name", "Current Email"
$oo=$result+$a

#获取名单以后,对于名单当前的用户 我希望获取他们的主邮件地址,于是写了个function

function Get-PrimarySMTP(){
    [CmdletBinding()]
    
    Param
    (
        # Param1 help description
        [Parameter(Mandatory=$true,
                   ValueFromPipelineByPropertyName=$true,
                   Position=0)]
        [string[]]
        $users
    )
$pp=$null
[email protected]{‘name‘=$null;‘primarysmtp‘=$null}
$obj=New-Object -TypeName psobject -Property $pp
 
[email protected]()
foreach($user in $users){
$info=get-aduser -Filter {name -eq $user} -Properties proxyaddresses
$primarySMTPAddress = ""
foreach ($address in $info.proxyAddresses)
{
    if (($address.Length -gt 5) -and ($address.SubString(0,5) -ceq ‘SMTP:‘) )
    {
        $primarySMTPAddress = $address.SubString(5)
        
        break
    }
}
$objtemp=$obj | select *
$objtemp.name=$info.Name
$objtemp.primarysmtp=$primarySMTPAddress
$result+=$objtemp
}
$result 
}

#执行看看 当前用户的主SMTP地址
Get-PrimarySMTP -users $users

#对于每一个用户的每一个地址进行循环,如果是大写的那就变成小写,如果小写的刚好是我需要的那个,那就改成大写

$users=$oo | sort "full Name"|select -ExpandProperty "Full Name"

foreach($user in $users){
$info=get-aduser -Filter {name -eq $user} -Properties proxyaddresses
$filter="smtp:"+$info.GivenName+"."+$info.Surname+"@new.com"
[email protected]()
foreach($address in $info.proxyaddresses){
$temp=$address
if($address -clike "SMTP*"){
$temp=$address.ToLower()
}
if($address -like $filter){
$temp=$address.Substring(0,4).toupper()+$address.Substring(4).tolower()
}
$new+=$temp
}
write-host "---------------------------" -ForegroundColor Cyan  
$new
set-aduser $info.SamAccountName -Replace @{proxyaddresses=$new} -confirm
}

#然后同步一下DC
repadmin /syncall syddc01 dc=omnicom,dc=com,dc=au /d /e /a 

#再看看新的的SMTP主地址
Get-PrimarySMTP -users $users

#同步到O365
import-module dirsync
Start-OnlineCoexistenceSync

#通过Azure AD 模块查询O365的邮箱看看是否已经更新了
$users | get-mailbox | select name, primarysmtpaddress
时间: 2024-08-08 17:55:18

PowerShell 替换 Office365 用户主邮件地址的相关文章

java正则表达式小练习(IP地址检测、排序,叠词的处理,邮件地址的获取)

import java.util.Arrays; import java.util.Comparator; import java.util.Scanner; import java.util.regex.Matcher; import java.util.regex.Pattern; class MyComparator implements Comparator<String>{ public int compare(String ip1, String ip2) { Pattern p

如何用Windows PowerShell替换命令提示符

在Windows 10的"开始"按钮中将PowerShell替换为命令提示符,这不是很好吗?我知道你会有疑问,为什么要这样做?可能会失去了运行DOS命令的能力.好吧,让我解释一下.首先,Windows操作系统中没有DOS这样的东西.有些人错误地将DOS命令提示符称为命令提示符.命令提示符绝对不是DOS提示符.这是一个Windows应用程序,可让您运行我们用于在DOS中运行的命令行工具.就你担心无法运行命令行工具而言,不用担心,你仍然可以运行最常用命令的最常用命令,例如ipconfig,

判断邮件地址是否存在的方法

公司邮箱目前使用的是Zimbra,该邮件服务器目前不甚稳定,经常出现重发.漏发问题.经测试,每100封邮件仅可成功发送98封左右,以下是测试数据: 测试用例1:100封,总用时约:16min:实收97封,失败3次,3次错误信息均为:javax.mail.MessagingException: Could not connect to SMTP host 测试用例2:100封,总用时约:16min:实收100封,失败2次,错误同上.加失败重发机制,失败后等待10s重发,最多重发3次: 测试用例3:

Linux Shell编程实战---解析文本中的邮件地址和url

解析文本中的邮件地址和url (1).使用场景 从给定的文件中解析出所需要的文本是从事文本处理时常见的一项任务.诸如电子邮件地址.URL等都能够借助适合的正则表达式找出来.我们通常需要从一个包含大量无关字符及单词的电子邮件客户列表或HTML网页中将电子邮件地址解析并提取出来. (2).正则匹配 匹配一个电子邮件地址的正则表达式如下: [A-Za-z0-9._][email protected][A-Za-z0-9.]+\.[a-zA-Z]{2,4} 匹配HTTP URL的正则表达式如下: htt

米老师如果处理邮件地址错误事件

背景 前几天我们九期所有成员进行了一次特殊的考试,很高兴,自己当天在机房(一般都在),所以,也参加了这次的考试. 试卷的内容非常的好,题非常的经典,所以,考后想再看看相应题,于是,考后找昌哥要卷子,昌哥说没有了,然后,就和米老师交流要卷子,在要卷子的过程发生了一件让人深思的事情. 事件内容 考完试的第二天12点左右,通过飞信联系米老师,希望能够马上拿到一份卷子,米老师收到信息后,回信说,我马上给你一份电子版的,然后,几秒钟后,米老师给我回信说,已经发过去了,于是,我马上收邮件,结果没有收到,当时

php正则表达式验证(邮件地址、Url地址、电话号码、邮政编码)

1.电子邮件地址的校验 <?php /* 校验邮件地址*/ function checkMail($email) { //用户名,由"w"格式字符."-"或"."组成 $email_name= "\w|(\w[-.\w]*\w)"; //域名中的第一段,规则和用户名类似,不包括点号"." $code_at= "@"; $per_domain= "\w|(\w[-\w]*\

jquery正则表达式验证【是否带有小数、是否中文名称组成、是否全由8位数字组成、电话码格式、邮件地址】

1 <form name="myform" action="" onsubmit="return fun1()"> 2 <div align="center"> 3 <table border="1" width="60%" > 4 <tr> 5 <td colspan=2 align=center><h3>学生信息

python从任意文件读取邮件地址输出的代码

如下的资料是关于python从任意文件读取邮件地址输出的代码. # This script takes whatever you throw at stdin and outputs email addresses.# eg. python email_extractor.py < PythonFAQ.html# This script can be used for whatever you want, EXCEPT SPAMMING !import sys,reprint 'n'.join(

exchange2016 4节点完整安装之接受域及邮件地址策略配置

因本次活动目录域名称与电子邮件使用的后缀不一样,需添加一个接受域,在添加完接受域后原先的默认接受域可以删除配置接受域 编辑现有默认邮件地址策略添加新邮件后缀应用该邮件地址格式 原文地址:https://blog.51cto.com/yourcloud/2430761