My Whole World Has Changed

Real-Estate-OnlineI had been using Yahoo! Pipes for over 3 years to drive the Lync News/Skype for Business News aggregator. About 2 weeks ago, Yahoo! announced that they were killing off this service in the August/September time frame. This caused me some consternation. Not because I didn’t see it coming – Yahoo! hasn’t updated the thing in about 3 years – but because of the amount of work to get it going again somewhere else.

To take a step back – I started the Lync News aggregator right about the time Lync 2010 was being released. I was a novice OCS 2007 R2 administrator. The company where I worked at put a hold on continuing to deploy OCS due to the imminent release of Lync. This gave me time to read up on Lync and try to get educated before our consultant showed up to help us install it.

The problem was finding good blogs about Lync and then remembering to check them. Not that there were a lot of blogs back then, anyway. But it was still tough to get notified when there was something new to read. Enter Yahoo! Pipes which let me build a complex aggregator that grabbed the RSS feeds of these sites and spit out a new aggregated RSS feed. I could then look at this aggregated feed and be notified about new articles.

At some point I decided it was a good idea to send this feed to Twitter and thus the @LyncNewsTweets account was born (as well as it’s duplicate spawn – @S4BTweets).

And then I wrote an app for Windows Phone. This was initially hand coded. And by hand coded I mean I ripped off sample code from Nokia and heavily edited it.  I even found 3 bugs in their code and was able to fix 2 of them. While I do have a Bachelor’s Degree in Software Engineering, I hadn’t coded in C in about 15 years. Fortunately, Microsoft has released their AppStudio site which now takes all of the programming out of my hands.

Now that there are Universal apps, there is also a version for Windows 8.1.

A buddy pointed me to and so that’s why there is an Android app. Again, no coding on my part makes me happy. That one has had over 10,000 downloads!

And then I created a MailChimp newsletter to summarize the previous days news. And then along came Facebook, Bitly, Delicious, and Tumblr. Google + was working for a while but posting to Google + isn’t exactly easy. (No jokes – I actually use that thing a few times a week).

About 18 months ago I created an Exchange News pipe and started posting that to Twitter. I don’t ever read that one but I thought I’d be nice. That feed ended up in the Windows Phone and Android apps when I renamed them both to UC Now.

A small peak into one of the many pipes.

A small peak into one of the many pipes.

All of this was powered by Yahoo! Pipes. The Lync/S4B pipe had 142 RSS sources. Exchange much less because those people just don’t seem to blog as much (and I’m not bored enough to dig up the blogs I’m missing). And Yahoo! Pipes was going away. What to do?

I did some research for a week or two and there wasn’t anything that could really scale up to what I was doing. Most aggregators were meant to aggregate a handful of feeds and that was about it. They couldn’t filter to make sure that the resultant articles in the feed contained certain words like “Lync” or “Skype”.

I then came across the “WP RSS Aggregator” plugin to WordPress. I installed it on my throwaway site I’m Smarter Than You and gave it a go. It does pretty much everything I needed out of it except for appending the Source into the RSS Feed for each article. So for those of you that have noticed that I no longer give credit to every article in the Title…well that’s why.

So I migrated all of the feeds over to that, throwing out the ones which no longer worked. The number of feeds dropped to 113 from 142. And you know what? The RSS feed is working better than it ever did on Yahoo! Pipes. Pipes was powerful but also extremely unreliable. Well over half half the time it didn’t pull in my own articles! The nerve! Now it’s pulling everything in like it was always designed to do.

Tonight I flipped the Exchange feed to be powered via WordPress too.

I’ve also run around everywhere and updated the feed URL so that all of the places that I blast this stuff out to is now running off the new feeds. That includes updating the apps too. The Android and Windows Phone apps should be notifying you in the next few days about an update.

And during this big rebuild of the feeds, I finally went ahead and moved off of and to its own hosted site. I’ve been wanting to do this for a long time as I’ve always wanted more flexibility than what gives you.

And yesterday I read this article by Andrew Morpeth. He basically did the research for me so this site is also now hosted by MDDHosting. He’s right – the support is fantastic. I’m getting answers in 5 minutes.

