While investigating why we were being charged by our SIP trunk provider for calls made by Lync synthetic transactions, I discovered ms-skip-rnl. By adding this to the SIP or Line URI Lync will not try and match the number to an internal assigned number (by way of reverse number look up).
This explained why the synthetic transactions where dialing out the SIP trunk only to come back in again. This makes total sense as it is truly testing that an external calling can dial in. Only trouble for us is it was racking up a $100 worth of calls every month!!! So be aware Lync synthetic transactions may incur call costs depending on your SIP trunk provider.
This discovery of mine could also be applied to a LineURI if you wanted to push all calls out to a gateway or phone system. Bare in mind though that the call will never ring on the Lync end point so the gateway or other phone system will need to take care of that.
Matt Ellis has got a pretty good article its use with a Cisco Call Manager - http://mattellis.me/lync-2013-cucm-ms-skip-rnl-sip-uri-dialling/
TopNav
Friday, 20 December 2013
Create Exchange UM Holiday Schedules for Auto Attendants
I have built a script to create UM holidays schedules for Exchange Unified Messaging. Its a pretty manual process gathering all the holidays for a particular year and entering those details in to the script. If your deployment happens to be in New Zealand then I have already done the hard work for you for 2014 :)
I have split the script in to 2 sections - The first section creates the holidays and the second applies the holidays to the specified Auto Attendant.
I have split national holidays and regional holidays so you will need to specify which regional holiday you want to apply in addition to the national holidays:
I have split the script in to 2 sections - The first section creates the holidays and the second applies the holidays to the specified Auto Attendant.
I have split national holidays and regional holidays so you will need to specify which regional holiday you want to apply in addition to the national holidays:
Its pretty crude and I do hope to make it a little more automated in the future.
Any questions let me know.
Create Lync Response Group Holiday Sets
I have built a script to create holiday sets for Lync Response Groups and apply them. Its a pretty manual process gathering all the holidays for a particular year and entering those details in to the script. If your Lync deployment happens to be in New Zealand then I have already done the hard work for you for 2014 :)
Set your Lync pool:
I have split the script in to 2 sections - The first section creates the holidays and the second applies the holidays to a specified response group:
I have split national holidays and regional holidays so you will need to specify which regional holiday you want to apply to a response group in addition to the national holidays:
Its pretty crude and I do hope to make it a little more automated in the future.
Lync Holiday Schedule.ps1
Any questions let me know.
Set your Lync pool:
I have split national holidays and regional holidays so you will need to specify which regional holiday you want to apply to a response group in addition to the national holidays:
Its pretty crude and I do hope to make it a little more automated in the future.
Lync Holiday Schedule.ps1
Any questions let me know.
Lync Sorted: Configure SNOM PA1 for Lync 2010
Lync Sorted: Configure SNOM PA1 for Lync 2010: SNOM PA1 is a really easy to configure device that works out of the box with Lync as a PA system. What you will need:- The UC Edition of ...
Configuring Snom UC Edition for Lync
It is still possible to install the UC edition software on phones that are not officially qualified, the most recent for me being a snom PA1. Obviously there are no guarantees that all functionality will work, but so far I haven't had any issues. The snom PA1 is a PA switch which picks up incoming calls automatically and outputs the audio to the built in 4 Watt amplifier, or to a line out connector if you want to connect it to a building PA system. In my case I have configured it as a Lync endpoint and connected to the speaker system throughout the building. Calling the configured Lync user enables staff make announcements.
The following guide has been generalised to assist with configuring any snom UC device. If you have not already installed UC edition then you will need to visit the Snom website and register, then copy the URL to the download file:
Once you have logged in to the phones web interface discussed below, navigate to "Software Update" - "Manual Software Update", then paste the URL in and select "Load". The phone will reboot and install the UC firmware.
Once you have plugged in and powered up the device, browse to the web management portal.
Finding the phones IP:
- Snom PA1 - The default address is 192.168.0.2/16, otherwise if you have DHCP the device will get an address this way. On the PA1 you can get its IP address by pushing the IP/Reset button and it will read it out.
- Snom 710 - Press and hold the "X" at the welcome screen, then find it under "System Info" - "IP Adr".
e.g. https://192.168.0.2
Snom has a user mode and admin mode. When logged in in user
mode you won’t see any of the advanced options. To access the advance options
select “Setup”-“Advanced”, enter the default admin password “0000” then “Apply”:
There is no username and password out of the box. To set the
admin password and the HTTP web interface password navigate to “Setup”-“Advanced”-“QoS/Security”:
Select “Apply” then log back on using the HTTP server
credentials you just set. Note that in some cases you may need to select "Save" at the top of the settings page.
Account Setup
Click on any identity from the left navigation panel of the snom web interface:
Important settings
Identity active:
ON
Display Name: Name to display on phone where applicable
Account: SIP sign-in address NOT including @sipdomain.com e.g. peter.pan
Password: your lync password
Registrar: SIP domain e.g. neverland.co.nz
Authentication Name: Username e.g. peter.pan@neverland.co.nz or NEVERLAND\Peter.Pan
Display Name: Name to display on phone where applicable
Account: SIP sign-in address NOT including @sipdomain.com e.g. peter.pan
Password: your lync password
Registrar: SIP domain e.g. neverland.co.nz
Authentication Name: Username e.g. peter.pan@neverland.co.nz or NEVERLAND\Peter.Pan
Note: If no Authentication Name is provided, the Account setting is used in place of the Authentication Name
Optional Settings
Outbound Proxy: SIP
server e.g. front end pool or access edge (lyncpool.domain.com/sip.domain.com)
Note: It is also possible to specify the port and transport
layer:
sip.domain.com:5060;transport=tcp (Use TCP/Port 5060)
sip.domain.com:5061;transport=tls (Use TLS/Port 5061)
sip.domain.com:5060;transport=tcp (Use TCP/Port 5060)
sip.domain.com:5061;transport=tls (Use TLS/Port 5061)
Note: Leaving out the Outbound Proxy will result in
automatic DNS lookup for Lync (Auto Device Sign-in)
Ensure that “Server Type Support” is set to OCS/UC:
RTP Encryption should be set on “ON”:
Check that the user account has logged in successfully:
If you have any issues check out the SIP Trace and Log, unlike a lot of products these logs are very useful in finding the problem.
Wednesday, 18 December 2013
Lync Phone Edition Device Updates
This is my understanding of the device update process and how to troubleshoot. This whole process could be a lot smoother in my opinion, I find it a right pain!
Devices use Domain Name System (DNS) to determine the
address of the server that is running the Device Update Web service, which is
hosted on Web Services. For internal communications, the Web Services IP
address must be available in DNS, as must the SRV record for SIP
The device uses DNS to find the SIP domain portion, by
querying the SRV record. The SIP domain is extracted from the resulting fully
qualified domain name (FQDN), and ucupdate S-R2 is prepended. If the device is
internal, :443/requesthandlerInt/ucdevice.upx is appended. If the device is
external, the hardware load balancer should replace the port 443 with port
4443.
While it is not a critical problem if the Device Update Web
service cannot be found by using DNS, the device will log on and then use the
in-band value to locate the service. If the update itself is something critical
to successful logon, this can result in device connectivity failures.
External Devices
If the device is outside the organization’s firewall, and
the user is signed in, the Device Update Web service returns a response
indicating that anonymous access is not supported. The device then sends an
HTTPS update request over port 443 to the Device Update Web service. The Device
Update Web service returns one of the responses listed previously in the
internal case.
In the Configure a Reverse Proxy step, configure the reverse
HTTP proxy to use the Device Update Web service virtual directory https://<web
services external Server FQDN>:443 for the external URL for Web Services and
the Device Update Web service.
DNS Records for
External Devices
SRV
Edge Server: _sip._tls.<sip domain> (External
TLS)
Allows external devices to connect by using SIP over TLS to
the Registrar internally.
A
Reverse proxy FQDN:<server name>.<SIP
domain>
Allows external devices to connect by using TLS over HTTP to
the Device Update Web service.
URL to Updates
/RequestHandlerExt/Files/UCPhone/ is the IIS web path to the
following file share:
To test that update files are available via the web services
URL navigate to the file share and find the update that you want to test. Then
browse to the URL and append the file path on the end.
e.g.
By browsing to such a URL you can confirm that the updates
are available for download. You will be prompted for authentication which
requires a Lync user account.
References:
http://technet.microsoft.com/en-us/library/gg412864(v=ocs.14).aspx
http://technet.microsoft.com/en-us/library/gg398745(v=ocs.14).aspx
http://technet.microsoft.com/en-us/library/gg412864(v=ocs.14).aspx
http://technet.microsoft.com/en-us/library/gg398745(v=ocs.14).aspx
Tuesday, 17 December 2013
Finally a dedicated Lync client for meeting rooms!!
Just back from a demo at Microsoft of the new Crestron Lync meeting room system. I was seriously impressed!! Until now there was no seamless way to deliver Lync conferencing to a meeting room so this is great news.
The software was actually developed by Microsoft with hardware partners Crestron, SMART and Polycom (LifeSize dropped out of the program). I am sure there will be more to come as time goes by.
Check it out here - http://blogs.technet.com/b/lync/archive/2013/02/19/the-lync-room-system-lrs.aspx
Also SMART has a really good video - http://www.youtube.com/watch?v=bbNSlhsDOdY
The software was actually developed by Microsoft with hardware partners Crestron, SMART and Polycom (LifeSize dropped out of the program). I am sure there will be more to come as time goes by.
Check it out here - http://blogs.technet.com/b/lync/archive/2013/02/19/the-lync-room-system-lrs.aspx
Also SMART has a really good video - http://www.youtube.com/watch?v=bbNSlhsDOdY
Tuesday, 19 November 2013
PowerShell Menu Builder Function
I needed a fairly complication menu system in PowerShell so decided to create a function that builds a menu from passed variables. This made the code much easier to read, separating the menu system code from the code that really does stuff.
Download the script here
Download the script here
Thursday, 7 November 2013
Only one of DistributionGroupAddress and AgentsByUri must be set" during Move-CsRgsConfiguration
Somehow a bunch of our RGS Agent Groups had values for both "DistributionGroupAddress" and "AgentsByUri" properties. This was causing the Response Group migration to stop dead in its tracks! Thankfully Russ over on the MS forums had a solution:
http://social.technet.microsoft.com/Forums/lync/en-US/d712b09c-606b-4a1e-abba-146948ba83d9/only-one-of-distributiongroupaddress-and-agentsbyuri-must-be-set-during-movecsrgsconfiguration?forum=lyncdeploy
http://social.technet.microsoft.com/Forums/lync/en-US/d712b09c-606b-4a1e-abba-146948ba83d9/only-one-of-distributiongroupaddress-and-agentsbyuri-must-be-set-during-movecsrgsconfiguration?forum=lyncdeploy
Migrate UM contact objects from Lync 2010 to Lync 2013
There is a very easy way to get this done - one line of PowerShell actually:
Get-CsExUmContact -Filter {RegistrarPool -eq “pool01.domain.com”} | Move-CsExUmContact -Target pool02.domain.comMicrosoft's migration documentation actually misses this step, so hopefully this will save you some time recreating them all on your new Lync 2013 pool. Unfortunately for me I found this after the fact!
Migrate un-assinged numbers from Lync 2010 to Lync 2013
Following the Microsoft documentation for migrating between Lync 2010 and Lync 2013 I noticed there was nothing on how to migrate un-assigned numbers. I did a quick Google search but nothing came up so I wrote a PowerShell script that copies existing un-assigned numbers to a new Lync pool.
I have since found that the Lync 2013 Resource Kit includes a tool that migrates all un-assigned numbers from one pool to another.
While this renders my script nearly useless I thought I would still make it available to everyone. This could be useful for anyone that would prefer not to migrate all, and would rather copy then delete, or maybe modify the script to copy with an improved naming convention etc.
The script also includes a section that creates a new announcement and links it to a new un-assigned number range.
Get the script here.
I have since found that the Lync 2013 Resource Kit includes a tool that migrates all un-assigned numbers from one pool to another.
While this renders my script nearly useless I thought I would still make it available to everyone. This could be useful for anyone that would prefer not to migrate all, and would rather copy then delete, or maybe modify the script to copy with an improved naming convention etc.
The script also includes a section that creates a new announcement and links it to a new un-assigned number range.
Get the script here.
Tuesday, 29 October 2013
Surface RT issues after installing 8.1 preview
After installing the 8.1 preview on my Surface RT I had all sorts of problems!
To name a few:
1. Windows updates would fail to install
2. The Windows Store was unavailable
3. Windows failed to activate
In the end I found out that this was all to do with the inability to activate. To resolve this I ran the following command file - http://sdrv.ms/HpMUaD
This adds a valid key and activates the Surface RT. Make sure you follow the included instructions - extract and run as administrator.
Once activated I still had issues with the Windows Store, so to resolve this I did a PC refresh.
After the refresh I was able to install all available updates, and then from the Windows Store I upgraded to the release version of 8.1 (which I might add improves the Surface 10 fold!!)
Any questions just ask. Good luck!
To name a few:
1. Windows updates would fail to install
2. The Windows Store was unavailable
3. Windows failed to activate
In the end I found out that this was all to do with the inability to activate. To resolve this I ran the following command file - http://sdrv.ms/HpMUaD
This adds a valid key and activates the Surface RT. Make sure you follow the included instructions - extract and run as administrator.
Once activated I still had issues with the Windows Store, so to resolve this I did a PC refresh.
After the refresh I was able to install all available updates, and then from the Windows Store I upgraded to the release version of 8.1 (which I might add improves the Surface 10 fold!!)
Any questions just ask. Good luck!
Thursday, 17 October 2013
CAPITAL SIP: Causes RGS Queue Errors
If you see any of the below errors in your Lync 2010 Front End servers event log, changes are you may have used capitalisation in the "SIP:" notation pre-pended to the SIP address.
e.g. SIP: first.last@lync.com
The Lync control panel will tell you when you forget to add "sip:" but fails to inform you the "SIP:" will cause issue.
EventID: 31012
A valid URI was not specified for the queue time out destination.
EventID: 31161
The Match Making service could not transfer the call because of an error in the queue configuration.
EventID: 31117
The workflow runtime encountered a critical error.
e.g. SIP: first.last@lync.com
The Lync control panel will tell you when you forget to add "sip:" but fails to inform you the "SIP:" will cause issue.
EventID: 31012
A valid URI was not specified for the queue time out destination.
EventID: 31161
The Match Making service could not transfer the call because of an error in the queue configuration.
EventID: 31117
The workflow runtime encountered a critical error.
Monday, 23 September 2013
Barracuda API - Manage a domain using PowerShell
Here's how you can use the Barracuda API and PowerShell to manage domain settings:
If you would like to take this example and set other variables, you can download a configuration backup which will show you all available variables and their current values. This is a good starting point as the variable names often don't match the GUI.
Hope this makes your life that little bit easier :)
$URL = "https://barracudaurl.com/cgi-mod/api.cgi?password=123"
$DomainName = "domain.com"
$auth_sso_ldap_port = "389" # Domain SSO LDAP Port
$auth_sso_ldap_server = "10.1.1.1 10.1.1.2" # Domain SSO LDAP Server
$auth_sso_ldap_uid = "sAMAccountName"
$auth_sso_ldap_username = "barracudaldap@domain.com" # Domain SSO LDAP Username
$auth_type = "LDAP"
$mta_ldap_advanced_email_attr = "mail" # Domain LDAP Email Attribute
$mta_ldap_advanced_filter = '(|(othermailbox=smtp$${recipient_email})(othermailbox=smtp:${recipient_email})(proxyaddresses=smtp$${recipient_email})(proxyaddresses=smtp:${recipient_email})(mail=${recipient_email})(userPrincipalName=${recipient_email}))' # Domain LDAP Filter
$mta_ldap_advanced_host = "10.1.1.1 10.1.1.2" # Domain LDAP Server
$mta_ldap_advanced_password = "LDAPPassword" # Domain LDAP Password
$mta_ldap_advanced_port = "389" # Domain LDAP Server Port
$mta_ldap_advanced_searchbase = '${defaultNamingContext}' # Domain LDAP Search Base
$mta_ldap_advanced_searchbase_blank = "No" # Blank LDAP searchbase
$mta_ldap_advanced_server_type = "Active Directory"
$mta_ldap_advanced_tls_mode = "No" # Domain LDAP SSL/TLS Mode
$mta_ldap_advanced_tls_require = "No" # Domain LDAP SSL/TLS Constraint
$mta_ldap_advanced_unique_attr = "sAMAccountName" # Domain LDAP Unique Attribute
$mta_ldap_advanced_username = "barracudaldap@domain.com" # Domain LDAP Username
$mta_recipient_verify_advanced_exchange = "Yes" # Domain Use LDAP Flag
$mta_recipient_verify_advanced_unify = "Yes" # Domain Account Unification Flag
$mta_relay_advanced_host = "" # Domain Destination Relay Server
$mta_relay_advanced_port = "25" # Domain Destination Relay Server Port
$mta_relay_advanced_use_mx = "No" # Use MX Instead of A Record For Forwarding
$scana_pd_block_level = "5" # Domain Spam Block Score
$scana_pd_pu_preferences = "Yes" # Domain Per-User Preferences
$scana_pd_pu_quarantine = "Yes" # Domain Per-User Quarantine Flag
$scana_pd_quarantine_email = "quarantine@domain.com" # Domain Global Quarantine Email Address
$scana_pd_quarantine_level = "3" # Domain Spam Quarantine Score
$scana_pd_spam_scan = "Yes" # Domain Spam Scan Flag
$scana_pd_spoof_protect = "No" # Domain Spoof Protect Flag
$scana_pd_tag_level = "10" # Per-Domain Spam Tag Score
$scana_pd_virus_scan = "Yes" # Domain Virus Flag
$Xml = "<methodCall>
<methodName>config.set</methodName>
<params>
<param>
<value>
<struct>
<member>
<name>auth_sso_ldap_port</name>
<value>$auth_sso_ldap_port</value>
</member>
<member>
<name>auth_sso_ldap_server</name>
<value>$auth_sso_ldap_server</value>
</member>
<member>
<name>auth_sso_ldap_uid</name>
<value>$auth_sso_ldap_uid</value>
</member>
<member>
<name>auth_sso_ldap_username</name>
<value>$auth_sso_ldap_username</value>
</member>
<member>
<name>auth_type</name>
<value>$auth_type</value>
</member>
<member>
<name>mta_ldap_advanced_email_attr</name>
<value>$mta_ldap_advanced_email_attr</value>
</member>
<member>
<name>mta_ldap_advanced_filter</name>
<value>$mta_ldap_advanced_filter</value>
</member>
<member>
<name>mta_ldap_advanced_host</name>
<value>$mta_ldap_advanced_host</value>
</member>
<member>
<name>mta_ldap_advanced_password</name>
<value>$mta_ldap_advanced_password</value>
</member>
<member>
<name>mta_ldap_advanced_port</name>
<value>$mta_ldap_advanced_port</value>
</member>
<member>
<name>mta_ldap_advanced_searchbase</name>
<value>$mta_ldap_advanced_searchbase</value>
</member>
<member>
<name>mta_ldap_advanced_searchbase_blank</name>
<value>$mta_ldap_advanced_searchbase_blank</value>
</member>
<member>
<name>mta_ldap_advanced_server_type</name>
<value>$mta_ldap_advanced_server_type</value>
</member>
<member>
<name>mta_ldap_advanced_tls_require</name>
<value>$mta_ldap_advanced_tls_require</value>
</member>
<member>
<name>mta_ldap_advanced_tls_mode</name>
<value>$mta_ldap_advanced_tls_mode</value>
</member>
<member>
<name>mta_ldap_advanced_unique_attr</name>
<value>$mta_ldap_advanced_unique_attr</value>
</member>
<member>
<name>mta_ldap_advanced_username</name>
<value>$mta_ldap_advanced_username</value>
</member>
<member>
<name>mta_recipient_verify_advanced_exchange</name>
<value>$mta_recipient_verify_advanced_exchange</value>
</member>
<member>
<name>mta_recipient_verify_advanced_unify</name>
<value>$mta_recipient_verify_advanced_unify</value>
</member>
<member>
<name>mta_relay_advanced_host</name>
<value>$mta_relay_advanced_host</value>
</member>
<member>
<name>mta_relay_advanced_port</name>
<value>$mta_relay_advanced_port</value>
</member>
<member>
<name>mta_relay_advanced_use_mx</name>
<value>$mta_relay_advanced_use_mx</value>
</member>
<member>
<name>scana_pd_block_level</name>
<value>$scana_pd_block_level</value>
</member>
<member>
<name>scana_pd_pu_preferences</name>
<value>$scana_pd_pu_preferences</value>
</member>
<member>
<name>scana_pd_pu_quarantine</name>
<value>$scana_pd_pu_quarantine</value>
</member>
<member>
<name>scana_pd_quarantine_email</name>
<value>$scana_pd_quarantine_email</value>
</member>
<member>
<name>scana_pd_quarantine_level</name>
<value>$scana_pd_quarantine_level</value>
</member>
<member>
<name>scana_pd_spam_scan</name>
<value>$scana_pd_spam_scan</value>
</member>
<member>
<name>scana_pd_spoof_protect</name>
<value>$scana_pd_spoof_protect</value>
</member>
<member>
<name>scana_pd_tag_level</name>
<value>$scana_pd_tag_level</value>
</member>
<member>
<name>scana_pd_virus_scan</name>
<value>$scana_pd_virus_scan</value>
</member>
#Member to affect and member type
<member>
<name>path</name>
<value>
<string><![CDATA[$DomainName]]></string>
</value>
</member>
<member>
<name>type</name>
<value>
<string><![CDATA[domain]]></string>
</value>
</member>
</struct>
</value>
</param>
</params>
</methodCall>"
$http_request = New-Object -ComObject Msxml2.XMLHTTP
$http_request.open('POST', $URL, $false)
$http_request.setRequestHeader("Content-type", "text/xml")
$http_request.setRequestHeader("Content-length", $Xml.length)
$http_request.setRequestHeader("Connection", "close")
$http_request.send($Xml)
$http_request.statusText
$http_request.responseText
If you would like to take this example and set other variables, you can download a configuration backup which will show you all available variables and their current values. This is a good starting point as the variable names often don't match the GUI.
Hope this makes your life that little bit easier :)
Thursday, 19 September 2013
Barracuda API - Creating a new domain using PowerShell
There are very little working examples of how to use the Barracuda API. Here's how you can create a new domain using PowerShell:
I'll be adding an example of how to set the the domain properties next.
$URL = "https://barracudaurl.com/cgi-mod/api.cgi?password=123"
$DomainName = "domain.com"
$Xml = "<methodCall>
<methodName>domain.add</methodName>
<params>
<param>
<value>
<struct>
<member>
<name>domain</name>
<value>
<string><![CDATA[$DomainName]]></string>
</value>
</member>
</struct>
</value>
</param>
</params>
</methodCall>"
$http_request = New-Object -ComObject Msxml2.XMLHTTP
$http_request.open('POST', $URL, $false)
$http_request.setRequestHeader("Content-type", "text/xml")
$http_request.setRequestHeader("Content-length", $Xml.length)
$http_request.setRequestHeader("Connection", "close")
$http_request.send($Xml)
$http_request.statusText
$http_request.responseText
I'll be adding an example of how to set the the domain properties next.
Subscribe to:
Posts (Atom)



























