Pages

Showing posts with label Lync Powershell Script. Show all posts
Showing posts with label Lync Powershell Script. Show all posts

Monday, June 6, 2016

PowerShell Script to Add Normalization Rule to Multiple Dial Plans


During some recent Lync and SfB deployments, there has been a need to add a normalization rule to all existing dial plans or only user dial plans. Of course, the easiest way to add the same normalization rule to multiple dial plans is to script it. So here is the info for the script as well as the script itself:


First create the normalization rule in one of the dial plans. For example, you can create a "Catch All" rule in the Global dial plan that will normalize any number to prepend it with a +. The rule will look like this:

Normalization rule name: Catch All
Pattern to match: ^(\d*)$
Translation pattern: +$1

So the idea is to copy the normalization rule that you just created in the Global dial plan to all the User dial plans that already exist (I will explain later how to copy to All dial plans including Site dial plans later in this post). What the script is doing is getting all dial plans that begin with Tag:. This is how User dial plans are identified. Then it will get the normalization rule settings and copy them into all the User dial plans. Here is the script:

$DialPlans=Get-CSDialplan -Filter Tag:*
$CatchAll=Get-CsVoiceNormalizationRule -Filter "Global/Catch All"

foreach ($D in $DialPlans) 
{
Write-Host ("Adding Catch All Normalization Rules to Dial Plan: " + $D.Identity)    
ForEach ($Rule in $CatchAll) {New-CsVoiceNormalizationRule -Parent $D.Identity -Name $Rule.Name -Description $Rule.Description -Pattern $Rule.Pattern -Translation $Rule.Translation -IsInternalExtension $Rule.IsInternalExtension | Out-Null} 
}

If you didn't create the rule in the Global dial plan but in a User dial plan, you would change the -Filter parameter in the second line of the script to be the name of the dial plan/normalization rule name. If you are not sure how to find that out, run the Get-CsDialplan cmdlet and get the name of the dial plan. For example, a User dial plan will look like this: Tag:NA-HoustonDP. User dial plans start with Tag: while site dial plans start with Site:. Then put a forward slash and the name of the normalization rule in that dial plan. Make sure to put quotes around the whole dialplan/normalizationrule name if you have spaces in the names.

So by default, this script will add this "Catch All" normalization rule to the User dial plans and it will be the last normalization rule in the list of normalization rules. The order can be changed by setting the -Priority parameter. Be careful with this though because if you have a lot of global dial plans, you will need to make sure that it doesn't take precedence over some of the normalization rules it shouldn't. Otherwise, you will have to go into each dial plan and move the rule to the appropriate order.

Also, you can narrow the dial plan selection down to just site dial plans by changing the -Filter parameter on the first line of the script from Tag:* to Site:*. This will choose just the site dial plans to add the number normalization rule. And if you want to add the normalization rule to all dial plans, just remove the -Filter parameter all together.

Hope this helps. Let me know if you have any other questions, comments or issues.

Thursday, March 28, 2013

Lync PowerShell Script to Mass Enable Users

* Updated 1/22/15 - I added the option to add dial plan and voice policy as well to the script
* Updated 6/20/13 - I forgot to add the dash in set-csuser on the bottom script so the enable-csuser cmdlet would fail.

Of course there is always a need to mass enable users for Lync once you have Lync deployed in your environment. The easiest way to mass enable users for Lync is via a PowerShell script and a CSV file with the user information. 

To enable PC-to-PC users only
Here is a script I created to mass enable users:

if ($args[0] -eq $null)
    {
    $userNameFile = read-host "Enter the full path of the .csv file with the user information."
    $userNameFile  = $usernamefile -replace '"',""} 
else 
    {$usernamefile = $args[0]}
if ($userNameFile -ne "") 
    {$csv=import-csv $userNameFile} 
else 
    {"Could not find a valid .csv with the user information."
    exit}
foreach($c in $csv)
# enable for lync
{
"Enabling " + $c.Identity + " for Lync 2010"
Enable-csuser -identity $c.Identity -registrarpool $c.RegistrarPool –sipaddresstype $c.SipAddressType -sipdomain $c.SipDomain
}

This script will enable the users with basic PC-to-PC configuration. This script allows for organizations with multiple SIP domains and multiple pools with the columns in the .csv file for RegistrarPool and SipDomain. The .csv file will look like this:
Identity RegistrarPool SipAddressType SipDomain
John Doe PoolFQDN.Domain.com EmailAddress SIPDomain.com


