我编写了一个 powershell 脚本,用于定期处理大量(超过 70k)联系人并将其导入 Exchange 环境。该脚本运行良好,但如果可能的话,我希望加快速度。最耗时的部分是导入和导出数据。
通过删除对 Exchange 2013 cmdlet 的大部分依赖,我能够大幅缩短处理时间。例如,使用“本机”Get-ADObject cmdlet 提取数据,而不是结合使用 Exchange 特定的 Get-MailContact 和 Get-Contact,我能够将处理时间缩短 10 倍。
该命令如下所示:
$result = Get-ADObject -LDAPFilter "(objectClass=contact)" -searchBase "$OU" -ResultPageSize 100 -property GivenName, SN, DisplayName, Department, physicalDeliveryOfficeName , telephoneNumber, mailnickname, targetaddress | select @{ label="Email"; Expression={ ($_.targetaddress -replace "^SMTP:","").tostring().Tolower().Trim() }}, @{ N="Alias"; E={ $_.mailnickname} }, @{ N="FirstName"; E={ $_.GivenName} }, @{ N="LastName"; E={ $_.SN} }, DisplayName, @{ N="Office"; E={ $_.physicalDeliveryOfficeName} } , Department, @{ N="Phone"; E={ $_.telephoneNumber} }
现在,我希望能够执行相反的操作,即创建联系人。也就是说,创建启用邮件的联系人,而无需使用 Exchange 特定的 cmdlet。我设法使用以下命令创建联系人:
$Attributes = @{'displayName' = $displayname; 'GivenName' = $first; 'SN' = $last; 'Department' = $department; 'physicalDeliveryOfficeName' = $office; 'telephoneNumber' = $phone; 'mail' = $email; 'mailnickname' = $alias; 'targetaddress' = $email}
New-AdObject -Type Contact -Name $displayname -Path $OU -OtherAttributes $Attributes -whatif
然而,尽管对象显然已正确创建,但它并未显示在 Exchange 上的联系人中。到目前为止,我能够实现此目的的唯一方法是在创建对象后在其上运行“Enable-MailContact”cmdlet,这违背了在此过程中不使用 Exchange cmdlet 的目的。
所以我的问题是,是否有人知道是否有一种方法可以仅使用 New-ADObject cmdlet 来创建启用邮件的功能联系人,而不依赖于 Exchange 特定的 cmdlet?
谢谢。
答案1
事实证明,缺失的关键项目是“showinaddressbook”属性。
本文解释了它的工作原理:https://support.microsoft.com/en-us/kb/253828
这显示地址簿该属性有两个用途。第一个用途是让人们通过消息应用程序编程接口 (MAPI) 客户端(例如 Microsoft Outlook)查看地址列表中的条目。第二个用途是允许用户在 MAPI 客户端上“解析名称”。
尽管文章中提到的收件人更新服务 (RUS) 自 Exchange 2007 以来已不再存在,但我猜测邮件启用对象的底层过程仍然相同。
因此,基本上要在不使用 Exchange 2013 cmdlet 的情况下创建启用邮件的联系人,我做了类似的事情:
$alias = "ADDR-00001"
$email = "[email protected]"
$first = "Joe"
$last = "Doe"
$displayname = "DOE Joe"
$department = "My Dept."
$office = "My Office"
$phone = "55554448934"
$proxyAddresses = "SMTP:[email protected]"
$DestinationOU = "OU=contact,OU=example,DC=corp,DC=example,DC=com"
$AddressBook = "CN=Default Global Address List,CN=All Global Address Lists,CN=Address Lists Container,CN=Example-Org,CN=Microsoft Exchange,CN=Services,CN=Configuration,DC=corp,DC=example,DC=com","CN=All Contacts,CN=All Address Lists,CN=Address Lists Container,CN=Example-Org,CN=Microsoft Exchange,CN=Services,CN=Configuration,DC=corp,DC=example,DC=com"
$Attributes = @{'displayName' = $displayname; 'GivenName' = $first; 'SN' = $last; 'Department' = $department; 'physicalDeliveryOfficeName' = $office; 'telephoneNumber' = $phone; 'mail' = $email; 'mailnickname' = $alias; 'targetaddress' = $email; 'proxyAddresses' = $proxyAddresses; 'showinaddressbook' = $AddressBook;}
New-AdObject -Type Contact -Name $displayname -Path $DestinationOU -OtherAttributes $Attributes
结果对象仍然没有LegacyExchangeDN
值并且它有一个特殊的值ExchangeVersion
但是AddressListMembership
属性现在已被填充。
Get-Mailcontact "[email protected]" | select displayName, RecipientType, LegacyExchangeDN, ExchangeVersion, AddressListMembership| fl
DisplayName : DOE Joe
RecipientType : MailContact
LegacyExchangeDN :
ExchangeVersion : 0.0 (6.5.6500.0)
AddressListMembership : {\All Contacts, \Default Global Address List}
答案2
我猜是缺少 proxyAddresses 属性。您可以检查 AD 用户和计算机以查看由 Enable-MailContact 属性添加的属性。