Powershell 更新某些“用户”的电子邮件地址;“我的联系人”;适用于Office 365用户

Powershell 更新某些“用户”的电子邮件地址;“我的联系人”;适用于Office 365用户,powershell,Powershell,我们有一个Office 365部署,从另一个提供商迁移。用户拥有大量的个人通讯簿(在Outlook中标记为“我的联系人”) 我们密切合作的一家公司最近更改了域名。我需要更新我们用户的个人联系人,以便“@foobar.com”的电子邮件地址现在转到“@foobar.co.uk”。让用户自己做这件事比它的价值要麻烦得多 在使用PowerShell更新全球通讯簿方面似乎有很多指导,但在如何为个人用户更新“我的联系人”方面却没有 是否有用于在PowerShell中编辑个人用户的个人联系人的示例或代码片段

我们有一个Office 365部署,从另一个提供商迁移。用户拥有大量的个人通讯簿(在Outlook中标记为“我的联系人”)

我们密切合作的一家公司最近更改了域名。我需要更新我们用户的个人联系人,以便“@foobar.com”的电子邮件地址现在转到“@foobar.co.uk”。让用户自己做这件事比它的价值要麻烦得多

在使用PowerShell更新全球通讯簿方面似乎有很多指导,但在如何为个人用户更新“我的联系人”方面却没有


是否有用于在PowerShell中编辑个人用户的个人联系人的示例或代码片段?或者任何性质类似的示例脚本?

当我在我的
联系人
文件夹中设置联系人时,我可以确认以下代码片段对我有效,并且它成功地重写并正确保存了联系人。请注意,我还更改了
DisplayName
字段,因为(在我所在的位置)在某些情况下,这不会被重新写入以反映正确的地址

警告:我现在已经禁用(注释)此代码中的实际工作。因为它只会在你的
contacts
文件夹中挖掘未知数量(数千或更多?)的联系人(而不是带有此代码的全局地址列表)

<强>中间的三行只有当您通过“代码”>写主机< /COD>命令查看预期输出时才被取消注释。< /强>

我很不愿意发现我试图帮助你,结果却改写了大量的联系人,头痛难忍

这就是说,这肯定会给你一个领先的开始,你可以根据自己的喜好/需要进行修改

$olApp = new-object -comobject outlook.application
$namespace = $olApp.GetNamespace("MAPI")
$Contacts = $namespace.GetDefaultFolder(10)

foreach ($Entry in $Contacts.Items)
{

    if ($Entry.Email1Address -like "*foobar*")
    {
        $newAddress = $Entry.Email1Address -replace "foobar.com", "foobar.co.uk"
        $newDisplayName = $Entry.Email1DisplayName -replace "foobar.com", "foobar.co.uk"

        #UNCOMMENT the below lines, once you've confirmed it will work as expected for you
        #$Entry.Email1Address = $newAddress
        #$Entry.Email1DisplayName = $newDisplayName
        #$Entry.Save()

        #COMMENT OUT (or don't) the three below lines, once you've validated that this will work in your environment
        $Entry | Format-Table FullName,Email1Address,Email1DisplayName
        Write-Host ("Would convert " + $Entry.Email1Address + " to... " + $newAddress)
        Write-Host ("Now displayed as " + $Entry.Email1DisplayName + " to... " + $newDisplayName)
    }

}

$olApp.Quit | Out-Null
[GC]::Collect()

<强>进一步披露:考虑在企业侧运行该联系人列表之前备份您的联系人列表。另外,请参阅我上面关于某些企业系统未在标准

中显示电子邮件地址的说明abc@xyz.com
格式。因此,为什么我还提供了
Write Host
命令,以允许您查看是否存在类似问题。如果是这样,请让我们知道,我将尝试进一步深入了解如何正确引用(如果可能的话)

您可能必须使用批处理文件将其提供给用户,因此您不必解释如何运行它,也取决于您的企业中配置了什么
ExecutionPolicy


我的安装说明:Windows 7、Office 365(Outlook 2016-16.0.6366.2062)和PowerShell 5.0,不过我觉得这里的cmdlet和引用是通用的。如果您有问题,也就是说。

我认为唯一可以做到这一点的方法是使用Outlook COM对象。您必须将其作为用户加载,找到符合该条件的联系人,然后将其替换。然而,我不确定是否存在这样做的方法。如果可以的话,您可能需要创建一个脚本并作为用户在其上下文中运行它。我使用本文创建了一个COM对象,但在更新联系人方面没有取得太大进展:到目前为止,我在自己的测试中取得了相当大的成功。但是,我要警告您,您的
联系人
通讯簿可能会混淆电子邮件地址。。。它们可能看起来不像
abc@xyz.com
,当您拉入对象属性时,它可能看起来像
/O=COMPANY/OU=Admin/cn=Recipients/
或类似的东西。对于任何手动输入的电子邮件,它们都能按预期工作。这在我的帐户下非常有效-抱歉,如果您已经解释过(或者应该已经知道)的话,它会很密集-如何使其修改域中其他人的联系人?上面的代码看起来更像是在我的本地计算机上操作Outlook,而不是与Office 365交互。@Metalshark-Q1:正如我在回答中所指出的,您需要向他们提供批处理文件(以满足任何域特定的要求),或有关如何手动启动PowerShell脚本的说明。注意:它只会更新文件夹
My Contacts
,如
GetDefaultFolder(10)
(10是
My Contacts
文件夹)所示。@Metalshark-它是一个
COM对象
,创建用于通过Outlook进行交互,并进入
My Contacts
文件夹,是的。“与Office 365交互”是什么意思?如果您想要更新Active Directory的方法,那将是另一个问题。我相信你提到了“个人联系人”,需要更新-这就是我的联系人。当你说你想“与Office 365”交互时,你能澄清一下你的意思吗?这当然是最接近的解决方案,我很感激你在回答这个问题时所付出的努力