To enable Enterprise Voice users
To enable the users for Enterprise Voice, we will make the following addition (highlighted in yellow and green) to the above script. The green highlighted section is optional if you have extensions set up in your LineURI’s like tel+12815551234;ext=1234. You can omit this section and remove the Extensions column from the .csv file if you are not using extensions in your LineURI’s:

if ($args[0] -eq $null)
    {
    $userNameFile = read-host "Enter the full path of the .csv file with the user information."
    $userNameFile  = $usernamefile -replace '"',""} 
else 
    {$usernamefile = $args[0]}
if ($userNameFile -ne "") 
    {$csv=import-csv $userNameFile} 
else 
    {"Could not find a valid .csv with the user information."
    exit}
foreach($c in $csv)
# enable for lync
{
"Enabling " + $c.Identity + " for Lync"
$lineuri = "tel:+1" + $c.PhoneNumber + ";ext=" + $c.Extension
Enable-csuser -identity $c.Identity -registrarpool $c.RegistrarPool -sipaddresstype $c.SipAddressType -sipdomain $c.SipDomain 

# Pause for 30 seconds for AD Replication
write-host -foregroundcolor Green "Pausing for 30 seconds for AD Replication"

Start-Sleep -s 30

Set-CsUser -Identity $c.Identity -enterprisevoiceenabled $True -lineuri $lineuri
Grant-CsDialPlan -Identity $c.Identity -PolicyName $c.DialPlan
Grant-CsVoicePolicy -Identity $c.Identity -PolicyName $c.VoicePolicy
}

As you can see, the script turns the 10 digit phone number into E.164 format and adds the extension (if needed) and then sets it as the LineURI for the user. The .csv file will have the following columns added for this script:


PhoneNumber Extension DialPlan VoicePolicy
2815551234 1234 HoustonDialPlanHoustonVoicePolicy




PowerShell Script to Create a User, Mailbox Enable the Account, and Enable the Account for Lync

I have created a handy script that will create a user account, mailbox enable the account, enable the account for Lync, enable the Lync account for Enterprise Voice, and finally UM enable the account from a local computer without having to log onto the Exchange or Lync servers. This script basically creates the user account creating the Display Name as FirstName Last Name, UPN as FirstInitialLastName@InternalDomain, Alias as FirstInitial.LastName, SIP URI as the same as the e-mail address, and sets the LineURI in the format of tel:+13335551234;ext=1234.

This script is pieced together from other scripts I had so it may not be the most efficient. I will do some more testing and update the script once I get it optimized as well as creating one that will allow you to use a .csv file to mass enable users.

# Static Entries
$ExchangeServer = "ExchangeServer.domain.com"
$LyncServer = "LyncServer.domain.com"
$Registrar = "LyncServer.domain.com"
$dialplan = "Registrar:LyncServer.domain.com"
$intdomain = "domain.com"
$sipdomain = "SIPDomain.com"
$company = "Company Name"
$mbdb = "Mailbox Database Name"
$umpolicy = "Unified Messaging Policy Name"

# Import session information
$user = Get-Credential
$ExchSession = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionURI http://$ExchangeServer/powershell -Credential $user
Import-PSSession $ExchSession
$LyncSession = New-PSSession -ConnectionURI https://$LyncServer/ocspowershell -Credential $user
Import-PSSession $LyncSession

# Data Entry section
$fname = Read-Host "First Name"
$finit = Read-Host "First Initial"
$lname = Read-Host "Last Name"
$password = Read-Host "Password"
$ou = Read-Host "AD OU account will be created in. In the format of OU=OUname,DC=Domain,DC=com"
$desc = Read-Host "Description"
$dept = Read-Host "Department"
$title = Read-Host "Title"
$manager = Read-Host "Manager"
$phone = Read-Host "Phone Number"
$ext = Read-Host "4 Digit Extension"

# Create user and enable mailbox
"Creating and enabling " + $fname + " " + $lname + " for AD and Exchange 2010"
$pwd = convertto-securestring $password -asplaintext -force
$name = $fname + " " + $lname
$upn = $finit + $lname + "@" + $intdomain
$alias = $finit + "." + $lname
$sam = $finit + $lname
New-Mailbox -name $name -userprincipalname $upn -Alias $alias -OrganizationalUnit $ou -SamAccountName $sam -FirstName $fname -Initials '' -LastName $lname -Password $pwd -ResetPasswordOnNextLogon $true -Database $mbdb 

