Migrating Gallery.TechNet to GitHub made easier

TL;DR: My “New-ObfuscatedFile.ps1” script uses a find/replace CSV file to make multiple substitutions in a text file in one pass. It can be easily repurposed to turn HTML into MarkDown.

Microsoft’s Gallery.TechNet.microsoft.com site will be sorely missed when it’s closed later in the year.

It’s been a fantastic repository of tools, documents and utilities, and no one place on the Internet will replace it.

As it stands today, the “Lync” category has 469 offerings, and across the entire site a total of 25947 items are there for the unearthing, all designed to make your life easier.

I see my fellow MVPs Luca, Stale and Shane take top billing, with download numbers I can only dream of.

Those guys, like me and many others are now faced with re-homing all this content somewhere else.

For our scripts, that’s GitHub – but how to get everything across?

Continue reading ‘Migrating Gallery.TechNet to GitHub made easier’ »

Use a UI Flow to automate web forms – Pt.2

TL;DR: Part 2: add an On-premises Data Gateway & trigger a “UI Flow” via a web hook, initiated by a “flic” smart button.

In my last post I demonstrated how you can use the new “UI Automation” functionality inside Power Automate (pka Microsoft Flow) to fill out a web form. In that example I automated a report of a shopping trolley abandoned out the front of home.

This post adds the trigger control. Here I’ll take you through adding the required “on-premises data gateway” and add a web-hook to fire the flow, triggered by one of our “flic” smart buttons. With one of these located near the door we’ll be able to lazily submit a trolley report just by tapping it when we arrive home.

Continue reading ‘Use a UI Flow to automate web forms – Pt.2’ »

Use a UI Flow to automate web forms

TL;DR: I walk you through the entire process of creating a “UI Flow” in Power Automate to fill out and submit a web form.

The headquarters of the Greiginsydney empire is located quite close to a store of one of Australia’s major supermarket chains (Coles).

I walk there and only ever shop for as much as I can carry home, but some of my neighbours aren’t either as fit or as considerate, and we regularly find shopping trolleys (which aren’t meant to leave the shopping centre) abandoned in our driveway and the immediate surrounds.

Coles has a website where you can report dumped trolleys, but the form is relatively complicated. It doesn’t just POST your address when you click Submit, but creates a complicated cookie with the converted lat/long of your location. I wasn’t up for trying to simulate that in code, and one of my MVP peers suggested it sounded like a great opportunity to create a UI flow.

Turns out it’s relatively simple to do, using the new “UI Automation” functionality inside Power Automate (pka Microsoft Flow).

In Part 2 next weekend I’ll add a web-hook to fire the flow, triggered by one of our “flic” smart buttons. With one of these located near the door I’ll be able to submit a trolley report just by tapping it when I walk in the door.

This weekend we’ll create the Flow.
Continue reading ‘Use a UI Flow to automate web forms’ »

SfBS 2019 CU2 HF1 March 2020

Things have been a bit quiet on the updates front of late, and today’s hotfix for SfB Server 2019 barely caused a ripple. This update builds upon December’s CU2, only updating two components on my SE Front-End. It takes the build from 7.0.2046.151 to 7.0.2046.216.

What’s Fixed?

  • Kb 4552637 “Fatal error during installation” error when uninstalling MacpWebComponents.msp in Skype for Business Server 2019.

Continue reading ‘SfBS 2019 CU2 HF1 March 2020’ »

Lync 2010 client version summary

I’ve long stopped blogging Lync 2010 client versions, but I recently had cause to go for a bit of a search, and there were some I encountered in the wild that I’d not previously documented here.

Here are a few more versions and some links. This isn’t a comprehensive list, but is intended to augment those that will be revealed if you use the Search function on the blog.

Some of the below was sourced from Andrew’s blog, and others from Frank Carius.

As best I can tell, 4.0.7577.4540 from Sept 2017 remains the last update to this long-obsolete client.

4.0.7577.4540 Sept 2017 – Security Update

4.0.7577.4534 June 2017

4.0.7577.4525 March 2017

KB4010299

4.0.7577.4486 Dec 2015

4.0.7577.4415 Dec 2013 – Security Update

 
– Greig,
18th March 2020.

 

Raspberry Pi shutdown button

