Active-Directory

在不使用 Exchange 特定 cmdlet 的情況下創建有效的啟用郵件的聯繫人

  • December 27, 2015

我編寫了一個 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 創建啟用郵件功能的聯繫人?

謝謝你。

事實證明,關鍵的缺失項是“showinaddressbook”屬性。

本文解釋了它是如何工作的:https: //support.microsoft.com/en-us/kb/253828

showInAddressBook屬性有兩個用途。第一種是通過消息應用程序程式介面 (MAPI) 客戶端,例如 Microsoft Outlook,讓人們看到地址列表中列出的條目。第二個目的是允許使用者在 MAPI 客戶端上“解析名稱”。

儘管這篇文章提到了自 Exchange 2007 以來不再存在的收件人更新服務 (RUS),但我猜郵件啟用對象的底層過程仍然是相同的。

所以基本上要在不使用 Exchange 2013 cmdlet 的情況下創建一個啟用郵件的聯繫人,我做了這樣的事情:

$alias = "ADDR-00001"
$email = "jdoe@somewhere.com"
$first = "Joe"
$last = "Doe"
$displayname = "DOE Joe"
$department = "My Dept."
$office = "My Office"
$phone = "55554448934"
$proxyAddresses = "SMTP:jdoe@somewhere.com"
$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值,它有一個特殊的ExchangeVersionAddressListMembership現在填充了屬性。

Get-Mailcontact "jdoe@somewhere.com" | 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}

引用自:https://serverfault.com/questions/744647