So I’ve migrated the whole site from to here. It gave me a great opportunity to refresh the look of the site, if for no other reason than the theme I had been using is no longer available. I like this new theme. It’s similar to what I had but much less drab. It’s much more modern and seems less hacked together. Which is exactly what the old theme was.

So now I have a new feed and a new website host. This is all worth it to me as I still read most of the articles that come through via the feed. I hope you get some of value out of this too. While it’s not hard work (well, now that I don’t have to code the Windows Phone app by hand!) it is fairly time-consuming.Adding or editing a new entry into the Yahoo! Pipe monstrosity was a giant pain. This new system is much easier.

I always appreciate it when I get a random ping from someone asking to get their blog added. And I hope more of those continue to trickle in every few months. It let’s me know some people value my efforts.

And if you know of any good Exchange blogs, please let me know.


BTW – If you’re a Windows/Windows Phone user, can you give the UC Now app a rating and/or review? Thanks!

Emoji URL’s are Cool

funny-emoji-rob-bankWhat’s an emoji URL?

This is one: http://🍺🏈💻🎸.ws

Go Ahead. Click it.

I promise it’s safe.

That’s an emoji URL.

Pretty neat huh?

Last night I accidentally stumbled across this article – You Can Now Visit Norwegian Airlines Using an All-Emoji URL

That’s cool I thought. I wonder how it works.

Which then led me to this article.

Which then led me to creating my own emoji URL. The magic behind all of this is something called “Punycode“. If you don’t want to read the Wikipedia article, it boils down to this: It’s basically a text version of a binary table. As you add and arrange emoji’s (or any character, really) a unique ASCII hash gets created. For the emoji’s in the URL above, the Punycode is:


And here comes the final bit of joy – take some Punycode and register a domain name with it. Any very-modern browser will translate the emoji to Punycode and then do the DNS lookup to see where it is supposed to go. If you click on the emoji URL again –http://🍺🏈💻🎸.ws – you’ll notice that the address bar will quickly change to the Punycode domain name of I then just told my registrar to URL forward back to this blog.

There are a few caveats with emoji URL’s –

Either the .com domain doesn’t support emoji URL’s, or someone bought up all the emoji URL names already. I’ve found a lot of success registering with .ws as the Top Level Domain. So be prepared to use some less well known TLD’s.

Not all emoji’s show up on all devices yet, so hold off on using brand-new emoji’s. For example, I had trouble with the global soccer (association football) emoji but oddly the (American) football emoji showed up everywhere just fine.

Not every registrar plays nicely with emoji URL’s. I stumbled upon and they do an amazing job. Look inside my control panel. They don’t show the domain in Punycode, they show it in emoji instead.

name emoji

Emoji URL’s are supposedly an easier way to type in a URL on a phone than a fully spelled-out domain name. However, on Windows Phone the keyboard brought up by both Internet Explorer and Opera Mini don’t let you enter emoji’s. Depending on your Android keyboard, it is supported and iOS seems to support it as well. (I haven’t tested on all devices if an emoji URL actually works, just that the keyboard in the browser let’s you enter them).

It’s also not supported on older desktop browsers however both IE11 and whatever version of Chrome I have running on Windows seem to work fine.

To make anemoji URL, you first need to find the emoji’s you want to use. I used these two websites to help me out – Emojipedia and Getemoji.

You need one more website to convert your emoji collection to a Punycode. I used Punycoder

Copy the emojis into the left hand side of Punycoder and click “Convert to Punycode” to get the ASCII representation. Once you have a string of emoji’s you want, go register a domain name somewhere.

As mentioned above, I used I have no loyalty to them other than my primary registrar didn’t seem to want to play ball. I tried a few and seemed to work well and charge only $15 for a .ws domain name.

The only major problem I have with an emoji URL is that I don’t think it really saves time in entering a URL. I find I spend way more time looking for the emoji’s than it would take to type in a “regular” URL – including fixing typo’s.

But that’s not the point is it?

My website has an emoji URL and yours doesn’t. So that makes me better than you. Right?

Isn’t that how it works?

