大量(70kを超える)の連絡先を定期的に処理してExchange環境にインポートするPowerShellスクリプトを作成しました。スクリプトは正常に機能しますが、可能であればスピードアップしたいと思います。最も時間のかかる部分は、データのインポートとエクスポートでした。
Exchange 2013コマンドレットへの依存関係のほとんどを削除することで、処理時間を大幅に短縮することができました。たとえば、Exchange固有のGet-MailContactとGet-Contactの組み合わせの代わりに、「ネイティブ」のGet-ADObjectコマンドレットを使用してデータを抽出すると、処理時間を10分の1に短縮できました。
コマンドは次のようになります。
$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固有のコマンドレットを使用せずに、メールが有効な連絡先を作成します。このコマンドを使用して連絡先を作成できました。
$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」コマンドレットを実行することです。これは、プロセスでExchangeコマンドレットを使用しないという目的を無効にします。
だから私の質問は、Exchange固有のコマンドレットに依存せずにNew-ADObjectコマンドレットのみを使用して機能的なメール対応の連絡先を作成する方法があるかどうか誰かが知っていますか?
ありがとうございました。
欠けている重要なアイテムは「showinaddressbook」プロパティであることがわかりました。
この記事では、その仕組みについて説明します: https://support.Microsoft.com/en-us/kb/253828
showInAddressBook属性には2つの目的があります。 1つ目は、Microsoft OutlookなどのMAPI(Messaging Application Programming Interface)クライアントを使用して、アドレスリストに表示されているエントリを表示することです。 2番目の目的は、ユーザーがMAPIクライアントで「名前を解決」できるようにすることです。
この記事はExchange 2007以降存在しない受信者更新サービス(RUS)について言及していますが、オブジェクトを有効にするメールの基本的なプロセスは同じであると思います。
したがって、基本的に、Exchange 2013コマンドレットを使用せずにメールが有効な連絡先を作成するには、次のようにしました。
$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}
私の推測では、proxyAddresses属性が欠落しています。 ADユーザーとコンピューターをチェックして、Enable-MailContact属性によって追加された属性を確認できます。