# Pause for 30 seconds for AD 
write-host "Pausing for 30 seconds for AD Changes"
Start-Sleep -s 30 

# Set user properties
"Configuring AD settings for " + $fname + " " + $lname
Get-Mailbox -identity $name | Set-User -Company $company -Department $dept -Title $title -Manager $manager -Phone $phone 

# Pause 10 for AD changes
write-host "Pausing 10 Seconds for AD Changes"
Start-Sleep -s 10


# Enable for lync and configure settings
"Enabling " + $fname + " " + $lname + " for Lync 2010"
$lineuri = "tel:+1" + $phone + ";ext=" + $ext
Get-mailbox -identity $name | Enable-csuser -registrarpool $Registrar -sipaddresstype EmailAddress -sipdomain $sipdomain -enterprisevoiceenabled $True -lineuri $lineuri

# Pause 10 for Lync changes
write-host "Pausing 10 Seconds for Lync Changes"
Start-Sleep -s 10

# Enable For Unified Messaging
"Configuring " + $fname + " " + $lname + " for Unified Messaging"
$sipuri = $fname + "." + $lname + "@" + $sipdomain
Get-Mailbox -identity $name | Enable-UMMailbox -PinExpired $true -UMMailboxPolicy $umpolicy -Extensions $ext -SIPResourceIdentifier $sipuri

I will walk you thru what this script does...

The first commented area (# Static Entries) will be the entries that will be consistent thru the account creation and configuration process. The $ExchangeServer and $LyncServer variables are the servers that you are going to be connecting to via the PowerShell remote connections. The $intdomain and $sipdomain variables are in case your internal domain is different than your SIP domain.

The second commented area (# Import session information) is where it allows you to run this script from your computer instead of logging into the Exchange or Lync servers.

The third commented area (# Data Entry section) is where you will manually type in the requested information. Be careful with your entries because you will have to go back and manually fix anything that may be misspelled after the script has run.

The fourth commented area (# Create user and enable mailbox) is where it will create the user account and enable the mailbox.

The pauses in the script are to allow ample time for AD to replicate prior to making the additional changes. Depending on how large your AD environment is, you may need to add more time to the pauses to allow for AD replication to occur.

If you have any questions or need the script customized, let me know.

I will update the post later with a script that will use a .csv file to mass enable users and allow you to assign them to different MBX databases, Lync pools, Policies, etc.

Use the script at your own risk. There might be typos in the script so test first before running it in production.



Monday, March 25, 2013

Install Lync 2013 Prerequisites on Windows Server 2012 Using PowerShell

I have used PowerShell from the beginning to install server prerequisites due to the fact that it is quicker than going thru and manually checking the boxes to add Windows Roles and Features and it simplifies the installation process. Here is the PowerShell cmdlet I use that will install all the prereqs. Nothing else will need to be installed after you run this. One thing to make not of is that you will need to have your Windows Server 2012 disk/image mounted. This is needed for the .NET 3.5 feature installation. If you have your DVD drive mapped to a drive other than D: and then alter the drive letter at the end of the script.

Install-WindowsFeature RSAT-ADDS,Web-Server,Web-Static-Content,Web-Default-Doc,Web-Http-Errors,Web-Asp-Net,Web-Net-Ext,Web-ISAPI-Ext,Web-ISAPI-Filter,Web-Http-Logging,Web-Log-Libraries,Web-Request-Monitor,Web-Http-Tracing,Web-Basic-Auth,Web-Windows-Auth,Web-Client-Auth,Web-Filtering,Web-Stat-Compression,Web-Dyn-Compression,NET-WCF-HTTP-Activation45,Web-Asp-Net45,Web-Mgmt-Tools,Web-Scripting-Tools,Web-Mgmt-Compat,NET-Framework-Core,NET-HTTP-Activation,Desktop-Experience,Windows-Identity-Foundation,Telnet-Client,BITS -Source D:\sources\sxs

For those of you wondering, the Telnet Client is not required but helps with troubleshooting in case you need it. An example of this would be testing connectivity to your Edge server. You can do this by opening the command prompt and typing in telnet EdgeServerFQDN 5061. This will verify that you can connect to the Edge server over port 5061.