A Quick Look At The Get-PnPGroup Cmdlet And Its Operation

Why This Particular Topic?

I wouldn’t be surprised if some of you might be saying and asking, “Okay, that’s an odd choice for a post – even for you. Why?”

If you’re one of those people wondering, I would say that the sentiment and question are certainly fair. I’m actually writing this as part of my agreed upon “homework” from last Monday’s broadcast of the Community Office Hours podcast (I think that’s what we’re calling them). If you’re not immediately familiar with this particular podcast and its purpose, I’ll take two seconds out to describe.

I was approached one day by Christian Buckley (so many “interesting experiences” seem to start with Christian Buckley) about a thought he had. He wanted to start doing a series of podcasts each week to address questions, concerns, problems, and other “things” related to Office 365, Microsoft Teams, and all the O365/M365 associated workloads. He wanted to open it up as a panel-style podcast, and although anyone could join, he was interested in rounding-up a handful of Microsoft MVPs to “staff” the podcast in an ongoing capacity. The idea sounded good to me, so I said “Count me in” even before he finished his thoughts and pitch.

I wasn’t sure what to expect initially … but we just finished our 22nd episode this past Monday, and we are still going strong. The cast on the podcast rotates a bit, but there are a few of us that are part of what I’d consider the “core group” of entertainers …

The podcast has actually become something I look forward to every Monday, especially with the pandemic and the general lack of in-person social contact I seem to have (or rather, don’t have). We do two sections of the podcast every Monday: one for EMEA at 11:00am EST and the other for APAC at 9:00pm EST. You can find out more about the podcast in general through the Facebook group that’s maintained. Alternatively, you can send questions and things you’d like to see us address on the podcast to OfficeHours@CollabTalk.com.

If you don’t want (or have the time) to watch the podcast live, an archive of past episodes exists on Christian’s site, I maintain an active playlist of the recorded episodes on YouTube, and I’m sure there are other repositories available.

Ok, Got It. “Your Homework,” You Say?

The broadcasts we do normally have no fixed format or agenda, so we (mostly Christian) tend to pull questions and topics to address from the Facebook group and other places. And since the topics are generally so wide-ranging, it goes without saying that we have viable answers for some topics … but there are plenty of things we’re not good at (like telephony) and freely tell you so.

Whenever we get to a question or topic that should be dealt with outside the scope of the podcast (oftentimes to do some research or contact a resource who knows the domain), we’ll avoid BSing too much … and someone will take the time to research the topic and return back the following week with what they found or put together. We’re trying to tackle a bunch of questions and topics each week, and none of us is well-versed in the entire landscape of M365. Things just change so darn fast these days ….

So, my “homework” from last week was one of these topics. And I’m trying to do one better than just report back to the podcast with an answer. The topic and research may be of interest to plenty of people – not just the person who asked about it originally. Since today is Sunday, I’m racing against the clock to put this together before tomorrow’s podcast episodes …

The Topic

Rather than trying to supply a summary of the topic, I’m simply going to share the post and then address it. The inquiry/post itself was made in the Office 365 Community Facebook group by Bilal Bajwa. Bilal is from Milwaulkee, Wisconsin, and he was seeking some PowerShell-related help:

Being the lone developer in our group of podcast regulars (and having worked a fair bit with the SharePointPnP Cmdlets for PowerShell and PowerShell in general), I offered to take Bilal’s post for homework and come back with something to share. As of today (Sunday, 8/23/2020), the post is still sitting in the Facebook group without comment – something I hope to change once this blog post goes live in a bit.

SharePointPnP Cmdlets And The Get-PnPGroup Cmdlet Specifically

If you’re a SharePoint administrator and you’re unfamiliar with the SharePoint Patterns and Practices group and the PowerShell cmdlets they maintain, I’M giving YOU a piece of homework: read the Microsoft Docs to familiarize yourself with what they offer and how they operate. They will only help make your job easier. That’s right: RTFM. Few people truly enjoy reading documentation, but it’s hard to find a better and more complete reference medium.

If you are already familiar with the PnP cmdlets … awesome! As you undoubtedly know, they add quite a bit of functionality and extend a SharePoint administrator’s range of control and options within just about any SharePoint environment. The PnP group that maintains the cmdlets (and many other tools) are a group of very bright and very giving folks.

Vesa Juvonen is one name I associate with pretty much anything PnP. He’s a Principal Program Manager at Microsoft these days, and he directs many of the PnP efforts in addition to being an exceptionally nice (and resourceful!) guy.

The SharePoint Developer Blog regularly covers PnP topics, and they regularly summarize and update PnP resource material – as well as explain it. Check out this post for additional background and detail.

Cmdlet: Get-PnPGroup

Now that I’ve said all that, let’s get started with looking at the Get-PnPGroup cmdlet that is part of the SharePointPnP PowerShell module. I will assume that you have some skill with PowerShell and have access to a (SharePoint) environment to run the cmdlets successfully. If you’re new to all this, then I would suggest reviewing the Microsoft Docs link I provide in this blog post, as they cover many different topics including how to get setup to use the SharePoint PnP cmdlets.

In his question/post, Bilal didn’t specify whether he was trying to run the Get-PnPGroup cmdlet against a SharePoint Online (SPO) site or a SharePoint on-premises farm. The operation of the SharePointPnP cmdlets, while being fairly consistent and predictable from cmdlet to cmdlet, sometimes vary a bit depending on the version of SharePoint in-use (on-premises) or whether SPO is being targeted. In my experience, the exposed APIs and development surfaces went through some enhancement after SharePoint 2013 in specific areas. One such area that was affected was data pertaining to site users and their alerts; the data is available in SharePoint 2016 and 2019 (as well as in SPO), but it’s inaccessible in 2013.

Because of this, it is best to review the online documentation for any cmdlet you’re going to use. Barring that, make sure you remember the availability of the documentation if you encounter any issues or behavior that isn’t expected.

If we do this for Get-PnPGroup, we frankly don’t get too much. The online documentation at Microsoft Docs is relatively sparse and just slightly better than auto-generated docs. But we do get a little helpful info:

We can see from the docs that this cmdlet runs against all versions of SharePoint starting with SharePoint 2013. I would therefore expect operations to be generally be consistent across versions (and location) of SharePoint.

A little further down in the documentation for Get-PnPGroup (in Example 1), we find that simply running the cmdlet is said to return all SharePoint groups in a site. Let’s see that in practice.

Running Wild

I fired up a VM-based SharePoint 2019 farm I have to serve as the target for on-prem tests. For SPO, I decided to use my family’s tenant as a test target. Due to time constraints, I didn’t get a chance to run anything against my VM environment, so I’m assuming (dangerous, I know) that on-prem results will match SPO. If they don’t, I’m sure someone will tell me below (in the Comments) …

Going against SPO involves connecting to the tenant and then executing Get-PnPGroup. The initial results:

Running Get-PnPGroup returned something, and it’s initially presented to us in a somewhat condensed table format that includes ID, (group) Title, and LoginName.

But there’s definitely more under the hood than is being shown here, and that “under the hood” part is what I suspect might have been causing Bilal some issues when he looked at his results.

We’ve all probably heard it before at some point: PowerShell is an object-oriented scripting language. This means that PowerShell manipulates and works with Microsoft .NET objects behind-the-scenes for most things. What may appear as a scalar value or simple text data on first inspection could be just the tip of the “object iceberg” when it comes to PowerShell.

Going A Bit Deeper

To learn a bit more about what the function is actually returning upon execution, I ran the Get-PnPGroup cmdlet again and assigned the function return to a variable I called $group (which you can see in the screen capture earlier). Performing this variable assignment would allow me to continue working with the function output (i.e., the SharePoint groups) without the need to keep querying my SharePoint environment.

To display the contents of $group with additional detail, the PowerShell I executed might appear a little cryptic for those who don’t live in PowerShellLand:

$group | fl

There’s some shorthand in play with that last bit of PowerShell, so I’ll spell everything out. First, fl is the shorthand notation for the Format-List cmdlet. I could have just as easily typed …

$group | Format-List

… but that’s more typing! I’m no different than anyone else, and I like to get more done with less whenpossible.

Next, the pipe (“|”) will be familiar to most PowerShell practitioners, and here it’s used to send the contents of the $group variable to the Format-List cmdlet. The Format-List cmdlet then expands the data piped to it (i.e., the SharePoint groups in $group) and shows all the property values that exist for each SharePoint group.

