I am really trying to beef up on my Powershell so I decided to make a script that would make a Lync 2010 Hunt Group. There was a challenge that I had where I was required to make (10) Hunt Groups workflows, queues, and groups. They were to be the same settings, just different users and phone numbers. The thought of going through all the wizards for all the settings just made me want to cry, so I decided to put the big boy pants on and learn how to do this via Powershell. Here goes....
Let's start by identifying what systems we will need to touch.
- Exchange server for creating the users and voicemail Unified Messaging (UM)
- Domain Controller for setting the 'telephone' option in the users account attributes
- Lync server for creating the users, worflow, queues, and groups.
Now that we know the systems, let declare the order of operations.
1st - Exchange to create the user account ONLY. Voicemail will come later.
2nd - Domain Controller - telephone attribute
-> This is necessary as Exchange uses this information to assign the SIP URI in the next step
3rd - Exchange - enable the voicemail (UM)
4th - Lync to finish the script
Since we know the order of operations, let's dive into the script. I found that Powershell is much like PHP in the fact that you are
declare variables in the beginning to use later. One gotcha here is that
you can't call variables that haven't been created yet (hard lesson
learned here - more to come about that). Here are the variables that I used:
$SetNumber = '1'
$SetName = 'Johnny Smith'
$SetAlias = 'jsmith'
$SetUserPrincipalName = 'email@example.com'
$SetSAMAccountName = 'jsmith'
$SetFirstName = 'Johnny'
$SetLastName = 'Smith'
$SetPassword = 'Password'
$SetDBStore = 'DatabaseStore01'
$Telephone = '8005551212'
$SIPResourceID = $SetAlias + '@domain.local'
$SetInboxPermission = $SetAlias + ':\inbox'
This is a good time to go ahead and run the commands. They are a little confusing and overwhelming at first look, but I think if you read the command, you will really see the variables in there and it will make sense:
From the Exchange server:
New-Mailbox -Name $SetName -Alias $SetAlias -OrganizationalUnit 'domain.local/OU/CHILD_OU' -UserPrincipalName $SetUserPrincipalName -SamAccountName $SetSAMAccountName -FirstName $SetFirstName -Initials '' -LastName $SetLastName -ResetPasswordOnNextLogon $false -Database $SetDBStore
From the Domain Controller (NOTE: We have to declare the "$SetAlias" again as we jumped to a new server):
Variable: $SetAlias = 'jsmith'
Command: Set-ADuser -id $SetAlias -officephone $Telephone
From the Exchange Server (don't have to declare the variables as we already have them):
Enable-UMMailbox -Identity $SetName -UMMailboxPolicy "UMDefault Default Policy" -SIPResourceIdentifier $SIPResourceID
***EXTRA BONUS COMMAND***
I like to set the permissions on the user to allow for everyone to be able to view their mailbox. IMO, this just saves headaches in the future of you allowing users specifically. Here are the commands:
set-MailboxFolderPermission -id $SetAlias -user default -AccessRights reviewer
set-MailboxFolderPermission -id $SetInboxPermission -user default -AccessRights reviewer
***END - EXTRA BONUS COMMAND***
From the Lync Server:
(Quick NOTE before we get too far. We have to declare more variables here as we have created the user and now we have to get more information that we could only get AFTER we the previous steps have been created)
$ServiceId = "service:ApplicationServer:server.domain.local"
$GroupName = "Group 1"
$QueueName = "Queue 1"
$WorkFlowName = "Hunt Group 1"
$PrimaryURI = "sip:firstname.lastname@example.org"
$LineURI = "tel:+18005551212"
$DisplayNumber = "+1 (800) 555-1212"
$DistoList = "email@example.com"
$VoiceMail = "sip:firstname.lastname@example.org;opaque=app:voicemail"
1. Create the group:
Command: New-CsRgsAgentGroup -Parent $ServiceId -Name $GroupName -AgentAlertTime 20 -ParticipationPolicy Informal -RoutingMethod Parallel -DistributionGroupAddress $DistoList
2. Create the queue:
Additional Variables: $Group = get-csrgsagentgroup -Name $GroupName
Command: New-CsRgsQueue -Parent $ServiceId -Name $QueueName -TimeoutThreshold 30 -TimeoutAction $ActionTO -AgentGroupIDList($Group.Identity)
3. Create the workflow:
$Queue = Get-CsRgsQueue -Name $QueueName
$ActionTO = New-CsRgsCallAction -Action TransferToVoiceMailUri -uri $VoiceMail
$ActionWM = New-CsRgsCallAction -Action TransferToQueue -QueueID $Queue.Identity
$NBACTION = New-CsRgsCallAction -Action TransferToVoicemailUri -uri $VoiceMail
New-CsRgsWorkflow -Parent $ServiceId -Name $WorkFlowName -Description "Hunt Group 1" -PrimaryUri $PrimaryURI -LineUri $LineURI -DisplayNumber $DisplayNumber -Active $true -Anonymous $true -DefaultAction $ActionWM -NonBusinessHoursAction $NBACTION
Create the user in Lync for the voicemail
Attributes: $Username = "email@example.com"
enable-csuser -identity $UserName -registrarpool lyncserver.domain.local -sipaddresstype Emailaddress -sipdomain domain.local
set-csuser -identity $UserName -enterprisevoiceenabled $true
Grant-CsVoicePolicy -policyname "Voice Policy Name" -Identity $UserName
The script is finished!!!! Now you can go into the Lync control panel and see the changes that you have made. Now the reason for this script, rinse and repeat. Just change the "VARIABLES" to meet your needs. Since this was 1 of 10 users accounts, I just changed it from #1 to #10.