We have a small but growing collection of Raspberry Pi devices here. They’re performing a range of tasks: one’s our Pi-Hole, another runs the “Homebridge” middleware between Apple’s HomeKit and our Clipsal C-Bus, whilst a third is running the management app for Ubiquiti UniFi. And of course plenty more are strewn around the place running various test builds of the intvlm8r.

All of these are running headless, so it means if we want to shut them down for any reason we first need to SSH into them to initiate a ‘sudo shutdown now’.

There are some ‘shims’ on the market that provide on/off switch functionality and even potentially some power management, but they’re relatively expensive and generally overkill for our purposes.

A well kept secret is that the Raspberry Pi has for a while now had the ability to initiate a shutdown from an IO pin, and even to start it up again at the OS level – no scripts or fancy hardware required!

All you need is a momentary switch and one line of code in config.txt.

Continue reading ‘Raspberry Pi shutdown button’ »

Begin-Process-End in a PowerShell script

Much has been written about how you need to use Begin/Process/End blocks in order to handle a collection of values passed from the pipeline, but those posts all seem to focus on how to do it in a *function*, not a script.

I recently struggled to figure out how to retrofit this functionality into one of my existing PowerShell scripts.

If you’re here I guess you already know WHY you want to do it, but it’s the HOW what’s causing you distress.

Seen this and had your script dump a list of running processes to screen?

begin : The term 'begin' is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spelling
of the name, or if a path was included, verify that the path is correct and try again.

The trick is simple: there can be NO executable code outside the B/P/E blocks. Nothing. No ‘statics’, no hash tables declared, no functions, not a sausage. Once you move the lot into the Begin block, it’s plain sailing.

Continue reading ‘Begin-Process-End in a PowerShell script’ »

Adventures with Import- and Update-CsUserData Pt.4

I’ve spent a lot of time in the past 12 months working with the <verb>-CsUserData commandlets in SfB, and it’s been an interesting time.

This is part 4 in a series where I document the traps I’ve fallen into with the Import-CsUserData and Update-CsUserData commands in particular.

Part 1 – Update-CsUserData fails on bad data.
Part 2 – Your Front-End won’t start after Import-CsUserData imports bad data.
Part 3 – Update-CsUserData throws false red and runs slow if your paired pool is offline.
Part 4 – You can’t trust Import-CsUserData to tell you if it fails.

Part 4 – You can’t trust Import-CsUserData to tell you if it fails

Having abandoned Update-CsUserData we moved to Import-CsUserData, but that wasn’t the bed of roses we were expecting either.

TL;DR: DON’T run “Import-CsUserData” without the -Verbose switch, and make sure you pay attention to its output. If it has some objection to your XML or ZIP file it might silently fail. Only with the -Verbose switch will you know for sure*.

(*) And even then I wouldn’t bank my career on it.

Continue reading ‘Adventures with Import- and Update-CsUserData Pt.4’ »

Adventures with Import- and Update-CsUserData Pt.3

I’ve spent a lot of time in the past 12 months working with the <verb>-CsUserData commandlets in SfB, and it’s been an interesting time.

This is part 3 in a series where I document the traps I’ve fallen into with the Import-CsUserData and Update-CsUserData commands in particular.

Part 1 – Update-CsUserData fails on bad data.
Part 2 – Your Front-End won’t start after Import-CsUserData imports bad data.
Part 3 – Update-CsUserData throws false red and runs slow if your paired pool is offline
Part 4 – You can’t trust Import-CsUserData to tell you if it fails.

Part 3 – Update-CsUserData throws false red and runs slow if your paired pool is offline

TL;DR: If you have paired pools, Update-CsUserData will throw red – appearing to fail – and potentially take a LONG time to execute if your paired pool is offline / failed over. Even if it’s still responding, if that other PoolState is FailedOver, you’re in dangerous territory.

Continue reading ‘Adventures with Import- and Update-CsUserData Pt.3’ »

SfBS RGS lets you spoof a SIP Domain


 
A long-standing bug in Skype for Business’s Response Group Service (“RGS”) is that it doesn’t validate the line URI when you create a new Workflow. This means it won’t err out if you chose a number that’s already in use elsewhere, and the upshot is that neither the existing user nor the response group can be called. Tracing will reveal a “SIP/2.0 485 Ambiguous” error.

But did you know it doesn’t validate the SIP Domain either?

You can create a Workflow for ANY SIP domain, and not only will it save it without error – it will route!

Continue reading ‘SfBS RGS lets you spoof a SIP Domain’ »