Windows 8.1 Apps Won’t Update

80070490For the past year or so, my home Windows 8.1 PC wouldn’t update most of the apps. So as Microsoft has slowly improved the Music app, I’m not getting any of those benefits. Heck, the apps wouldn’t even start.

Every so often I would spend an hour or two trying to fix this, eventually giving up and hoping the inevitable Windows 10 upgrade will fix it. Last night I spent way too much time on this problem. I spent over 4 hours trying to fix it.

I spent the night Googling/Binging and trying everything I could find.

Wsreset didn’t fix it.

SFC /Scannow didn’t fix it but it did send me on a side project to figure out why that was failing. SFCFix with some file fixed that problem. My apps still wouldn’t update.

I smoked the C:WindowsSoftwareDistribution folder a few times.

AppsDiagnostic.diagcab and app.diagcab? Ran those along with WindowsUpdateDiagnostic.diagcab with no fix for the issue.

I tried a bunch of other things so let me skip ahead.No Update Apps

I tried uninstalling the Apps form Windows Store but I couldn’t. It wouldn’t let me click on the apps at all – it just showed them on the list. So I figured I would try to manually uninstall them hoping a re-install would fix them.

That brought me to this article –

While the article says it’s for Windows 10, it worked like a champ on windows 8.1. I had the list up of my failed updates and then pecked around via PowerShell to delete them. Once I got them all uninstalled, I rebooted and went to install them again. While it took a long time, they all started installing and were working fine.

So that problem is (mostly) fixed. There are three apps still in the list that wont update. But that is a huge improvement over what I had.

My theory is that they were in Windows’ list of “installed apps” but they weren’t actually installed. So when Windows tried to install the updates, it failed because there was actually nothing to update.


For the search-ability reasons, here are some of the errors I had and couldn’t resolve using any of the popularly recommended issues:




Event Viewer Event ID 1001

Problem signature: P1: 9600 P2: 788 P3: 115 P4: 1 P5: US P6: en-US P7: 120 P8: -2147023728 P9: Microsoft.BingFoodAndDrink_8wekyb3d8bbwe P10: 0

Fault bucket , type 0 Event Name: WindowsStoreUpdateFailureV2 Response: Not available Cab Id: 0


Calls Not Completing for user with “Non-Western European” characters

This topic has already been covered in Spanish here  and in German hier.

I am just adding an English language version because I recently ran into the same issue and there is no blog in English about it.

If I ever wondered why we buy support from gateway vendors, this issue validated it for me.

We were bringing up a new location with a PRI. Through testing, I was able to make outbound calls but the people in the actual location were unable to complete the calls. This didn’t make sense. How can I make a successful call, sitting thousands of (pick one: miles/kilometers) away, and the people in the actual office could not?

In this case, our gateway was an AudioCodes Mediant 1000 and we were working with an AudioCodes engineer on the implementation. The AudioCodes engineer had given us numerous things to try to no avail. Finally he had us e-mail him some WireShark logs so he could spend more time on the issue.

A day later, he recommended that we set this value in our ini file:

ISO8859CharacterSet = 0

After making this change, the users in the location were suddenly able to make calls.

The issue is that the users in that location all use the following character in their display name as part of the spelling of their office location:


So what does this ISO8859CharacterSet value actually mean? For one, it’s not documented anywhere. I followed up with AudioCodes and they sent me the following documentation.



Basically, this value expands the default character set that AudioCodes uses to parse SIP traffic. Why isn’t it set to zero by default? Who knows. I asked that question to the AudioCodes engineer and he had no answer. I asked if maybe there was a performance impact to this value. He replied that there isn’t one that he knew of. I asked a second AudioCodes engineer and he confirmed that he had never heard of an issue by setting this to 0.

It’s surprising to us that we hadn’t run into this issue before but then our standards are to use the generic ASCII character set in all display names, usernames, etc.

How do you know you might have this issue? I don’t have the AudioCodes syslog files anymore so I swiped the below from the German blog mentioned above.