If you’re not familiar with .NET objects or object-oriented development, I should point out that the SharePoint groups returned and assigned to our $group variable are .NET objects. Knowing this might help your understanding – or maybe not. Try not to worry if you’re not a dev and don’t speak dev. I know that to many admins, devs might as well be speaking jive …

For our purposes today, we’re going to limit our discussion and analysis of objects to just their properties – nothing more. The focus still remains PowerShell.

What Are The Actual Properties Available To Us?

If you’re asking the question just posed, then you’re following along and hopefully making some kind of sense of a what I’m sharing.

So, what are the properties that are exposed by each of the SharePoint groups? Looking at the output of the $group variable sent to the Format-List command (shown earlier) gives you an idea, but there’s a much quicker and more reliable way to get the listing of properties.

You may not like what I’m about to say, but it probably won’t surprise you: those properties are documented (for everyone to learn about) in Microsoft Docs. Yes, another documentation reference!

How did I know what to look/search for? If you refer to the end of the reference for the Get-PnPGroup cmdlet, there is a section that describes the “Outputs” from running the cmdlet. That output is only one line of text, and it’s exactly what we need to make the next hop in our hunt for properties details:

List<Microsoft.SharePoint.Client.Group>

A List is a .NET collection class, but that’s not important for our purposes. Simply put, you can think of a .NET List as a “bucket” into which we put other objects – including our SharePoint groups. The class/type that is identified between the “<” and “>” after List specify the type of each object in the List. In our case, each item in the List is of type Microsoft.SharePoint.Client.Group.

If you search for that class type, you’ll get a reference in your search results that points to a Microsoft Docs link serving as a reference for the SharePoint Group type we’re interested in. And if we look at the “Properties” link of that particular reference, each of the properties that appear in our returned groups are spelled out with additional information – in most cases, at least basic usage information is included.

A quick look at those properties and a review of one of the groups in the $group variable (shown below) should convince you that you’re looking at the right reference.

What Do We Do Now?

You might recall that we’re going through this exercise of learning about the output from the Get-PnPGroup cmdlet because Bilal asked the question, “Any idea how to filter?”

Hopefully the output that’s returned from the cmdlet makes some amount of sense, and I’ve convinced you (and Bilal) that it’s not “garbage” but a List collection of .NET objects that are all of the Microsoft.SharePoint.Client.Group type.

At this point, we can leave our discussion of .NET objects behind (for the most part) and transition back to PowerShell proper to talk about filtering. We could do our filtering without leaving .NET, but that wouldn’t be considered the “PowerShell way” of doing it. Just remember, though: there’s almost always more than one way to get the results you need from PowerShell …

Filtering The Results

In the case of my family’s SPO tenant, there are a total of seven (7) SharePoint groups in the main site collection:

Looking at a test case for filtering, I’m going to try to get any group that has “McDonough” in its name.

A SharePoint group’s name is the value of the Title property, and a very straightforward way to filter a collection of objects (which we have identified exists within our $group variable) is through the use of the Where-Object cmdlet.

Let’s setup some PowerShell that should return only the subset of groups that I’m interested in (i.e., those with “McDonough” in the Title). Reviewing the seven groups in my site collection, I note that only three (3) of them contain my last name. So, after filtering, we should have precisely three groups listed.

Preparing the PowerShell …

$group | where-object {$_.Title -like "*McDonough*"}

… and executing this, we get back the filtered results predicted and expected; i.e., three SharePoint groups:

For those that could use a little extra clarification, I will summarize what transpired when I executed that last line of PowerShell.

  1. From our previous Get-PnPGroup operation, we knew that the $group variable contained the seven groups that exist in my site collection.
  2. We piped (“|”) that unfiltered collection of groups to the Where-Object cmdlet. It’s worth pointing out that the cmdlets and most of the other strings/text in PowerShell are case-insensitive (Where-Object, where-object, and WhErE-oBjEcT are all the same from a PowerShell processing perspective).
  3. The curly braces after the where-object cmdlet define the logic that will be processed for each object (i.e., SharePoint group) that is passed to the where-object cmdlet.
  4. Within the curly braces, we indicated that we wanted to filter and keep each group that had a Title which was like “*McDonough*” This was accomplished with the -like operator (PowerShell has many other operators, too). The asterisks before and after “McDonough” are simply wildcards that will match against anything with “McDonough” in the Title – regardless of any text or characters appearing before and/or after “McDonough”
  5. Also worth nothing within the curly braces is the “$_.” notation. When iterating through the collection of SharePoint groups, the “$_.” denotes the current object/group we’re evaluating – each one in turn.

Round Two

Let’s try another one before pulling the plug (figuratively and literally – it’s close to my bed time …)

Let’s filter and keep only the groups where the members of the group can also edit the group membership. This is an uncommon scenario, and we might wish to know this information for some potential security tightening.

Looking at the properties available on the Group type, I see the one I’m interested in: AllowMembersEditMembership. It’s a boolean value, and I want back the groups that have a value of true (which is represented as $true in PowerShell) for this property.

$group | where-object {$_.AllowMembersEditMembership -eq $true}

Running the PowerShell just presented, we get only one matching group back:

Frankly, that’s one more group than I originally expected, so I should probably take a closer look in the ol’ family site collection …

Summary

I hope this helped you (and Bilal) understand that there is a method to PowerShell’s madness. We just need to lean on .NET and objected oriented concepts a bit to help us get what we want.

The filtering I demonstrated was pretty basic, and there are numerous ways to take it further and get more specific in your filtering logic/expressions. If you weren’t already comfortable with filtering, I hope you now know that it isn’t really that hard.

If I happened to skip or gloss over something important, please leave me a note in the Comments section below. My goal was to provide a complete-enough picture to build some confidence – so that the next time you need to work with objects and filter them in PowerShell, you’ll feel comfortable doing so.

Have fun PowerShelling!

References And Resources

  1. LinkedIn: Christian Buckley
  2. Podcast History: Microsoft Community Office Hours from 8/18/2020
  3. BuckleyPLANET: Community category and activities
  4. Facebook Group: Office 365 Community
  5. Email Group: OfficeHours@CollabTalk.com
  6. YouTube: Microsoft Community Office Hours playlist
  7. Microsoft Docs: PnP PowerShell Overview
  8. LinkedIn: Vesa Juvonen
  9. Blog: SharePoint Developer Blog
  10. Blog Post: Microsoft 365 & SharePoint Ecosystem (PnP) – July 2020 Update
  11. Microsoft Docs: Get-PnPGroup
  12. Microsoft: What Is .NET Framework?
  13. Microsoft Docs: Format-List
  14. Microsoft Docs: List<T> Class
  15. Microsoft Docs: Group Class
  16. Microsoft Docs: Group Properties
  17. Microsoft Docs: Where-Object
  18. Microsoft Docs: About Comparison Operators

What CDN Usage Does for SharePoint Online (SPO) Performance

If you need the what’s what on CDNs (content delivery networks), this is a bit of quick reading that will get you up to speed with what a CDN is, how to configure your SPO tenant to use a CDN, and the benefits that CDNs can bring.

The (Not Entirely Obvious) TL;DR Answer

CDN

Since I’m taking the time to write about the topic, you can safely guess that yes, CDNs make a difference withSPO page operations. In many cases, proper CDN configuration will make a substantial difference in SPO page performance. So enable CDN use NOW!

The Basis For That Answer: Introduction

Knowing that some folks simply want the answer up-front, I hope that I’ve satisfied their curiosity. The rest of this post is dedicated to explaining content delivery networks (CDNs), how they operate, and how you can easily enable them for use within your SharePoint Online (SPO) sites.

Let me first address a misconception that I sometimes encountered among SPO administrators and developers (including some MVPs) – that being that CDNs don’t really “do a whole lot” to help site and/or page performance. Sure, usage of a CDN is recommended … but a common misunderstanding is that a CDN is really more of a “nice-to-have” than “need-to-have” element for SPO sites. Of the people saying such things, oftentimes that judgment comes without any real research, knowledge, or testing. Skeptics typically haven’t read the documentation (the “non-RTFM crowd”) and haven’t actually spent any time profiling and troubleshooting the performance of SPO sites. Since I enjoy addressing perf. problems and challenges, I’ve been fortunate to experience firsthand the benefits that CDNs can bring. By the end of this post, I hope I’ll have made converts of a CDN skeptic or two.

What Is A CDN?

Abstract Network

