Mass enabling Enterprise wide options in Lync can be laborious using the Control Panel, bulk changes can be best achieved using the Lync Management Shell. The Management Shell is a PowerShell session with the Lync Modules Imported at Runtime.
This is the second post in this Series detailing some tooling to help bulk enable an organisations Lync Users.
Lets Start by Importing the Lync Module in the local session and building an Implicit Remote Session to a Domain Controller.
Import-Module Lync $domaincreds = Get-Credential -Message "Please provide AD Creds" $adsession = $false $remoteSessionList = Get-PSSession -ComputerName $domaincontroller -Credential $domaincreds Foreach($remoteSession in $remoteSessionList) { If($remoteSession.Name -eq 'ActiveDirectory'){ $adsession = $true break } } If ($adsession -eq $false){ $dcSession = New-PSsession -Computername $domaincontroller -Name ActiveDirectory -Credential $domaincreds # Use the newly created remote Powershell session to send a command to that session Invoke-Command -Command {Import-Module ActiveDirectory} -Session $dcSession # Use that session with the modules to add the available # commandlets to your existing Powershell command shell with a # new command name prefix. Import-PSSession -Session $dcSession -Module ActiveDirectory -Prefix RM -AllowClobber }
We then query Lync for all Lync users where the LineURI is blank.
$CsUserNoLineURI = Get-CsUser -Filter {LineURI -eq $null}
For each of these users we get the e.164 formatted number stored in the otherTelephone attribute if it exists and set it for the Lync User after stipping out spaces and appending "tel:".
Foreach ($csuser in $CsUserNoLineURI) { $newLineURI, $tempuser, $updatemsg, $errormsg = $null $tempuser = Get-RMADUser -Identity $csuser.SamAccountName -Properties otherTelephone If ($tempuser.PSobject.Properties.name -match "otherTelephone" -and $tempuser.otherTelephone[0]){ $newLineURI = "tel:"+$tempuser.otherTelephone[0] -replace " ", "" Try { Set-CsUser -Identity $csuser.Identity -LineURI $newLineURI -ErrorAction Stop #Successfully set LineURI to AD DDI $updatemsg = [pscustomobject]@{"Name" = $csuser.DisplayName; "New LineURI" = $newLineURI} $LineURIUpdates += $updatemsg } Catch { #Error setting DDI to LineURI $errormsg = [pscustomobject]@{"Name" = $CsUser.DisplayName; "Error" = $_.Exception.message} $LineURIErrors += $errormsg } } }
We have also added some logging into the above ForEach loop. Each time we either change something or generate an error (Using the Try Catch) we create a PSCustomObject and add it into the $LineURIErrors or $LineURIUpdates custom table to display later
Now we have our Custom tables lets send them to someone formatted in an HTML Email
if($LineURIUpdates.Count -gt 0) { $LineURIbody = $LineURIUpdates |
ConvertTo-Html -Head $style -PreContent "Updated $($LineURIUpdates.Count) User LineURI fields " } else { $LineURIbody = "No LineURI updates were applied this time" } Send-MailMessage -SmtpServer $smtpserver-From $from -to $to -Subject "Lync LineURI Updates" -BodyAsHtml -Body "$LineURIbody" If($LineURIErrors.Count -gt 0){ $LineURLIErrorsBody = $LineURIErrors |
ConvertTo-Html -Head $style -PreContent "$($LineURIErrors.count) LineURI update errors detected " } else { $LineURLIErrorsBody = "No LineURI update errors occured this time" } Send-MailMessage -SmtpServer $smtpserver -From $from -to $to -Subject "Lync LineURI Errors" -BodyAsHtml -Body "$LineURLIErrorsBody"
And finally clean up our AD Session we created at the beginning
Remove-PSSession -Name ActiveDirectory
Finally lets put it all together as a re-usable function with CmdLet binding.
function Update-LineURI { [CmdletBinding()] Param ( # Domain Controller to use [Parameter(Position=0,Mandatory=$true)][string]$domaincontroller,
[Parameter(Position=1,Mandatory=$true)][string]$smtpserver,
[Parameter(Position=2,Mandatory=$true)][string]$from,
[Parameter(Position=3,Mandatory=$true)][string]$to ) Begin { Import-Module Lync $domaincreds = Get-Credential -Message "Please provide AD Creds" $adsession = $false $remoteSessionList = Get-PSSession -ComputerName $domaincontroller -Credential $domaincreds Foreach($remoteSession in $remoteSessionList) { If($remoteSession.Name -eq 'ActiveDirectory'){ $adsession = $true break } } If($adsession -eq $false){ $dcSession = New-PSsession -Computername $domaincontroller -Name ActiveDirectory -Credential $domaincreds # Use the newly created remote Powershell session to send a #command to that session Invoke-Command -Command {Import-Module ActiveDirectory} -Session $dcSession # Use that session with the modules to add the available # commandlets to your existing Powershell command shell with a #new command name prefix. Import-PSSession -Session $dcSession -Module ActiveDirectory -Prefix RM -AllowClobber } $scriptpath = Split-path $script:MyInvocation.MyCommand.Path $style = Get-COntent "$scriptpath\htmlstyle.txt" $LineURIUpdates=@() $LineURIErrors=@() } Process { $CsUserNoLineURI = Get-CsUser -Filter {LineURI -eq $null} Foreach ($csuser in $CsUserNoLineURI) { $newLineURI, $tempuser, $updatemsg, $errormsg = $null $tempuser = Get-RMADUser -Identity $csuser.SamAccountName -Properties otherTelephone If ($tempuser.PSobject.Properties.name -match "otherTelephone" -and $tempuser.otherTelephone[0]){ $newLineURI = "tel:"+$tempuser.otherTelephone[0] -replace " ", "" Try { Set-CsUser -Identity $csuser.Identity -LineURI $newLineURI -ErrorAction Stop #Successfully set LineURI to AD DDI $updatemsg = [pscustomobject]@{"Name" = $csuser.DisplayName; "New LineURI" = $newLineURI} $LineURIUpdates += $updatemsg } Catch { #Error setting DDI to LineURI $errormsg = [pscustomobject]@{"Name" = $CsUser.DisplayName; "Error" = $_.Exception.message} $LineURIErrors += $errormsg } } } if($LineURIUpdates.Count -gt 0) { $LineURIbody = $LineURIUpdates | ConvertTo-Html -Head $style -PreContent "Updated $($LineURIUpdates.Count) User LineURI fields " } else { $LineURIbody = "No LineURI updates were applied this time" } Send-MailMessage -SmtpServer $smtpserver -From $from -to $to -Subject "Lync LineURI Updates" -BodyAsHtml -Body "$LineURIbody" If($LineURIErrors.Count -gt 0){ $LineURLIErrorsBody = $LineURIErrors | ConvertTo-Html -Head $style -PreContent "$($LineURIErrors.count) LineURI update errors detected " } else { $LineURLIErrorsBody = "No LineURI update errors occured this time" } Send-MailMessage -SmtpServer $smtpserver -From $from -to $to -Subject "Lync LineURI Errors" -BodyAsHtml -Body "$LineURLIErrorsBody" } End { Remove-PSSession -Name ActiveDirectory } }
That completes this blog on updating Lync LineURI's to the Telephone Number in Active Directory. More posts in this series will follow shortly here.
No comments:
Post a Comment