<132>[S=831454] Error Indication: Last Command (Primitive) was not performed due to cause 100  [Trunk:0 Bchannel:1 ConnID:2] [Code:0x23127]
<133>[S=831455] (   lgr_psbrdex)(833974    )   recv <– UnHandled event:EV_ISDN_ERROR_INDICATION (317)
<133>[S=831456] [SID:766997237] (   lgr_psbrdex)(833975    )   pstn recv <– CALL_RELEASED Trunk:0 Conn:2 RetCause:73 NetCause:255
<132>[S=831457] REPORT_TYPE_ERROR_IN: ErrorCauseString = Incorrect parameter type, DiagnosticString= Condition unknown, ErrorCause = d, Diagnostic =  [Trunk:0 Bchannel:-1 ConnID:-1] [Code:0x23127]
<133>[S=831458] [SID:766997237] (   lgr_psbrdif)(833976    )   pstn send –> PlaceCall: Trunk:0 BChannel:1 ConnID:2 SrcPN=xxx SrcSN= DstPN=151xxxxxxxx DstSN= SrcNT=4 SrcNP=1 SrcPres=0 SrcScrn=0 DstNT=2 DstNP=1 ServiceCap=M RdrctNum= RdNT=0 RdNP=0 RdPres=0 RdScrn=0 RdRsn=-1 Excl=1 Display=Müller, Max IE= UUIE=0, RawData:0 CLIRReason:-1 OrigPN= OLI=-1 OffhookInd=0
<133>[S=831462] [SID:766997237] (   lgr_psbrdif)(833980    )   Abnormal Disconnect cause:255#?reason(255)? Trunk:0 Conn:2


If you see the above that’s a clue. In this case, it was the u-umlaut (ü) in “Müller, Max” causing the issue.

Quick RegEx Trick

AnientRegExI thought I blogged this but I guess I didn’t. So I am posting this mostly to save myself time finding this the next time I look for it.

I had a regular expression that returned 2 variables. Here is what I wanted:


However Lync interprets “$1555” as a variable instead of what I want which is just $1 as the variable. So how do I tell regular expression that it should stop at the first 1 and not continue until the next delimiter ($2)?


Use curly braces

Re-writing it in this format got me the desired result:


The fourth paragraph on this website is what got me the answer –

Script: Query Front Ends for Specific Event Log ID’s

I was troubleshooting today with my main Lync man “JP” (who chooses to remain anonymous). Part of our troubleshooting was checking against 6 (and sometimes 12) front ends to see if a specific Event ID appeared in Event Viewer. This was tedious, going to each server and then a lot of them getting no results.

JP said “there should be a script to do this for us”.

And from that comment this script was born. It’s possible someone has already written this script. We didn’t bother looking since it is a fairly simple script. If someone has written this, then let me know and I will give you credit.

The script – Get-CsEventID – is pretty simple. There are 2 mandatory parameters:

-Pool is the name of your Lync pool which is then sent to Get-CsSite to get the names of each of the servers in your pool

-EventID is the Event ID for which you are looking.

The two optional parameters are:

-LogName By default the script searches in the “Lync Server” log but setting this will let you search against other logs like Application or System

-StartTime If you want to limit your search to the past few hours or days, then set StartTime to the number of hours you want to go back. By default, this is set to 72, so it will search back for the past 3 days.

Here are 2 examples:

.Get-CsEventID -Pool -EventID 12288

This will search for Event ID 12288 across the pool. It will search for the past 72 hours for this entry.

.Get-CsEventID -Pool -EventID 6005 -LogName &quot;System&quot; -StartTime 4

This will search the same pool, but now for EventId 6005 in the System log. It will search back the past 4 hours.

Note that Windows Firewall will need to permit access to remote event logs. You can run the following on a Windows 2012 or later server to enable this.

Get-NetFirewallRule | where DisplayName -like  '* Event Log*' | Enable-NetFirewallRule

Grab the script here.


Skype for Business Notes

I’ll be tracking my notes with installing and working with Skype for Business.