A CDN is a Content Delivery Network. There are a lot of (good) web resources that describe and illustrate what CDNs are and how they generally operate (like this one and this one), so I’m not going to attempt to “add value” with my own spin. I will simply call attention to a couple of the key characteristics that we really care about in our use of CDNs with SPO.

  1. A CDN, at its core, can be thought of as a system of distributed (typically geographically so) servers for caching and offloading of SPO content. Rather than needing to go to the Microsoft network and data center where your tenant is located in order to fetch certain files from SPO, your browser can instead go to a (geographically) closer CDN server to get those same files.
  2. By virtue of going to a closer CDN instead of the Microsoft network, the chance that you’ll have a “bigger pipe” with more bandwidth – and less latency/delay – are greater. This usually translates directly to an improvement in performance.
  3. In addition to giving us the opportunity to download certain SPO files faster and with less delay, CDNs can do other things to improve the experience for the SPO files they serve. For instance, CDN servers can pass files back to the browser with cache-control headers that allow browsers to re-serve downloaded files to other users (i.e, to users who haven’t actually download the files), store downloaded files locally (to avoid having to download them again for a period of time), and more.

If you didn’t know about CDNs prior to this post, or didn’t understand how they could help you, I hope you’re beginning to see the possibilities!

The Arrival Of The Office 365 CDN

It wasn’t all that long ago that Microsoft was a bit more “modest” in its use of CDNs. Microsoft certainly made use of them, but prior to the implementation of its own content delivery networks, Microsoft frequently turned to a company called Akamai for CDN support.

When I first started presenting on SharePoint and its built-in caching mechanisms, I often spoke about Akamai and their edge network when talking about BLOB caching and how the max-age cache-control header could be configured and misconfigured. Back then, “Akamai” was basically synonymous with “CDN,” and that’s how many of us thought about the company. They were certainly leading the pack in the CDN service space.

Back then, if you were attempting to download a large file from Microsoft (think DVD images, ISO files, etc.), then there was a good change that the download link your browser would receive (from Microsoft’s servers) would actually point to an Akamai edge node near your location geographically instead of a Microsoft destination.

Fast forward to today. In addition to utilizing third-party CDNs like those deployed by Akamai, Microsoft has built (and is improving) their own first-party CDNs. There are a couple of benefits to this. First, many data regulations you may be subject to that prevent third-party housing of your data (yes, even in temporary locations like a CDN) can be largely avoided. In the case of CDNs that Microsoft is running, there is no hand-off to a third party and thus much less practical concern regarding who is housing your data.

Second, with their own CDNs, Microsoft has a lot more latitude and ability to extend the specifics of CDN configuration and operation its customers. And that’s what they’ve done with the Office 365 CDN.

Set Up The O365 CDN For Tenant’s Use

Now we’re talking! This next part is particularly important, and it’s what drove the creation of this post. It’s also the one bit of information that I promised Scott Stewart at Microsoft that I would try to get “out in the wild” as quickly and as visibly as possible.

So, if you remember nothing else from this post,please remember this:

Set-SPOTenantCdnEnabled -CdnType Public -Enable $true

That is the line of PowerShell that needs to be executed (against your SPO tenant, so you need to have a connection to your tenant established first) to enable transparent CDN support for public files. Run that, and non-sensitive files of public origin from SPO will begin getting cached in a CDN and served from there.

The line of PowerShell I shared goes through the SharePoint Online Management Shell – something most organizations using SPO (and their admins in particular) have installed somewhere.

It is also possible to enable CDN support if you’re using the PNP PowerShell module, if that’s your preference, by executing the following PowerShell:

Set-PnPTenantCdnEnabled -CdnType Public -Enable $true

No matter how you enable the CDN, it should be noted that the PowerShell I’ve elected to share (above) enables CDN usage for files of public origin only. It is easy enough to alter the parameters being passed in our PowerShell command so as to cover all files, public and private, by switching -CdnType to Both (with the SPO management shell) or executing another line of PowerShell after the first that swaps –type Public with –type Private (in the case of the SharePointPnP PowerShell module).

The reason I chose only public enablement is because your organization may be bound by restrictions or policies that prohibit or limit CDN use with private files. This is discussed a bit in the O365 CDN post originally cited, but it’s best to do your own research.

Enabling CDN support for public files, however, is considered to be safe in general.

What Sort Of Improvements Can I Potentially See?

I’ve got a series of images that I use to illustrate performance improvements when files are served via CDN instead of SPO list/library, and those files are from Microsoft. Thankfully, MS makes the images I tend to use (and a discussion of them) free available, and they are presented at this link for your reading and reference.

The example that is called out in the link I just shared involves offloading of the jQuery JavaScript library from SPO to CDN. The real world numbers that were captured reduced fetch-and-load time from just over 1.5 seconds to less than half a second (<500ms). That is no small change … and that’s for just one file!

The Other (Secret) Benefit Of CDNs

I guess “Secret” is technically the wrong choice of term here. A more accurate description would be to say that I seldom hear or see anyone talking about another CDN benefit I consider to be very important and significant. That benefit, quite simply, involves improving file fetching and retrieval parallelism when a web page and associated assets (CSS, JS, images, etc.) are requested for download by your browser. In plain English: CDNs typically improve file downloading by allowing the browser to issue a greater number of concurrent file requests.

To help with this concept and its explanation, I’ve created a couple of diagrams that I’ll share with you. The first one appears below, and it is meant to represent the series of steps a browser might execute when retrieving everything needed to show a (SharePoint/SPO) page. As we’ve talked about, what is commonly thought of as a single page in a SharePoint site is, more accurately, a page containing all sorts of dependent assets: image files, JavaScript files, cascading style sheets, and a whole bunch more.

A request for a SharePoint page housed at http://www.thesite.com might start out with one request, but your browser is going to need all of the files referenced within the context of that page (default.aspx, in our case) to render correctly. See below:

To get what’s needed to successfully render the example SharePoint page without CDN support, we follow the numbers:

  1. Your browser issues an HTTP request for the page you want to load – http://www.thesite.com/default.aspx in the case of example above.
  2. That page request goes to (and is served by) the web server/front-end that can return the page.
  3. Our page needs other files to render properly, like styling.css, logo.png, functions.js, and more. These get queued-up and returned according to some rules – more on this in a minute.
  4. In step four (4), files get returned to the browser. Notice I say “no more than six at a time” in the illustration. That’s important and will come into play once we start introducing CDN support to the page/site.

You might be wondering, “Only six files at a time? Really? Why the limitation?” Well, I should start by saying the limit is probably six … maybe a bit more, perhaps a bit less. It depends on the browser you’re using what the specific number is. There was a good summary answer on StackOverflow to a related (but slightly different) question that provides some additional discussion.

Section eight (8) of the HTTP specification (RFC 2616) specifically addresses HTTP connections, how they should be handled, how proxies should be negotiated, etc. For our purposes, the practical implementation of the HTTP specification by modern browsers generally limits the number of concurrent/active connections a browser can have to any given host or URL to six (6).

Notice how I worded that last sentence. Since you folks are smart cookies, I’ll bet you’re already thinking “Wait a minute. CDNs typically have different URLs/hosts from the sites they cache” and you’re imaging what happens (or can happen) when a new source (i.e., different host/URL) is introduced.

This illustration roughly outlines the fetch process when a CDN is involved:

Steps one (1) through four (4) of the fetch process with a CDN are basically still the same as was illustrated without a CDN a bit earlier. When the page is served-up in step three (3) and returned in step four (4), though, there are some differences and additional activity taking place:

  1. Since at least one CDN is in-use for the SPO environment, some of the resource links within the page that is returned will have different URLs. For instance, whereas styling.css was previously served from the SPO environment in the non-CDN example, it might now be referenced through the CDN host shown as http://cdn.source.com/styling.css
  2. The requested file is retrieved, and …
  3. Files come back to the client browser from the CDN at the same time they’re being passed-back from the SPO environment.

