functions/contacts/New-EXCContact.ps1
function New-EXCContact { <# .SYNOPSIS Creates a Contact in a Contact folder in a Mailbox using the Exchange Web Services API .DESCRIPTION Creates a Contact in a Contact folder in a Mailbox using the Exchange Web Services API Requires the EWS Managed API from https://www.microsoft.com/en-us/download/details.aspx?id=42951 .PARAMETER MailboxName A description of the MailboxName parameter. .PARAMETER DisplayName A description of the DisplayName parameter. .PARAMETER FirstName A description of the FirstName parameter. .PARAMETER LastName A description of the LastName parameter. .PARAMETER EmailAddress A description of the EmailAddress parameter. .PARAMETER CompanyName A description of the CompanyName parameter. .PARAMETER Credentials A description of the Credentials parameter. .PARAMETER Department A description of the Department parameter. .PARAMETER Office A description of the Office parameter. .PARAMETER BusinssPhone A description of the BusinssPhone parameter. .PARAMETER MobilePhone A description of the MobilePhone parameter. .PARAMETER HomePhone A description of the HomePhone parameter. .PARAMETER IMAddress A description of the IMAddress parameter. .PARAMETER Street A description of the Street parameter. .PARAMETER City A description of the City parameter. .PARAMETER State A description of the State parameter. .PARAMETER PostalCode A description of the PostalCode parameter. .PARAMETER Country A description of the Country parameter. .PARAMETER JobTitle A description of the JobTitle parameter. .PARAMETER Notes A description of the Notes parameter. .PARAMETER Photo A description of the Photo parameter. .PARAMETER FileAs A description of the FileAs parameter. .PARAMETER WebSite A description of the WebSite parameter. .PARAMETER Title A description of the Title parameter. .PARAMETER Folder A description of the Folder parameter. .PARAMETER EmailAddressDisplayAs A description of the EmailAddressDisplayAs parameter. .PARAMETER useImpersonation A description of the useImpersonation parameter. .EXAMPLE Example 1 To create a contact in the default contacts folder New-EXCContact -Mailboxname mailbox@domain.com -EmailAddress contactEmai@domain.com -FirstName John -LastName Doe -DisplayName "John Doe" .EXAMPLE Example 2 To create a contact and add a contact picture New-EXCContact -Mailboxname mailbox@domain.com -EmailAddress contactEmai@domain.com -FirstName John -LastName Doe -DisplayName "John Doe" -photo 'c:\photo\Jdoe.jpg' .EXAMPLE Example 3 To create a contact in a user created subfolder New-EXCContact -Mailboxname mailbox@domain.com -EmailAddress contactEmai@domain.com -FirstName John -LastName Doe -DisplayName "John Doe" -Folder "\MyCustomContacts" This cmdlet uses the EmailAddress as unique key so it wont let you create a contact with that email address if one already exists. #> [CmdletBinding()] param ( [Parameter(Position = 0, Mandatory = $true)] [string] $MailboxName, [Parameter(Position = 1, Mandatory = $true)] [string] $DisplayName, [Parameter(Position = 2, Mandatory = $true)] [string] $FirstName, [Parameter(Position = 3, Mandatory = $true)] [string] $LastName, [Parameter(Position = 4, Mandatory = $true)] [string] $EmailAddress, [Parameter(Position = 5, Mandatory = $false)] [string] $CompanyName, [Parameter(Position = 6, Mandatory = $false)] [System.Management.Automation.PSCredential] $Credentials, [Parameter(Position = 7, Mandatory = $false)] [string] $Department, [Parameter(Position = 8, Mandatory = $false)] [string] $Office, [Parameter(Position = 9, Mandatory = $false)] [string] $BusinssPhone, [Parameter(Position = 10, Mandatory = $false)] [string] $MobilePhone, [Parameter(Position = 11, Mandatory = $false)] [string] $HomePhone, [Parameter(Position = 12, Mandatory = $false)] [string] $IMAddress, [Parameter(Position = 13, Mandatory = $false)] [string] $Street, [Parameter(Position = 14, Mandatory = $false)] [string] $City, [Parameter(Position = 15, Mandatory = $false)] [string] $State, [Parameter(Position = 16, Mandatory = $false)] [string] $PostalCode, [Parameter(Position = 17, Mandatory = $false)] [string] $Country, [Parameter(Position = 18, Mandatory = $false)] [string] $JobTitle, [Parameter(Position = 19, Mandatory = $false)] [string] $Notes, [Parameter(Position = 20, Mandatory = $false)] [string] $Photo, [Parameter(Position = 21, Mandatory = $false)] [string] $FileAs, [Parameter(Position = 22, Mandatory = $false)] [string] $WebSite, [Parameter(Position = 23, Mandatory = $false)] [string] $Title, [Parameter(Position = 24, Mandatory = $false)] [string] $Folder, [Parameter(Position = 25, Mandatory = $false)] [string] $EmailAddressDisplayAs, [Parameter(Position = 26, Mandatory = $false)] [switch] $useImpersonation, [Parameter(Position = 27, Mandatory = $False)] [switch] $ModernAuth, [Parameter(Position = 28, Mandatory = $False)] [String] $ClientId, [Parameter(Position = 29, Mandatory = $False)] [String] $RedirectUri= "urn:ietf:wg:oauth:2.0:oob", [Parameter(Position = 30, Mandatory = $False)] [String] $CertificateFilePath, [Parameter(Position = 31, Mandatory = $False)] [Security.SecureString] $CertificatePassword ) Begin { #Connect $service = Connect-EXCExchange -MailboxName $MailboxName -Credential $Credentials -ModernAuth:$ModernAuth.IsPresent -ClientId $ClientId -RedirectUri $RedirectUri -CertificateFilePath $CertificateFilePath -CertificatePassword $CertificatePassword if ($useImpersonation.IsPresent) { $service.ImpersonatedUserId = new-object Microsoft.Exchange.WebServices.Data.ImpersonatedUserId([Microsoft.Exchange.WebServices.Data.ConnectingIdType]::SmtpAddress, $MailboxName) } $folderid = new-object Microsoft.Exchange.WebServices.Data.FolderId([Microsoft.Exchange.WebServices.Data.WellKnownFolderName]::Contacts, $MailboxName) if ($Folder) { $Contacts = Get-EXCContactFolder -Service $service -FolderPath $Folder -SmptAddress $MailboxName } else { $Contacts = [Microsoft.Exchange.WebServices.Data.Folder]::Bind($service, $folderid) } if ($service.URL) { $type = ("System.Collections.Generic.List" + '`' + "1") -as "Type" $type = $type.MakeGenericType("Microsoft.Exchange.WebServices.Data.FolderId" -as "Type") $ParentFolderIds = [Activator]::CreateInstance($type) $ParentFolderIds.Add($Contacts.Id) $Error.Clear(); $cnpsPropset = new-object Microsoft.Exchange.WebServices.Data.PropertySet([Microsoft.Exchange.WebServices.Data.BasePropertySet]::FirstClassProperties) $ncCol = $service.ResolveName($EmailAddress, $ParentFolderIds, [Microsoft.Exchange.WebServices.Data.ResolveNameSearchLocation]::DirectoryThenContacts, $true, $cnpsPropset); $createContactOkay = $false if ($Error.Count -eq 0) { if ($ncCol.Count -eq 0) { $createContactOkay = $true; } else { foreach ($Result in $ncCol) { if ($Result.Contact -eq $null) { Write-host "Contact already exists $($Result.Mailbox.Name)" throw "Contact already exists" } else { if ((Test-EmailAddress -EmailAddress $EmailAddress)) { if ($Result.Mailbox.MailboxType -eq [Microsoft.Exchange.WebServices.Data.MailboxType]::Mailbox) { $UserDn = Get-UserDN -service $service -EmailAddress $Result.Mailbox.Address $cnpsPropset = new-object Microsoft.Exchange.WebServices.Data.PropertySet([Microsoft.Exchange.WebServices.Data.BasePropertySet]::FirstClassProperties) $ncCola = $service.ResolveName($UserDn, $ParentFolderIds, [Microsoft.Exchange.WebServices.Data.ResolveNameSearchLocation]::ContactsOnly, $true, $cnpsPropset); if ($ncCola.Count -eq 0) { $createContactOkay = $true; } else { Write-Host -ForegroundColor Red -Object "Number of existing Contacts Found $($ncCola.Count)" foreach ($Result in $ncCola) { Write-Host -ForegroundColor Red -Object $Result.Mailbox.Name } throw "Contact already exists" } } } else { Write-Host -ForegroundColor Yellow "Email Address is not valid for GAL match" } } } } if ($createContactOkay) { $Contact = New-Object Microsoft.Exchange.WebServices.Data.Contact -ArgumentList $service #Set the GivenName $Contact.GivenName = $FirstName #Set the LastName $Contact.Surname = $LastName #Set Subject $Contact.Subject = $DisplayName $Contact.FileAs = $DisplayName if ($Title -ne "") { $PR_DISPLAY_NAME_PREFIX_W = New-Object Microsoft.Exchange.WebServices.Data.ExtendedPropertyDefinition(0x3A45, [Microsoft.Exchange.WebServices.Data.MapiPropertyType]::String); $Contact.SetExtendedProperty($PR_DISPLAY_NAME_PREFIX_W, $Title) } $Contact.CompanyName = $CompanyName $Contact.DisplayName = $DisplayName $Contact.Department = $Department $Contact.OfficeLocation = $Office $Contact.CompanyName = $CompanyName $Contact.PhoneNumbers[[Microsoft.Exchange.WebServices.Data.PhoneNumberKey]::BusinessPhone] = $BusinssPhone $Contact.PhoneNumbers[[Microsoft.Exchange.WebServices.Data.PhoneNumberKey]::MobilePhone] = $MobilePhone $Contact.PhoneNumbers[[Microsoft.Exchange.WebServices.Data.PhoneNumberKey]::HomePhone] = $HomePhone $Contact.PhysicalAddresses[[Microsoft.Exchange.WebServices.Data.PhysicalAddressKey]::Business] = New-Object Microsoft.Exchange.WebServices.Data.PhysicalAddressEntry $Contact.PhysicalAddresses[[Microsoft.Exchange.WebServices.Data.PhysicalAddressKey]::Business].Street = $Street $Contact.PhysicalAddresses[[Microsoft.Exchange.WebServices.Data.PhysicalAddressKey]::Business].State = $State $Contact.PhysicalAddresses[[Microsoft.Exchange.WebServices.Data.PhysicalAddressKey]::Business].City = $City $Contact.PhysicalAddresses[[Microsoft.Exchange.WebServices.Data.PhysicalAddressKey]::Business].CountryOrRegion = $Country $Contact.PhysicalAddresses[[Microsoft.Exchange.WebServices.Data.PhysicalAddressKey]::Business].PostalCode = $PostalCode $Contact.EmailAddresses[[Microsoft.Exchange.WebServices.Data.EmailAddressKey]::EmailAddress1] = $EmailAddress if ([string]::IsNullOrEmpty($EmailAddressDisplayAs) -eq $false) { $Contact.EmailAddresses[[Microsoft.Exchange.WebServices.Data.EmailAddressKey]::EmailAddress1].Name = $EmailAddressDisplayAs } $Contact.ImAddresses[[Microsoft.Exchange.WebServices.Data.ImAddressKey]::ImAddress1] = $IMAddress $Contact.FileAs = $FileAs $Contact.BusinessHomePage = $WebSite #Set any Notes $Contact.Body = $Notes $Contact.JobTitle = $JobTitle if ($Photo) { $fileAttach = $Contact.Attachments.AddFileAttachment($Photo) $fileAttach.IsContactPhoto = $true } $Contact.Save($Contacts.Id) Write-Host "Contact Created" } } } } } function New-EXCBatchContact { <# .SYNOPSIS Creates a Contact to be used in a Batch request Exchange Web Services API .DESCRIPTION Creates a Contact to be used in a Batch request Exchange Web Services API Requires the EWS Managed API from https://www.microsoft.com/en-us/download/details.aspx?id=42951 .PARAMETER FirstName A description of the FirstName parameter. .PARAMETER LastName A description of the LastName parameter. .PARAMETER EmailAddress A description of the EmailAddress parameter. .PARAMETER CompanyName A description of the CompanyName parameter. .PARAMETER Credentials A description of the Credentials parameter. .PARAMETER Department A description of the Department parameter. .PARAMETER Office A description of the Office parameter. .PARAMETER BusinssPhone A description of the BusinssPhone parameter. .PARAMETER MobilePhone A description of the MobilePhone parameter. .PARAMETER HomePhone A description of the HomePhone parameter. .PARAMETER IMAddress A description of the IMAddress parameter. .PARAMETER Street A description of the Street parameter. .PARAMETER City A description of the City parameter. .PARAMETER State A description of the State parameter. .PARAMETER PostalCode A description of the PostalCode parameter. .PARAMETER Country A description of the Country parameter. .PARAMETER JobTitle A description of the JobTitle parameter. .PARAMETER Notes A description of the Notes parameter. .PARAMETER Photo A description of the Photo parameter. .PARAMETER FileAs A description of the FileAs parameter. .PARAMETER WebSite A description of the WebSite parameter. .PARAMETER Title A description of the Title parameter. .PARAMETER Folder A description of the Folder parameter. .PARAMETER EmailAddressDisplayAs A description of the EmailAddressDisplayAs parameter. .PARAMETER useImpersonation A description of the useImpersonation parameter. #> [CmdletBinding()] param ( [Parameter(Position = 1, Mandatory = $true)] [Microsoft.Exchange.WebServices.Data.ExchangeService] $service, [Parameter(Position = 2, Mandatory = $true)] [string] $FirstName, [Parameter(Position = 3, Mandatory = $true)] [string] $LastName, [Parameter(Position = 4, Mandatory = $true)] [string] $EmailAddress, [Parameter(Position = 5, Mandatory = $false)] [string] $CompanyName, [Parameter(Position = 6, Mandatory = $false)] [System.Management.Automation.PSCredential] $Credentials, [Parameter(Position = 7, Mandatory = $false)] [string] $Department, [Parameter(Position = 8, Mandatory = $false)] [string] $Office, [Parameter(Position = 9, Mandatory = $false)] [string] $BusinssPhone, [Parameter(Position = 10, Mandatory = $false)] [string] $MobilePhone, [Parameter(Position = 11, Mandatory = $false)] [string] $HomePhone, [Parameter(Position = 12, Mandatory = $false)] [string] $IMAddress, [Parameter(Position = 13, Mandatory = $false)] [string] $Street, [Parameter(Position = 14, Mandatory = $false)] [string] $City, [Parameter(Position = 15, Mandatory = $false)] [string] $State, [Parameter(Position = 16, Mandatory = $false)] [string] $PostalCode, [Parameter(Position = 17, Mandatory = $false)] [string] $Country, [Parameter(Position = 18, Mandatory = $false)] [string] $JobTitle, [Parameter(Position = 19, Mandatory = $false)] [string] $Notes, [Parameter(Position = 20, Mandatory = $false)] [string] $Photo, [Parameter(Position = 21, Mandatory = $false)] [string] $FileAs, [Parameter(Position = 22, Mandatory = $false)] [string] $WebSite, [Parameter(Position = 23, Mandatory = $false)] [string] $Title, [Parameter(Position = 24, Mandatory = $false)] [string] $EmailAddressDisplayAs ) Begin { $Contact = New-Object Microsoft.Exchange.WebServices.Data.Contact -ArgumentList $service #Set the GivenName $Contact.GivenName = $FirstName #Set the LastName $Contact.Surname = $LastName #Set Subject $Contact.Subject = $DisplayName $Contact.FileAs = $DisplayName if ($Title -ne "") { $PR_DISPLAY_NAME_PREFIX_W = New-Object Microsoft.Exchange.WebServices.Data.ExtendedPropertyDefinition(0x3A45, [Microsoft.Exchange.WebServices.Data.MapiPropertyType]::String); $Contact.SetExtendedProperty($PR_DISPLAY_NAME_PREFIX_W, $Title) } $Contact.CompanyName = $CompanyName $Contact.DisplayName = $DisplayName $Contact.Department = $Department $Contact.OfficeLocation = $Office $Contact.CompanyName = $CompanyName $Contact.PhoneNumbers[[Microsoft.Exchange.WebServices.Data.PhoneNumberKey]::BusinessPhone] = $BusinssPhone $Contact.PhoneNumbers[[Microsoft.Exchange.WebServices.Data.PhoneNumberKey]::MobilePhone] = $MobilePhone $Contact.PhoneNumbers[[Microsoft.Exchange.WebServices.Data.PhoneNumberKey]::HomePhone] = $HomePhone $Contact.PhysicalAddresses[[Microsoft.Exchange.WebServices.Data.PhysicalAddressKey]::Business] = New-Object Microsoft.Exchange.WebServices.Data.PhysicalAddressEntry $Contact.PhysicalAddresses[[Microsoft.Exchange.WebServices.Data.PhysicalAddressKey]::Business].Street = $Street $Contact.PhysicalAddresses[[Microsoft.Exchange.WebServices.Data.PhysicalAddressKey]::Business].State = $State $Contact.PhysicalAddresses[[Microsoft.Exchange.WebServices.Data.PhysicalAddressKey]::Business].City = $City $Contact.PhysicalAddresses[[Microsoft.Exchange.WebServices.Data.PhysicalAddressKey]::Business].CountryOrRegion = $Country $Contact.PhysicalAddresses[[Microsoft.Exchange.WebServices.Data.PhysicalAddressKey]::Business].PostalCode = $PostalCode $Contact.EmailAddresses[[Microsoft.Exchange.WebServices.Data.EmailAddressKey]::EmailAddress1] = $EmailAddress if ([string]::IsNullOrEmpty($EmailAddressDisplayAs) -eq $false) { $Contact.EmailAddresses[[Microsoft.Exchange.WebServices.Data.EmailAddressKey]::EmailAddress1].Name = $EmailAddressDisplayAs } $Contact.ImAddresses[[Microsoft.Exchange.WebServices.Data.ImAddressKey]::ImAddress1] = $IMAddress $Contact.FileAs = $FileAs $Contact.BusinessHomePage = $WebSite #Set any Notes $Contact.Body = $Notes $Contact.JobTitle = $JobTitle if ($Photo) { $fileAttach = $Contact.Attachments.AddFileAttachment($Photo) $fileAttach.IsContactPhoto = $true } return $Contact } } |