1. I did an in-place upgrade of my existing Lync 20reset-cspoolr13 pool and everything started up and appeared to be working fine. The upgraded pool is named “” which is a bad name for a pool that actually contains Skype4B servers. So I decided to reduce that pool from 3 front ends to 1 which will give me enough space on my VM hosts to build some new, native Skype4B servers. So I removed 2 of the 3 front ends via Topology Builder. Now my pool won’t start. I get the following error when try to do a full reset of the pool:


Fabric version is unknown. No it’s not. It’s what came on the install image! It’s version 3.

Good ol’ Windows Fabric strikes again. I’ve tried rebooting and forcing the reset a few times. Finally I uninstalled Windows Fabric and installed it again from the Skyp4B .iso. Same problem. So this pool is hosed and since this is a lab I don’t want to spend any more time figuring this out.

Update: As I removed roles from Topology for this pool, like conferencing and enterprise voice, I tried to start the service again. It finally started. It is possible that re-running the deployment wizard straightened a few things out. I’m wondering if running Enable-CsComputer separately would have fixed it too.

My takeaway: Don’t do in-place upgrades of production machines. Now this error may not be related to the in-place upgrade process. However, doing a fresh install assures that you can test the pool before moving users. It also gives you the chance to do things like installing the latest OS, building it on newer hardware, installing the latest Windows patches if you’ve fallen behind, etc.

2. Control Panel still can’t sort. This is about unacceptable. Seriously Microsoft? You can get media to traverse NAT’s, firewalls, edge servers, etc but you can’t sort a list? You’d think by the 3rd release of the Lync line of software that they could get some intern to show them what he learned in his first programming class ever: How to sort a list. At work we have admins scattered all over the place, a few dozens pools, and more supported SIP domains than I want to count.. Trying to find the right entry in some of our lists is very difficult and frankly a waste of my time.

Sorting is hard

Sorting is hard. It’s like math but hardererer.

3. When adding your Skype4B server to Topology, be sure to put them in the Skype for Business folder. I know, this should be obvious but I guess habit got the better of me. I added my Skype4B Enterprise settings into the Lync 2013 foled in Topology. To no surprise, I got the following errors in the install logs:

Wrong-folderSo if you get this error, remove the Skype servers you put into the Lync 2013 folder and add them again to the Skype for Business folder. Removing them from Topology might give you an error that a conference directory already exists on the pool you are trying to delete. Delete that by running the Remove-CsConferenceDirectory  with the -force switch and then try the Topology removal again.

4. Not everything is a straight port from Lync 2013 with the “Skype Look”. The certificate wizard was actually simplified and I like it better.


They also updated the “Start Services” text to explain that you really shouldn’t start the services until your pool is ready. It’s a minor fix but I bet it will reduce some of their support calls.


What they should also add in there is when running Start-CsPool that it must be done form a shell opened to “Run as Administrator”

5. There is no way to in-place upgrade an SBS/SBA. While this would have been *really* useful and possibly the only use of in-place upgrades I would have used in production, Microsoft doesn’t support this. My guess is that this is because Microsoft foolishly still makes the SBA vendors provide custom (and wholly redundant) “Install code” which could fail to function in an upgrade scenario. This is yet another reason why the SBA/SBS model is excellent on the drawing board but is full of issues and miss-steps in production.

So much like the upgrades from 2010 to 2013, you have to do full re-installs to get to up to Skype4B. The SBA code hasn’t been released yet because of the reliance on 3rd party vendors to provide their no-value-add install wizards. An SBS does not rely on this pointless vendor integration so you can upgrade those on your own – full uninstall of Lync followed by the Skype4B install off the .iso.

6. That annoying 29820006 patch. You can’t install it. Oh you keep trying. Then you realize it’s the x86 patch. So you download the x64 patch and it still won’t install. So I’m not sure exactly what the magic is, just make sure everything in Windows Update that is mandatory or recommended is installed. I think there is an update to Windows Update that has to be installed before you can install this patch.


Announcing the UC Now apps!

A few years ago I created a Lync “aggregator” which scours 120+ blogs and other related sites for Lync articles and posts what it finds to various places. You can see the output in Twitter, Twitter again, Bitly, Facebook, Google+,  Tumblr, and in various apps I’ve put out over the years. I’ve also added a less-complete aggregator for Exchange which you can see on Twitter.

I’ve unpublished all my previous Windows Phone apps and now have a universal app called UC Now that is the same app on Windows 8.1 and Windows Phone 8.1. Here is the link to the Windows store and here is the link to the Windows Phone store.

For those on Android devices, you can download the Lync News 2013 app which will get you by until I can get that updated to add the Exchange feeds and a bit more in-line (at least content-wise) with the Windows apps.

If you are using an iPhone then you are hosed. But you probably already new that.

Below are some quick screen shots from the Windows 8.1 app.

Main page

Main launch page

Exchange news feed

Exchange news feed

Skype for Business (Lync) news Feed

Skype for Business (Lync) news Feed

Resource links

Resource links

The Windows apps were done using Microsoft App Studio. The Android app was done using AppYet.

If you have any of the older Windows apps installed, please uninstall them as they will never get updated.

Auto Answer on Polycom VVX phones

An admin at one of the sites I help support asked me the other day if there is a way to have a Polycom handset automatically answer a call. I was initially confused as to what he meant. I thought maybe he meant forwarding the call to an AutoAttendant or another extension. (There is a language barrier here too so something may have gotten lost in translation.)

Because seriously: What is the point to have a handset auto answer a call? The person calling the phone will just talk to no one?

Well that is exactly the point. Essentially, this is a “budget” paging function which is what the admin at the remote site wanted to know.

I did some digging and the Polycom VVX phones support this feature natively. I won’t go into the details on how to set this up as you can read this document for the full details. (Skip to page 21)

I have successfully tested this on the VVX 310 and the VVX 500. You call the number assigned to the handset, the phone answers, and any rubbish you say comes out of the speaker on the phone.

If you are interested in a proper paging solution with groups and fancy features using the VVX phones, then check out this article on Anthony Caragol’s Lync/Skype Blog

Deep Dive into the Set-CsPinSendCAWelcomeMail Cmdlet

mr-mrs-atm-pinWe are rolling out a big dial-in conferencing project. As a good percentage of our users are not yet enabled for Enterprise Voice we are doing a lot of discussing and testing about how to get those users their PIN numbers.

Without a LineURI defined, setting a PIN can be a challenge. Check these articles for more detail: LyncBuilder (via Wayback Machine…) or ExpertsExchange We have 2 options that we can think of:

1.) We could rip their defined phone number out of AD and assign that as their LineURI. Then they can go to the dialin page and set their own PIN. The problem here is that there is no guarantee that the number in AD is accurate, valid, and/or properly formatted. Even with EV disabled on an account, as soon as you set LineURI you can right click on a non-EV user and a pop out becomes available to call their work number. This should work fine but again, who knows if AD is accurate, has a valid number defined, and has that number in e.164 format.  Plus this could add some confusion when we do get around to EV enabling the user. Since they already have a lineURI, do we overwrite it? Probably, but….confusion.

2. Assign a random PIN to those users and e-mail it to them. Fortunately, there is a poorly documented Lync PowerShell command that actually does this: Set-CsPinSendCAWelcomeMail. This cmdlet is so neglected it doesn’t even get a proper Technet page like every other cmdlet does. Fortunately, it’s a fairly self explanatory cmdlet. In it’s shortest form, you can generate a random PIN for a user and then send them an e-mail with that PIN using the following syntax:

Set-CsPinSendCAWelcomeMail -UserURI&amp;nbsp; -from -smtpserver

The UserURI is the user’s sip address without the “sip:” part. The Set-CsPinSendCAWelcomeMail does a few lookups to find a Lync user that matches this address. Note that if you just use the SamAccountName (cdiaz) or provide a SIP address ( that the cmdlet will be unable to send the e-mail. (I learned this the hard way!). I haven’t tested to see what happens if the e-mail address does not match the users SIP address but I bet the -UserEmailAddress parameter comes in handy in this case.

The -from field is the usual from field used in e-mail. Set this to an administrative account so when people receive the e-mail it will look “official” instead of coming from some doofus like me. Finally you provide the name of the mail server through which to send the e-mail with the -smtpserver parameter. So far so simple. And I bet you can figure out most of the other parameters pretty easily.

The one that took me some time to figure out is the “-TemplatePath” parameter. What this parameter does is let you pick an alternate e-mail message template than the default one that ships with Lync.

Oh, there is a default one?

This is what the default e-mail looks like. I don’t particularly like the verbiage on the first line because I think it’s wrong. Just because you have a PIN doesn’t mean you can suddenly join conferences. You can join conferences without a PIN.   PIN Default welcome Check out this folder on your Lync server: C:\Program Files\Common Files\Microsoft Lync Server 2013\Modules\Lync

Check out this folder on your Skype for Business server: C:\Program Files\Common Files\Skype for Business Server 2015\Modules\SkypeForBusiness

Inside there is a file called “CAWelcomeEmailTemplate.html”. Open it in Notepad or some other text/HTML editor and take a look. It’s all just basic HTML but I do want to point out that there are 2 variables in this file. If you want to create your own custom templates, you might need to use these:

%URL% – This is the URL to your dial in Simple URL

%PIN% – This is the PIN that was set by the cmdlet

If you only want to make a minor change, feel free to back up the original CAWelcomeEmailTemplate and then edit that one directly. Note that this directory has the annoying security set on it so you need to open your editor as Administrator in order to save back your changes. Also keep in mind that if you have multiple front ends, you’ll have to copy this edited default file to each one of your servers. And then don’t forget to do it when bringing up a new Front End in the future.

After editing the file, I ran Set-CsPinSendCAWelcomeMail again and this is the new message: PIN Edited default welcomeNow if you want to have a separate template, or want to leave the default template alone, you need to use the -TemplatePath parameter. You can’t just copy your changed template into the C:\Program Files\Common Files\Microsoft Lync Server 2013\Modules\Lync directory and just provide the name of your new template. That would be easy. No, you have to provide a full path  (or have the file sitting in your local home folder (i.e. %userprofile% directory)). I suppose there is an advantage to this. Instead of having to copy a file to every front end, you only need to keep it in one location. Anyway, here is the command from above but this time run with the -TemplatePath parameter:

Set-CsPinSendCAWelcomeMail -UserURI&amp;nbsp; -from -smtpserver "c:\temp\MyWelcomeTemplate.html"

When running it, you get something like the following: PIN Edited default welcome PathI hope you read that whole e-mail. Partially because any reference to The Hitchhikers Guide to the Galaxy ought to be read, but mostly for the last few words: “Your PIN has not been changed”. If a user already has a PIN, then this command will not change it.

How to tell if a user already has a PIN: Run Get-CsClientPinInfo -identity <user>. 

So what can you do if you want to use this command but also want to change the PIN no matter what? You can append the -force switch to the command. So running this bad boy produces the output below:

Set-CsPinSendCAWelcomeMail -UserURI&amp;nbsp; -from -smtpserver "c:\temp\MyWelcomeTemplate.html" -force

PIN Edited default welcome Path force Check out the very bottom and you can see that a random PIN was generated.

If you run this cmdlet, doesn’t it seem more like a script than just a cmdlet? That’s because it is a script. Look in this directory:

Lync:  C:\Program Files\Common Files\Microsoft Lync Server 2013\Modules\Lync

Skype: C:\Program Files\Common Files\Skype for Business Server 2015\Modules\SkypeForBusiness

There is a file called SetCsPinSendCAWelcomeMail.ps1. This is the script that actually does all the magic. It’s a really straightforward script. I’m not sure what you might want to edit in it except perhaps defining your own variables like %PIN% and %URL% that you want to add yourself.

There may be one reason that you actually do want to edit this script and that is because the verbose mode is “broken”. Lync MVP Pat Richard even opened an IdeaScale entry for this “feature”. Hacking this file will provide a workaround until Microsoft decides to update this file.

Open the file and remove every occurrence of “-Verbose:$Verbose”.  According to TechNet, -verbose “displays any verbose messages, regardless of the value of the $VerbosePreference variable.” And by default, $VerbosePreference is set to “SilentlyContinue” which means “don’t show verbose messages”