Since we’re dealing with two different URLs/hosts in our CDN example (http://www.thesite.com and cdn.source.com), our original six (6) file concurrent download limitation transforms into a 12 file limitation (two hosts serving six files a time, 2 x 6 = 12).

Whether or not the CDN-based process is ultimately faster than without a CDN depends on a great many factors: your Internet bandwidth, the performance of your computer, the complexity/structure of the page being served-up, and more. In the majority of cases, though, at least some performance improvement is observed. In many cases, the improvement can be quite substantial (as referenced and discussed earlier).

Additional Note: 8/24/2020

In a bit of laziness on my part, I didn’t do a prior article search before writing this post. As fate would have it, Bob German (a friend and fellow MVP – well, he was an MVP prior to joining Microsoft a couple of years back) wrote a great post at the end of 2017 that I became aware of this morning with a series of tweets. Bob’s post is called “Choosing a CDN for SharePoint Client Solutions” and is a bit more developer-oriented. That being said, it’s a fantastic post with good information that is a great additional read if you’re looking for more material and/or a slightly different perspective. Nice work, Bob!

Post Update: 8/26/2020

Anders Rask was kind enough to point out that the PnP PowerShell line I originally had listed wasn’t, in fact, PnP PowerShell. That specific line of PowerShell has since been updated to reflect the correct way of altering a tenant’s CDN with the PnP PowerShell cmdlets. Many thanks for the catch, Anders!

Conclusion

So, to sum-up: enable CDN use within your SPO tenant. The benefits are compelling!

References

  1. Microsoft Docs: Use The Office 365 Content Delivery Network (CDN) With SharePoint Online
  2. Imperva: What Is A CDN?
  3. Akamai: What Does CDN Stand For?
  4. MDN Web Docs: Cache-Control
  5. Company: Akamai
  6. Presentations: Caching-In For SharePoint Performance
  7. Akamai: Download Delivery
  8. Microsoft Docs: Configure Cache Settings For A Web Application In SharePoint Server
  9. Blog Post: Do You Know What’s Going To Happen When You Enable The SharePoint BLOB Cache?
  10. LinkedIn: Scott Stewart
  11. Microsoft Docs: Enabling O365 CDN support for public origin files.
  12. Microsoft Docs: Get Started With SharePoint Online Management Shell
  13. Microsoft Docs: PnP PowerShell Overview
  14. Microsoft Docs: Set Up And Configure The Office 365 CDN By Using PnP PowerShell
  15. Microsoft Docs: What Performance Gains Does A CDN Provide?
  16. Push Technologies: Browser Connection Limitations
  17. StackOverflow: How many maximum number of simultaneous Chrome connections/threads I can start through Selenium WebDriver?
  18. W3.org: RFC 2616, Section 8: Connection

2020 Goals + Recent and Upcoming Happenings

2020 is here and we are screaming through a new decade at light speed. In this post, I share my goals for 2020 (gulp!) and why they matter to me. I also share some upcoming events and recent efforts that may be of interest (and are free!)

Aircraft carrier launch

The new decade is in full swing at this point, and it is certainly moving along without showing any signs of slowing down soon. Like many others, January began for me a little like a jet being thrown off an aircraft carrier. I’m adapting to the uptick in activity and the pace at which things are moving, but whoa – whiplash!

Planning for a New Year

A good friend of mine and Microsoft PFE extraordinaire, Brian Jackett, has done something over the last handful of years that I both admire and have tried to emulate with limited degrees of success. Brian is an extremely thoughtful guy who regularly tries to lay out his goals and track his progress against those goals in various ways. One of the things he has done in the past is start off a new calendar year with some form of assessment of the previous year’s goals. He then proceeds to lay out what he’s going to be working on in the year ahead and why he’s chosen those goals. Brian has typically done this in blog post format. I haven’t seen one from him yet this year (hope he does – I’m always interested in where he’s focused), but he did write up a post going into the year 2019.

I’ve attempted to follow suit in the past, because it forces me to focus on the year ahead and set some goals.

At Best, Limited Success

It probably comes as no surprise for me to say that like so many others, I’ve set a bunch of goals in the past and then fallen dramatically short of achieving them. I attribute this outcome to many things: shifting priorities, lack of time (or more appropriately, lack of prioritization), and any number of other factors. But if I look back at previous years and try to summarize my results/outcome in one statement: In general, I think I’d set the bar too high.

In response to that, you may be thinking …

“Shoot for the moon. Even if you miss, you’ll land among the stars.”

Norman Vincent Peale

Peale was very big on positive thinking in case that previous quote doesn’t make it readily apparent. While I agree with him in an optimistic and energetic way, I’ll be honest: I’m getting to the age and point in life where my energy is starting to flag a bit. I also have many more people, efforts, and things vying for my attention and energy than I did earlier in my life/career.

I try to remain optimistic day-to-day (with varying degrees of success), but to guarantee that I truly remain focused and make progress on goals I set nowadays, I have to be realistic and pragmatic in the specific goals I set for myself. In general, I need to think more in terms of small steps rather than massive undertakings.

(Pragmatic) Goals for 2020

So, with some trepidation, I make my public declaration (here, in this blog) of 2020 goals. These are things I truly believe I can achieve, I can objectively and tangibly measure progress towards, which I can stick to, and on which I can stay motivated (very important!) These aren’t the only things I expect I’ll do, but they deserve to be called out as particular areas of focus.

In order of importance:

  1. Do at least one thing to delight my wife. Surprised to see a non-SharePoint goal listed first (or even listed)? I feel that I am a caring individual who thinks regularly of others, but a romantic I am not. Nor am I particularly good at surprising people (particularly those I’m close to) with something wonderful and delightful “out of the blue” – particularly something that comes from the heart. To be more cognizant of this deficiency (or “opportunity for growth,” if you prefer) is the most important thing for me to focus on this year. The measure of achievement will be (at least) one thing, one situation, one undertaking, one whatever – where I surprise my wife and she feels special, loved, and truly touched. That probably is an easy undertaking for many of you, but believe me when I say it’s something that will take a lot of thinking and planning on my end.
  2. Grow and strengthen my relationship with my children. My son and daughter, Brendan and Sabrina, turn 13 in March … meaning we’ll officially have teenagers in the house. Many times, it feels like they have been teens for a while now (especially Sabrina), but that’s not the reality. As a parent, I’ve been encountering a growing number of challenges (in general) with my kids. I’m less certain how to respond and react to them in many ways. I try to be a loving and engaged father, but that’s harder for me at times and in certain situations. My parents divorced when I was in third grade, and my middle school years (which is where my kids are in age now) were something of a mess with parents, step-parents, and other authority figures in my life. I didn’t have a lot of consistency or reliability in terms of role models and relationships. So, I’ve found myself looking to my wife more and more for guidance in situations that have been popping-up with the kids … and I’d like to be a better and confident father while relying a little less for outside help. I’m not saying that I want to totally go it alone, but I would say that I do want to develop a better compass and sense of “internal guidance.” Of all of the goals I’ve selected for myself this year, this is probably the toughest one to measure objectively … so my plan is to share it with my kids and then check in with them at various points over the year to see what they think and where they feel I am.
  3. Learn the SharePoint Framework (SPFx) enough to be truly competent with it. For those of you who might be reading this and aren’t familiar with SPFx, the easiest way to describe it is this way: it’s the only truly viable path forward for developers seeking to stay relevant with SharePoint development. I consider myself a SharePoint developer, but I come from the ranks of the “old guard” who began development with compiled code and SharePoint’s server-side object model. SPFx is Microsoft’s cloud-ready development model and is grounded firmly in JavaScript, along with frameworks, libraries, and other enabling client-side technologies like TypeScript, React, npm, gulp, yeoman, webpack … the list goes on. For classical devs like me, this is traditionally foreign territory; compiled code “it ain’t.” Until now, I’ve known enough SPFx to be dangerous, but I’m on a mission to learn it inside out. There have been many things motivating me and pushing me forward with that goal for quite some time now, but 2020 is when I’m going to internalize SPFx and become proficient with it. Measurement of that goal should be easy in that I’ll be doing project work based on SPFx development, creating client-side web parts, extensions, etc.
  4. Complete a redesign and relaunch www.bitstreamfoundry.com. This is something that’s been needed for quite some time – longer than I’d care to admit, actually. All that’s out there right now is a contact form with a mention of a new site “coming soon.” Well, that new site will arrive in 2020 – with a little luck and prioritization, sooner rather than later. I’ve picked-up some tools to make WordPress (which this blog and my Bitstream Foundry sites use as a web platform) editing truly WYSIWYG in approach, and I’ve got some ideas on how to put things together. The biggest challenge is (as I tell people), “I’m a plumber, not a painter” – meaning I do web development, but I focus on putting the underlying sites together, not on how they look.
There are many days when I work with CSS that I feel this way. I’m sure many other development “plumbers” like myself can relate.

Sure, I have some ability to style sites … but I’m not particularly creative in that regard and certainly no ace with CSS. My daughter Sabrina is extremely creative and talented; maybe I can enlist her help in beautifying the redesign … In any regard a re-launched Bitstream Foundry site will be the measure of success for this goal.

  1. Before the end of 2020, contribute one project to the public domain. There was a time (years ago, at this point) when I wrote software and tools for fun and shared those with the world at large – see my Tools section in the right-hand column. I still write tools, scripts, and develop other (I think) useful “things” … but I’ve not done a great job about sharing them broadly. This year, I want to return to my roots (a little) and get at least one project into the public domain. The measure of success for this one is pretty objective: did I release a tool or project … or not?
  2. Post regularly on this blog. And we come down to the final “Jeez, I’ve said that before.” For purposes of measurement, I’m going to shoot for once per month on this … but I’ll allow myself to “slide” to twice every three months if I get slammed. Much like projects and other development, I regularly come up with (and across) things I think would help others. Many of these would make at least decent blog posts, but they don’t always make it here. Wish me luck (and give me a swift kick in the butt) if you see me falling behind.

I could easily go on and on, but I want to stop at no more than a half-dozen goals. Remember: these are goals that I think are attainable, that I can stay focused on, and on which I can measure progress. They’re also important to me for the various reasons cited. They aren’t the only things I’ll be doing, but they will be points of focus.

Recent Developments and Plans

There are a few things I wanted to share so far for this year … and no, I don’t consider these as counting towards my stated goals in any way. These are just more-or-less informational items in case you or someone you know is interested.

Free report – Your Office 365 Journey: Securing Every Stage

A short time ago, I was among a handful of industry folks and other Microsoft MVPs (like Ragnar Heil) who were approached to participate in an effort to share guidance and strategies regarding Office 365 migration, experiences I’ve had with it, lessons I’ve learned along the way, etc. The results of that effort have been compiled into a report that is free to download from the folks at Censornet, so check it out!

Upcoming Digital Workplace webinar with Akumina

On Tuesday, February 12th, I’ll be teaming up with Akumina‘s president David Maffei to deliver a webinar titled “Modern SharePoint + Akumina’s EXP = A True Digital Workplace Experience.” Over the last several years, I’ve done a lot of work building and implementing digital workplaces using the Akumina platform both on-premises and in SharePoint Online. I’ve also done a lot work with SharePoint Online and on-premises without an accelerator or platform like Akumina in the mix. The purpose of this webinar is to explain what SharePoint, in its modern form, is capable of … and what a platform like Akumina can do to enhance “vanilla” SharePoint and enable a true digital workplace experience. It’s a free webinar, so sign up if it sounds interesting!

Chicago Suburbs M365 2020

Are you familiar with SharePoint Saturday events? They’ve been around for quite a few years now. They are gatherings of people who work with Microsoft SharePoint, regularly speak/educate on it, sell products and services oriented around it … and other folks who are simply SharePoint enthusiasts in some way. The events, which are normally held on Saturdays, are a source of education and information for the SharePoint platform, and they’re (almost) always free. Speakers and other presenters donate their time to deliver sessions, and food and prizes are obtained with the help of sponsor dollars.

In recent years, SharePoint Saturday events have been diversifying and becoming more inclusive than just SharePoint, and this change has been driven by SharePoint Online and the larger Office 365 / Microsoft 365 cloud suite and associated offerings. SharePoint is integrated into so many of the O365 workloads that the lines are really blurry around where SharePoint “stops” and another workload “begins.” As a result, many SharePoint Saturdays have adapted and become “Cloud Saturdays,” “Office 365 Saturdays,” etc., to reflect their broader nature and inclusion on non-SharePoint-specific topics.

I like to volunteer and donate my time and energy at as many of these events as I can get to (and that will accept me), and the next one on my list – my first for 2020 – is the next Chicago Suburbs M365 event on February 29th. If you are in or around the ‘burbs of Chicago, consider coming to the event, meeting others in our space, and learning something along the way. I’ll be presenting a session titled “Getting the Best Performance Out of Your SharePoint Online Site,” and I hope to see some of you there!

References and Resources

  1. Microsoft TechCommunity: How to become a Premier Field Engineer (PFE)
  2. Blog: The Frog Pond of Technology
  3. Blog Post: Looking Ahead To 2019
  4. Wikipedia: Norman Vincent Peale
  5. Microsoft Docs: Overview of the SharePoint Framework
  6. Site: TypeScript
  7. Site: React
  8. Site: npm
  9. Site: gulp
  10. Site: yeoman
  11. Site: webpack
  12. Site: Bitstream Foundry
  13. Site: WordPress
  14. W3C: Cascading Style Sheets
  15. Censornet Report: Your Office 365 Journey: Securing Every Stage
  16. Blog: Ragnar Heil
  17. Company: Censornet
  18. Company: Akumina
  19. Webinar Registration: Modern SharePoint + Akumina EXP = A True Digital Workplace Experience
  20. LinkedIn: David Maffei
  21. Site: SPSEvents.org
  22. Event: Chicago Suburbs M365 2020

The Six Essential Soft Skills for IT Professionals

Not too long ago, I was approached by someone wanting to share some thoughts and information more broadly. After an email conversation with this person, I decided to take a chance and afford her a guest blogger hat.

If you feel particularly moved or inspired by the write-up that follows (regardless of direction), please let me know. If you would like to see more of this type of content, please leave a comment to that effect.

And now I turn things over to our guest writer/blogger, Lisa. Sean out!

The Six Essential Soft Skills for IT Professionals

Having high levels of technical skill in IT is great. In fact, CNBC reports that big companies like Facebook and Google are looking at skills rather than college degrees, which is a big step towards providing opportunities for deserving candidates who can’t afford college tuition.

But in any industry, soft skills are also as necessary as technical skills, since the former can ensure an enjoyable collaboration with your teammates and a better work experience overall. Unfortunately, these skills are often undervalued, and corporations don’t hold as many training seminars on them compared to hard skills. Thus, we’ve compiled a list of soft skills IT professionals should have to interact well with other people and thrive in their career.

Empathy

Often seen as a given attribute, empathy is a social skill that needs to be exercised like any muscle. However, in an era dominated by science, technology, engineering, and mathematics, the importance of social sciences is often overlooked, especially in an increasingly digital world. But make no mistake, Maryville University’s overview of the social sciences highlights how these can empower you to be better at changing society — it’s not just about the tech you build or the tools you use, but on why you do things at all. Social sciences highlight the connections that bind our society together, and help you develop a sense of empathy that will make your work not only valuable for whoever uses it, but also the wider social groups within your team and customer base.

Teamwork

Have you ever heard the phrase “teamwork makes the dream work”? While some IT professionals may prefer to work alone, being able to work well with others and recognize each other’s strengths is a skill that is invaluable in IT. Teamwork fosters a positive environment, and also motivates not just yourself, but the people around you to align with each other and get the ball rolling. After all, behind every successful project is an equally successful team.

Being detail-oriented

In the IT industry (or any industry, for that matter), it pays to be detail-oriented — and in some IT roles, this is a vital skill. This is where you have the ability to repeatedly achieve a level of accuracy, thoroughness, and consistency when doing and accomplishing your tasks. It also means making a conscious effort to understand not just the effects, but the causes of the problems you encounter. As you practice this skill, it will eventually become second nature, and you’ll end up knowing how to pay attention to all the little details without noticing it.

Creativity

Listed by LinkedIn as the number one in-demand soft skill by employers, organizations are looking for creative employees who can build new solutions and provide perspective to the workplace. You may think being creative just means thinking outside the box, but it also manifests in having the enthusiasm to approach new projects in a way that is different than you or others typically would.

Clear communication

Our founder Sean McDonough explains that communication is the most critical skill in everything we do — and this doesn’t just mean having good verbal communication, but also clear and compelling written communication skills. After all, with the sheer number of emails, proposals, and documents you have to go through, being able to communicate with co-workers and clients on what exactly has to happen is crucial.

Negotiation

Last but not least is knowing how to negotiate. When you’re working with clients or even just your boss, sometimes you’ll have to negotiate deadline extensions or even your salary — and knowing how to do this well is an essential skill to achieve a win-win outcome. People with successful negotiation skills often come in with a goal and some persuasive data, along with a ready ear to listen to the other person’s side. That’s because negotiation isn’t just about winning it your way, but about meeting halfway and reaching a compromise.

There’s no better way to start learning these skills than to simply do them. Do your best to communicate clearly with your peers, show empathy in situations, and pay attention to detail. Practice your negotiation skills where possible, and don’t be afraid to show your creativity. When you know how to appreciate and gain these skills, you’ll be fully equipped to stand out as an IT professional.

Written exclusively for SharePointInterface.com
by Lisa Martin

One Tool to Rule Them All

Microsoft released the second iteration of its Page Diagnostics Tool for SharePoint. If you have an SPO site, you NEED this tool in your toolbox!

Last week, on Wednesday, September 18th, 2019, Microsoft released the second iteration of its Page Diagnostics Tool for SharePoint. An announcement was made, and the Microsoft Docs site was updated, but the day passed with very little fanfare in most circles.

“The One Ring” by Mateus Amaral is licensed under CC BY-NC-ND 4.0 

In my opinion, there should have been fireworks. Lots of fireworks.

What is it?

If you’re not familiar with the Page Diagnostics Tool for SharePoint, then I need to share a little history on how I came to be “meet” this tool.

Back in 2018, the SharePoint Conference North America (SPCNA) was rebooted after having been shutdown as part of Microsoft’s consolidation of product-specific conferences a number of years earlier. I had the good fortune of making the cut to deliver a couple of sessions at the conference: “Making the Most of OneDrive for Business and SharePoint Online” and “Understanding and Avoiding Performance Pitfalls with SharePoint Online.”

Sometime in the months leading up to the conference, I received an email from out-of-the-blue from a guy named Scott Stewart – who at the time was a Senior Program Manager for OneDrive and SharePoint Engineering. In the email, Scott introduced himself, what he did in his role, and suggested that we collaborate together for the performance session I was slated to deliver at SPCNA.

I came to understand that Scott and his team were responsible for addressing and remedying many of the production performance issues that arose in SharePoint Online (SPO). The more that Scott and I chatted, the more it sounded like we were preaching many of the same things when it came to performance.

One thing Scott revealed to me was that at the time, his team had been working on a tool to help diagnose SPO performance issues. The tool was projected to be ready around the time that SPCNA was happening, so I asked him if he’d like to co-present the performance session with me and announce the tool to an audience that would undoubtedly be eager to hear the news. Thankfully, he agreed!

The audience for our performance talk at SPCNA 2018

Scott demo’d version one (really it was more like a beta) during our talk, and the demo demons got the better of him … but shortly after the conference, v1.0 of the tool went live and was available to download as a Chrome browser extension.

So, what does it do?

Simply put, the Page Diagnostics Tool for SharePoint analyzes your browser’s interaction with SPO and points out conditions and configurations that might be adversely affecting your page’s performance.

The first version of the tool only worked for classic publishing pages. And as a tool, it was only available as a Google Chrome Extension:

The Page Diagnostics for SharePoint extension in the Google Chrome Store

The second iteration of the tool that was released last Thursday addresses one of those limitations: it analyzes both modern and classic SharePoint pages. So, you’re covered no matter what’s on your SPO site.

What Can the Tool Tell Me?

For one thing, the tool can get you the metrics I’ve highlighted that are relevant to diagnosing basic page performance issues – most notably, SPRequestDuration and SPIisLatency. But it can do so much more than that!

Many of the adverse performance conditions and scenarios I’ve covered while speaking and in blog posts (such as this one here) are analyzed and called-out by the tool, as well as many other things/conditions, such as navigational style used, whether or not content deployment networks (CDNs) are used by your pages, and quite a few more.

And finally, the tool provides a simple mechanism for retrieving round-trip times for pages and page resource requests. It eliminates the need to pull up Fiddler or your browser’s debug tools to try and track down the right numbers from a scrolling list of potentially hundreds of requests and responses.

How Do I Use It?

It’s easy, but I’ll summarize it for you here.

1. Open the Chrome Web Store. Currently, the extension is only available for Google Chrome. Open Chrome and navigate to https://chrome.google.com/webstore/search/sharepoint directly or search for “SharePoint” in the Chrome Web Store. However you choose to do it, you should see the Page Diagnostics Tool for SharePoint entry within the list of results as shown below.

2. Add the Extension to Chrome. Click the Add to Chrome button. You’ll be taken directly to the diagnostic tool’s specific extension page, and then Chrome will pop up a dialog like the one seen below. The dialog will describe what the tool will be able to do once you install it, and yes: you have to click Add Extension to accept what the dialog is telling you and to actually activate the extension in your browser.

3. Navigate to a SharePoint Online page to begin diagnosing it. Once you’ve got the extension installed, you should have the following icon in the tool area to the right of the URL/address bar in Chrome:

To illustrate how the tool works, I navigated to a modern Communication Site in my Bitstream Foundry tenant:

I then clicked on the SharePoint Page Diagnostics Tool icon in the upper right of the browser (as shown above). Doing so brings up the Page Diagnostics dialog and gives me some options:

Kicking off an analysis of the current page is as simple as clicking the Start button as shown above. Once you do so, the page will reload and the Tool dialog will change several times over the course of a handful of seconds based on what it’s loading, analyzing, and attempting to do.

When the tool has completed its analysis and is ready to share some recommendations, the dialog will change once again to show something similar to what appears below.

Right off the bat, you can see that the Page Diagnostics Tool supplies you with important metrics like the SPRequestDuration and SPIIsLatency – two measures that are critical to determining where you might have some slowdown as called out in a previous blog post. But the tool doesn’t stop there.

The tool does many other things – like look at the size of your images, whether or not you’re using structural navigation (because structural navigation is oh so bad for your SPO site performance), if you’re using content delivery networks (CDNs) for frequently used scripts and resources, and a whole lot more.

Let’s drill into one of the problem items it calls out on one of my pages:

The tool explains to me, in plain English, what is wrong: Large images detected. An image I’m using is too large (i.e., larger than 300KB). It supplies the URL of the image in question so that I’m not left wondering which image it’s calling out. And if I want to know why 300KB is special or simply learn about the best way to handle images in SharePoint Online, there’s a Learn More link. Clicking that link takes me to this page in Microsoft Docs:

Targeted and detailed guidance – exactly what you need in order to do some site fixup/cleanup in the name of improving performance.

Wrapping-Up

There’s more that the tool can do – like provide round trip times for pages and assets within those pages, as well as supply a couple of data export options if you want to look at the client/server page conversation in a tool that has more capabilities.

As a one-stop shop tool, though, I’m going to basically start recommending that everyone with an SPO site start downloading the tool for use within their own tenants. There is simply no other tool that is easier and more powerful for SharePoint Online sites. And the price point is perfect: FREE!

The next time you see Scott Stewart, buy him a beer to thank him for giving us something usable in the fight against poorly performing SPO sites.

References and Resources

  1. Company: Microsoft
  2. Browser Extension: Page Diagnostics for SharePoint
  3. Microsoft Docs: Use the Page Diagnostics for SharePoint tool
  4. Conference: The SharePoint Conference North America
  5. Presentation Resource: Making the Most of OneDrive for Business and SharePoint Online
  6. Presentation Resource: Understanding and Avoiding Performance Pitfalls with SharePoint Online
  7. LinkedIn: Scott Stewart
  8. Blog Post: The Five-Minute Page Performance Troubleshooting Guide for SharePoint Online
  9. Blog Post: Caching, You Ain’t No Friend of Mine
  10. Tool: Telerik Fiddler
  11. Web Page: Chrome Web Store Extensions
  12. Microsoft Docs: Optimize images in SharePoint Online modern site pages

Running As Administrator All The Time.

In this post, I review the process of creating Taskbar and Start Menu shortcuts that automatically “Run as Administrator” with a left-click or two.

UPDATE (6/9/2019): Jonathan Mast, who happens to be a pretty sharp guy and friend of mine, saw this post and enlightened me with another tip (which I've tried and verified). If you want to launch an application as an Administrator, you can also press <CTRL><SHIFT> while left-clicking the shortcut. Microsoft officially lists this shortcut among its list of Taskbar keyboard shortcuts here. It just so happens that Jonathan now works for Microsoft!

This post is nothing earth-shattering, and my only hope is that it exposes a person or two to a less-than-obvious technique that might yield some incremental time savings when building shortcuts.

I was building some virtual machines the other day, and I was dropping shortcuts onto the Windows Start Menu and the Windows Taskbar with abandon. Creating shortcuts is relatively easy, but I wanted the applications associated with the shortcuts to run with Administrator privileges.

To launch an application from an associated shortcut, we typically do one of the following:

  • Single left-click an application shortcut icon (for applications on the Start Menu or Taskbar)
  • Double left-click an application shortcut icon (in the case of a desktop application shortcuts)

We’ve been doing this for decades now to execute an application. But when we want to launch an application within the security context of an account with Administrator rights, we’ve got to do that right-click thing to select “Run as Administrator” from the list of menu options we’re presented with. It’s a trivial step, I know, but it’s annoying as all get out. My index finger wants to do the clicking, dammit …

Well, there’s a better way to handle this situation. Wouldn’t you like to set up your Start Menu and Taskbar shortcuts to automatically “Run as Administrator” whenever you launch them in the standard left-click (or left double-click) fashion?

The Task at Hand

This is actually relatively easy to do, but I’m sure that there are at least a few out there for whom this will be new knowledge.

For Taskbar-pinned application shortcuts that you always want to launch with Administrator privileges, perform the initial right-click that you normally would to select “Run as Administrator” as demonstrated in the image above and to the right for the Windows PowerShell icon I have pinned to my Taskbar. Instead of clicking “Run as Administrator” as is normally the case, right-click again on the name of the application you want to set up to run in the context of the Administrator account.

In the case of my example, that’s Windows PowerShell. So, I’d right-click once to open the context-sensitive menu seen above, and then I’d right click the “Windows PowerShell” option to open the second context-sensitive menu seen on the left.

Upon selecting “Properties” with a left-click from the second context sensitive window shown above and to the left, the Properties dialog box would appear for the application (as shown below).

Upon seeing this dialog box, you should left-click the “Advanced …” button that appears approximately 2/3 of the way down the dialog on the right. When you click that the “Advanced …” button, you’ll see an “Advanced Properties” dialog open as seen below.

At this point, simply click on the “Run as administrator” checkbox and click the “OK” button on all of the open dialogs to apply your changes. From this point forward, whenever you left-click on the Taskbar shortcut you’ve just configured, the associated application will launch in the context of the Administrator account!

What About Start Menu Items?

Setting up Start Menu shortcuts to “Run as Administrator” is really just a variation on the theme we’ve already established. As with the Taskbar shortcuts, we begin by right-clicking the desired shortcut. In this example, I’m going to use  “.Net Reflector 9.0” shortcut:

After the first right-click, I then hover over or expand the “More” menu item and select the “Open file location” option:

This will open Windows Explorer to the location in the local file system of the shortcut we’re interested in configuring.

From this point onward, it’s the same as it was with the Taskbar shortcuts. Simply click the “Advanced…” button and check the “Run as Adminstrator” box for the shortcut to have the associated application launch in the Administrator context.

Wrap-up

This post wasn’t rocket science, but when I was reminded of the shortcut configuration process (by the recent creation of a new batch of SharePoint 2019 VMs and all of their shortcuts), I figured sharing it out might help a person or two. And after all, that’s what it’s all about! Besides, it gave me the chance to write something up, so I consider it an all-around win. I hope that you feel the same way

 

My Foray Into Office Feng Shui

Sometimes reorganizing a space, like a home office, generates greater benefits than just a more organized space.

Just to level-set at the start: this is not a technical post, and I’m talking about my personal office – not Microsoft Office. Now, with those disclaimers out of the way …

What Exactly Am I Writing About?

When we moved into our current home six or seven years ago, one thing I felt I needed was a proper office. In our old house, I worked out of our unfinished basement, and I’ll be honest: it was depressing. Despite my attempts to “liven up the place” with things like Christmas lights, the only natural light I received while working was provided by three small glass block windows.

And when I say the basement was “unfinished,” I really mean it. Through sheer dumb luck, the table I worked at was also the location of some sort of recessed drain access in the cement floor. I managed to get my office chair wheels stuck in that recess about half a dozen times a day. My chair would nearly tip over whenever that happened.

I think the image I’m painting is bleak enough. I’ll spare you from additional details, like when our sewer line collapsed and the resulting back-up invaded my “workplace.”

I Needed A Proper Office

Hopefully that point is obvious.

The criteria I had when we were looking for a new house six or seven years ago was an office that (a) was at ground level (or higher), and (b) had a proper window. Nothing too excessive, and easily met by my current office.

Below are some images of how my office was set up when we first moved in. Many people say it kind of looks like a college dorm room with the Christmas lighting – a point I can’t argue against.

This configuration worked well enough for a while, but over time I grew more and more dissatisfied with it for the following reasons:

  1. I didn’t make particularly good use of the space I had … and over time, piles grew on every exposed surface.
  2. I used the filing cabinet (it came with the house), but I hated the filing cabinet and the way it jutted out into the room.
  3. My wife regularly registered grievances with the one-off, mismatched furniture. And she hated all the cords everywhere. And the fact that my lighting choices were circa 1995.

Why Did I Do It That Way In The First Place?

If you’re asking that question, it’s a good one. The reason, quite simply, was time. The week that we moved into our home was also the week my wife went in for breast cancer surgery. After the surgery came chemotherapy and then radiation treatments. If you’ve never been with someone going through cancer treatment, then I’ll give you the short version: it knocks them on their ass.

Brendan and Sabrina: Easter 2012

Our children were only about five at the time, and they were still in daycare on the west side of Cincinnati – a good 30-40 minutes away. So, with my wife out of commission, I’d have to run them to daycare in the morning, come back, and then do the reverse in the evening. Between taking care of the family and trying to find time to work, reorganizing my office was the last thing I had on my mind.

But redoing my office was a topic that kept coming up again and again. And so at the start of 2019, with encouragement from my wife, I decided it was finally time to do something.

Office 2.0: The Plan

About the only aspect of my office that I really liked and wanted to keep was the Ikea furniture that I purchased and put together just before we moved in (a desk and a corner table).

Step one of “my plan” was to start getting rid of a lot of old books and associated materials. Technology consulting is a brutal field to be in from the perspective of trying to stay up-to-date on changes and new trends. Most of the books on my shelves weren’t just old, they were ancient.

For example, as much as I loved Practical Standards for Microsoft Visual Basic, it was published about 20 years ago. The things I learned from reading it are still applicable today in slightly modified form (lots of good information/guidance on code readability, documentation, etc), but extended support on VB6 ended in 2008 – over ten years ago.

I ended up getting rid of most of the books I’d bought and inherited over the years. Any that other authors and friends had signed were spared (couldn’t let those go!), as were copies of books that John Ferringer and I co-authored. Other than those that met the narrow range of criteria, any books that were clearly out-of-date were expunged.

With the books gone, I was able to start removing the ugly bookshelves. In truth, it wasn’t a seamless process by any stretch. I had to stage a lot of my office content in the entryway and living room just so I had room to maneuver and manipulate the office space.

Rebuilding from the Ashes

No fires were set; I’m speaking metaphorically when I say “ashes.”

With the old bookshelves gone, I was able to put in new ones that did a much better job utilizing my limited office space. And I was also able to address one of my wife’s standing grievances; i.e., that nothing (or very little) in my office matched.

I again decided to look for bookshelves on Ikea’s site (since my computer desk and corner table were of Ikea design), and I landed on the Brimnes Bookcase. By my rough math, I could get four of them in the office, they were available in black, and I thought they’d work equally well for both books and storage.

When my wife and I got to the Ikea store in West Chester, though, Ikea only had two of the four bookcases in stock that I had come to pick up (despite me doing an inventory check before coming up and successfully purchasing four for pickup). So the remaining two bookshelves were delivered about a week after I got the first two, and I got to work on the two bookcases I had once we got home:

Below is a comparison of the front of my office both with and without the new Brimnes bookcases. I could have used a little more clearance on the sides of the bookcases nearest the office doors, but things went in pretty well.

Let There Be Light!

There were two more things I was hoping to achieve with my office reorg. One of them was being able to finally have some clear desk space, because I always had junk galore on every surface. I didn’t want to keep things that way indefinitely, but I simply had no place to put everything with the old office.

Once I had a place for everything in my office (and quite a bit of extra space, actually), then I should be able to adhere to a “clean desk policy” – or as close as I could get to it – with a little discipline. And I’m happy to report that I’ve largely been able to do that.

The other thing I wanted to do was “grow up” a little bit – at least with my lighting. I am in my mid-to-late 40’s, so I figured it was high time I upped my lighting game.

The immediate problem was that I really still loved multicolor lighting! With some hunting, I managed to find something that nailed my needs straightaway in a very adult/grown-up fashion: Philips Hue Lighting.

Hue Lighting is incredibly flexible. I opted for the bulbs and system that supports changing colors, and it’s wonderful. Let me be clear about an important fact, though: Hue is NOT cheap. It seemed that the cheapest way to buy a bunch of bulbs was to buy a few starter kits, so I have a couple of extra lighting bridges (to tie the lighting into the home wifi) I’m not currently using. If my existing Hue bridge ever goes south, I have a couple of backups.

Since Hue ties into Alexa, I control everything from the Amazon Echo devices we have in nearly every room. And the Hue App for smartphones makes editing lighting configurations easy – and comes with some defaults that produce nice results regardless of the number of Hue bulbs you might have active in the room.

The Results

Below are some office shots with all the bookshelves in place and nearly everything the way I wanted it. Even though I’ve got my lights turned on, these were taken during the day.

To see the true effects of the Hue colored lights, I had to take some night shots:

The last three shots in the series immediately above are of the same office corner; the only real difference is the Hue lighting preset I activated in the system before taking the shots.

Conclusions

In addition to now having an office that fits me better, I discovered a thing or two I really wasn’t expecting as I undertook the overhauling and process:

  1. For me, a cluttered office contributes strongly to my feeling of being unorganized. When I started clearing my desk off and putting things away more regularly, I felt much more “with it.” The effect was almost tangible in a way I never would have expected.
  2. Having room to actually put things away is important to maintaining control over your office environment. Heck, I would argue that addage is true in most rooms and environment. The saying “out of sight, out of mind” holds its weight for me.

Now that I’ve had my office squared away for a few months, I’ve begun the process of organizing the unfinished part of the basement which acts as my server room and hardware workshop. That area needs organization probably worse than my office ever did … but I’ll save that for another time and another post.

References and Resources

  1. Book: Practical Standards for Microsoft Visual Basic
  2. Microsoft: Search Product Lifecycle
  3. LinkedIn: John Ferringer
  4. Ikea: Brimnes Bookcase
  5. Product: Philips Hue Lighting
  6. Amazon: Philips Hue Starter Kit

Obtaining Performance Metrics for SharePoint Online Modern Pages

In this post, I’ll show you how to obtain page performance core metrics from Modern SharePoint Online pages. It’s easier and more reliable than trying to obtain the same data from classic pages.

Background

It was quite some time ago that I wrote my Five-Minute Page Performance Troubleshooting Guide for SharePoint Online – a little over a year-and-a-half ago, actually. Since that time, SharePoint Online (SPO) has continued to evolve relentlessly. In fact, one slide I’ve gotten into the habit of showing during my SPO talks and presentations is the following:

FiveYearWarning

The slide usually gets the desired response of laughter from attendees, but it’s something I feel I have to say … because like so many things that seem obvious, there’s some real life basis for the inclusion of the slide:

OldPost

The exchange shown above was the result of someone commenting on a post I had shared about limitations I was running into with the SharePoint App Model. The issue didn’t have a solution or workaround at the time I’d written my post, but Microsoft had addressed it sometime later.

BestBeforeDateThis brief exchange highlights one of the other points I try hard to make while speaking: PAY ATTENTION TO DATES! It’s not safe to assume (if it ever was) that something you read online will stay accurate and/or relevant indefinitely.

In any case, I realize that much of what I share has a “born on date,” for lack of a better label. I’ll continue to share information; just note when something was written.

End of (slight) rant. Back to the real topic of this post.

Modern Pages

Since I had written the previous performance article, Microsoft’s been working hard to complete the transition to Modern SharePoint in SPO. I feel it’s a solid move on their part for a variety of reasons. Modern pages (particularly pages in communication sites) are much more WYSIWYG in nature, and SharePoint Framework (SPFx) web parts on modern pages make a whole lot of sense from a scalability perspective; after all, why assume load on the server (with classic web parts) when you can push the load to the client and use all the extra desktop/laptop power?

As good as they are, though, modern pages don’t obey the standard response header approach to sharing performance metrics. But not to worry: they do things more consistently and reliably (in my opinion).

Performance on a Modern Page

SPRequestDuration (the amount of time the server spent processing the page request) and (SP)IISLatency (the amount of time the page request waited on the server before getting processed) are critical to know when trying to diagnose potential page performance issues. Both of these are reported in milliseconds and give us some insight into what’s happening on the server-side of the performance equation.

Instead of trying to convey these values with response headers (as classic pages do – most of the time), modern pages share the same data within the body of the page itself.

Consider the following page modern page:

PerfPage

If this were a classic publishing page and we wanted to get the (SP)IISLatency and SPRequestDuration, we’d need to use our browser’s <F12> dev tools or something like Fiddler.

For modern pages, things are easier. We turn instead to the page source – not the response headers. Grab the page source (by right-clicking and selecting View page source) …

PerfPageSource

… and you’ll see something like the following:

SourceMetrics

Now, I’ll be the first to admit that you’ve got to have some sense of what you’re seeking within the page source – there’s a lot of stuff to parse through. Doing a simple <CTRL><F> search for iislatency or requestduration will land you on the content of interest. We’re interested in the metrics reported within the perf section:

PerfUpClose

The content of interest will be simple text, but the text is a JSON object that can be crunched to display values that are a bit easier to read:

Metrics

The other thing you’ll notice is that a lot of additional metrics are reported along with the page processing metrics we’ve been looking at. In a future post, I’ll try to break some of these down for you.

Conclusion

“Modern” is the future of SharePoint Online. If you haven’t yet embraced modern lists and pages, consider dipping your toe in the waters. As we’ve seen in this post, Modern also makes it easier to obtain performance metrics for our pages – something that will make page performance troubleshooting significantly more predictable and consistent.

References and Resources

  1. Blog Post: Five Minute Page Performance Troubleshooting Guide for SharePoint Online
  2. Office.com: SharePoint Classic and Modern Experiences
  3. Office.com: What Is A SharePoint Communication Site?
  4. Microsoft.com: Overview of the SharePoint Framework
  5. MDN: Response Header
  6. Telerik: Fiddler
  7. JSON Viewer: Code Beautify

Threatening Outlook to Restore Drag-and-Drop Functionality

Have you ever experienced a loss of drag-and-drop functionality with the Microsoft Outlook client? If so, I might have a solution …

Yes, that’s right. I said threaten Outlook.

Angry Woman
Don’t make me come over there, Outlook …

I’m not a violent person, but I can become rather … colorful … when my drag-and-drop functionality stops working. And when that happens, I know how to threaten Microsoft Outlook to restore it.

Let me back up for a second and ask: have you ever been clicking away inside of Outlook, reading messages, cutting through email and discovered that drag-and-drop functionality had stopped working? If you’re like me, I receive tons of email each day. I count on being able to use drag-and-drop to move things out of my inbox and into designated folders so that I can retain what little sanity I have left.

My typical email triage routine entails me reading new messages in my inbox, determining if I can address or somehow close out whatever is being asked of me within the email, and then shuttling the email to a folder for future reference. That “shuttling” part, for me, depends on drag-and-drop functionality.

Microsoft Outlook normally works fine for me (we’re buddies), but every now and then something happens and drag-and-drop stops working. For instance, I’m trying to drag an email message into a folder and Outlook simply doesn’t comply with my orders. Maybe the mouse cursor changes to let me think I’m dragging-and-dropping, but in reality the message movement never happens.  The email remains in my inbox, and I’m left without an expedient way to organize messages.

I discovered, quite by accident, that there was a way to fix the problem – to restore drag-and-drop capability to Outlook. What is the way, you ask?

Well, I say give it the three-finger salute. Yes, that’s right: <CTRL><ALT><DEL>!

I don’t exactly understand the mechanic myself, but the <CTRL><ALT><DEL> sequence seems to do something to get drag-and-drop back to a functional state.

DragAndDrop

I thought I was crazy when I encountered this and that the usefulness of this information might be limited to just me, but my wife convinced me otherwise. She was banging her head against the same drag-and-drop problem I had, and simply hitting <CTRL><ALT><DEL> fixed it for her, as well.

I want to be clear here: I’m not advocating for a <CTRL><ALT><DEL> to reboot your system, or anything like that. I jokingly say that we’re threatening to reboot. Simply press the three keys, and then cancel out of the screen that appears. No logging out, and no launching into Task Manager required.

If you depend on drag-and-drop in Outlook like I do, and you find this trick works for you, please leave me a comment or let me know. I’d like to get an idea of how widespread this problem is so that I can give some feedback to Microsoft.

Good luck!

%d bloggers like this: