SPFest and SPO Performance
In this brief post, I talk about my first in-person event (SPFest Chicago) since COVID hit. I also talk about and include a recent interview with the M365 Developer Podcast.
In this brief post, I talk about my first in-person event (SPFest Chicago) since COVID hit. I also talk about and include a recent interview with the M365 Developer Podcast.
As someone who spends most days working with (and thinking about) SharePoint, there’s one thing I can say without any uncertainty or doubt: Microsoft Teams has taken off like a rocket bound for low Earth orbit. It’s rare these days for me to discuss SharePoint without some mention of Teams.
I’m confident that many of you know the reason for this. Besides being a replacement for Skype, many of Teams’ back-end support systems and dependent service implementations are based in – you guessed it – SharePoint Online (SPO).
As one might expect, any technology product that is rapidly evolving and seeing adoption by the enterprise has gaps that reveal themselves and imperfect implementations as it grows – and Teams is no different. I’m confident that Teams will reach a point of maturity and eventually address all of the shortcomings that people are currently finding, but until it does, there will be those of us who attempt to address gaps we might find with the tools at our disposal.
One of those Teams pain points we discussed recently on the Microsoft Community Office Hours webcast was the challenge of changing ownership for a large numbers of Teams at once. We took on a question from Mark Diaz who posed the following:
May I ask how do you transfer the ownership of all Teams that a user is managing if that user is leaving the company? I know how to change the owner of the Teams via Teams admin center if I know already the Team that I need to update. Just consulting if you do have an easier script to fetch what teams he or she is an owner so I can add this to our SOP if a user is leaving the company.
Mark Diaz
We discussed Mark’s question (amidst our normal joking around) and posited that PowerShell could provide an answer. And since I like to goof around with PowerShell and scripting, I agreed to take on Mark’s question as “homework” as seen below:
The rest of this post is my direct response to Mark’s question and request for help. I hope this does the trick for you, Mark!
Anyone who has spent any time as an administrator in the Microsoft ecosystem of cloud offerings knows that Microsoft is very big on automating administrative tasks with PowerShell. And being a cloud workload in that ecosystem, Teams is no different.
Microsoft Teams has it’s own PowerShell module, and this can be installed and referenced in your script development environment in a number of different ways that Microsoft has documented. And this MicrosoftTeams module is a prerequisite for some of the cmdlets you’ll see me use a bit further down in this post.
The MicrosoftTeams module isn’t the only way to work with Teams in PowerShell, though. I would have loved to build my script upon the Microsoft Graph PowerShell module … but it’s still in what is termed an “early preview” release. Given that bit of information, I opted to use the “older but safer/more mature” MicrosoftTeams module.
Let me just cut to the chase. I put together my ReplaceTeamOwners.ps1 script to address the specific scenario Mark Diaz asked about. The script accepts a handful of parameters (this next bit lifted straight from the script’s internal documentation):
.PARAMETER currentTeamOwner A string that contains the UPN of the user who will be replaced in the ownership changes. This property is mandatory. Example: bob@EvilCorp.com .PARAMETER newTeamOwner A string containing the UPN of the user who will be assigned at the new owner of Teams teams (i.e., in place of the currentTeamOwner). Example jane@AcmeCorp.com. .PARAMETER confirmEachUpdate A switch parameter that if specified will require the user executing the script to confirm each ownership change before it happens; helps to ensure that only the changes desired get made. .PARAMETER isTest A boolean that indicates whether or not the script will actually be run against and/or make changes Teams teams and associated structures. This value defaults to TRUE, so actual script runs must explicitly set isTest to FALSE to affect changes on Teams teams ownership.
So both currentTeamOwner and newTeamOwner must be specified, and that’s fairly intuitive to understand. If the -confirmEachUpdate switch is supplied, then for each possible ownership change there will be a confirmation prompt allowing you to agree to an ownership change on a case-by-case basis.
The one parameter that might be a little confusing is the script’s isTest parameter. If unspecified, this parameter defaults to TRUE … and this is something I’ve been putting in my scripts for ages. It’s sort of like PowerShell’s -WhatIf switch in that it allows you to understand the path of execution without actually making any changes to the environment and targeted systems/services. In essence, it’s basically a “dry run.”
The difference between my isTest and PowerShell’s -WhatIf is that you have to explicitly set isTest to FALSE to “run the script for real” (i.e., make changes) rather than remembering to include -WhatIf to ensure that changes aren’t made. If someone forgets about the isTest parameter and runs my script, no worries – the script is in test mode by default. My scripts fail safe and without relying on an admin’s memory, unlike -WhatIf.
And now … the script!
<# .SYNOPSIS This script is used to replace all instances of a Teams team owner with the identity of another account. This might be necessary in situations where a user leaves an organization, administrators change, etc. .DESCRIPTION Anytime a Microsoft Teams team is created, an owner must be associated with it. Oftentimes, the team owner is an administrator or someone who has no specific tie to the team. Administrators tend to change over time; at the same time, teams (as well as other IT "objects", like SharePoint sites) undergo transitions in ownership as an organization evolves. Although it is possible to change the owner of Microsoft Teams team through the M365 Teams console, the process only works for one site at a time. If someone leaves an organization, it's often necessary to transfer all objects for which that user had ownership. That's what this script does: it accepts a handful of parameters and provides an expedited way to transition ownership of Teams teams from one user to another very quickly. .PARAMETER currentTeamOwner A string that contains the UPN of the user who will be replaced in the ownership changes. This property is mandatory. Example: bob@EvilCorp.com .PARAMETER newTeamOwner A string containing the UPN of the user who will be assigned at the new owner of Teams teams (i.e., in place of the currentTeamOwner). Example jane@AcmeCorp.com. .PARAMETER confirmEachUpdate A switch parameter that if specified will require the user executing the script to confirm each ownership change before it happens; helps to ensure that only the changes desired get made. .PARAMETER isTest A boolean that indicates whether or not the script will actually be run against and/or make changes Teams teams and associated structures. This value defaults to TRUE, so actual script runs must explicitly set isTest to FALSE to affect changes on Teams teams ownership. .NOTES File Name : ReplaceTeamsOwners.ps1 Author : Sean McDonough - sean@sharepointinterface.com Last Update: September 2, 2020 #> Function ReplaceOwners { param( [Parameter(Mandatory=$true)] [String]$currentTeamsOwner, [Parameter(Mandatory=$true)] [String]$newTeamsOwner, [Parameter(Mandatory=$false)] [Switch]$confirmEachUpdate, [Parameter(Mandatory=$false)] [Boolean]$isTest = $true ) # Perform a parameter check. Start with the site spec. Clear-Host Write-Host "" Write-Host "Attempting prerequisite operations ..." $paramCheckPass = $true # First - see if we have the MSOnline module installed. try { Write-Host "- Checking for presence of MSOnline PowerShell module ..." $checkResult = Get-InstalledModule -Name "MSOnline" if ($null -ne $checkResult) { Write-Host " - MSOnline module already installed; now importing ..." Import-Module -Name "MSOnline" | Out-Null } else { Write-Host "- MSOnline module not installed. Attempting installation ..." Install-Module -Name "MSOnline" | Out-Null $checkResult = Get-InstalledModule -Name "MSOnline" if ($null -ne $checkResult) { Import-Module -Name "MSOnline" | Out-Null Write-Host " - MSOnline module successfully installed and imported." } else { Write-Host "" Write-Host -ForegroundColor Yellow " - MSOnline module not installed or loaded." $paramCheckPass = $false } } } catch { Write-Host -ForegroundColor Red "- Unexpected problem encountered with MSOnline import attempt." $paramCheckPass = $false } # Our second order of business is to make sure we have the PowerShell cmdlets we need # to execute this script. try { Write-Host "- Checking for presence of MicrosoftTeams PowerShell module ..." $checkResult = Get-InstalledModule -Name "MicrosoftTeams" if ($null -ne $checkResult) { Write-Host " - MicrosoftTeams module installed; will now import it ..." Import-Module -Name "MicrosoftTeams" | Out-Null } else { Write-Host "- MicrosoftTeams module not installed. Attempting installation ..." Install-Module -Name "MicrosoftTeams" | Out-Null $checkResult = Get-InstalledModule -Name "MicrosoftTeams" if ($null -ne $checkResult) { Import-Module -Name "MicrosoftTeams" | Out-Null Write-Host " - MicrosoftTeams module successfully installed and imported." } else { Write-Host "" Write-Host -ForegroundColor Yellow " - MicrosoftTeams module not installed or loaded." $paramCheckPass = $false } } } catch { Write-Host -ForegroundColor Yellow "- Unexpected problem encountered with MicrosoftTeams import attempt." $paramCheckPass = $false } # Have we taken care of all necessary prerequisites? if ($paramCheckPass) { Write-Host -ForegroundColor Green "Prerequisite check passed. Pressto continue." Read-Host } else { Write-Host -ForegroundColor Red "One or more prerequisite operations failed. Script terminating." Exit } # We can now begin. First step will be to get the user authenticated to they can actually # do something (and we'll have a tenant context) Clear-Host try { Write-Host "Please authenticate to begin the owner replacement process." $creds = Get-Credential Write-Host "- Credentials gathered. Connecting to Azure Active Directory ..." Connect-MsolService -Credential $creds | Out-Null Write-Host "- Now connecting to Microsoft Teams ..." Connect-MicrosoftTeams -Credential $creds | Out-Null Write-Host "- Required connections established. Proceeding with script." # We need the list of AAD users to validate our target and replacement. Write-Host "Retrieving list of Azure Active Directory users ..." $currentUserUPN = $null $currentUserId = $null $currentUserName = $null $newUserUPN = $null $newUserId = $null $newUserName = $null $allUsers = Get-MsolUser Write-Host "- Users retrieved. Validating ID of current Teams owner ($currentTeamsOwner)" $currentAADUser = $allUsers | Where-Object {$_.SignInName -eq $currentTeamsOwner} if ($null -eq $currentAADUser) { Write-Host -ForegroundColor Red "- Current Teams owner could not be found in Azure AD. Halting script." Exit } else { $currentUserUPN = $currentAADUser.UserPrincipalName $currentUserId = $currentAADUser.ObjectId $currentUserName = $currentAADUser.DisplayName Write-Host " - Current user found. Name='$currentUserName', ObjectId='$currentUserId'" } Write-Host "- Now Validating ID of new Teams owner ($newTeamsOwner)" $newAADUser = $allUsers | Where-Object {$_.SignInName -eq $newTeamsOwner} if ($null -eq $newAADUser) { Write-Host -ForegroundColor Red "- New Teams owner could not be found in Azure AD. Halting script." Exit } else { $newUserUPN = $newAADUser.UserPrincipalName $newUserId = $newAADUser.ObjectId $newUserName = $newAADUser.DisplayName Write-Host " - New user found. Name='$newUserName', ObjectId='$newUserId'" } Write-Host "Both current and new users exist in Azure AD. Proceeding with script." # If we've made it this far, then we have valid current and new users. We need to # fetch all Teams to get their associated GroupId values, and then examine each # GroupId in turn to determine ownership. $allTeams = Get-Team $teamCount = $allTeams.Count Write-Host Write-Host "Begin processing of teams. There are $teamCount total team(s)." foreach ($currentTeam in $allTeams) { # Retrieve basic identification information $groupId = $currentTeam.GroupId $groupName = $currentTeam.DisplayName $groupDescription = $currentTeam.Description Write-Host "- Team name: '$groupName'" Write-Host " - GroupId: '$groupId'" Write-Host " - Description: '$groupDescription'" # Get the users associated with the team and determine if the target user is # currently an owner of it. $currentIsOwner = $null $groupOwners = (Get-TeamUser -GroupId $groupId) | Where-Object {$_.Role -eq "owner"} $currentIsOwner = $groupOwners | Where-Object {$_.UserId -eq $currentUserId} # Do we have a match for the targeted user? if ($null -eq $currentIsOwner) { # No match; we're done for this cycle. Write-Host " - $currentUserName is not an owner." } else { # We have a hit. Is confirmation needed? $performUpdate = $false Write-Host " - $currentUserName is currently an owner." if ($confirmEachUpdate) { $response = Read-Host " - Change ownership to $newUserName (Y/N)?" if ($response.Trim().ToLower() -eq "y") { $performUpdate = $true } } else { # Confirmation not needed. Do the update. $performUpdate = $true } # Change ownership if the appropriate flag is set if ($performUpdate) { # We need to check if we're in test mode. if ($isTest) { Write-Host -ForegroundColor Yellow " - isTest flag is set. No ownership change processed (although it would have been)." } else { Write-Host " - Adding '$newUserName' as an owner ..." Add-TeamUser -GroupId $groupId -User $newUserUPN -Role owner Write-Host " - '$newUserName' is now an owner. Removing old owner ..." Remove-TeamUser -GroupId $groupId -User $currentUserUPN -Role owner Write-Host " - '$currentUserName' is no longer an owner." } } else { Write-Host " - No changes in ownership processed for $groupName." } Write-Host "" } } # We're done let the user know. Write-Host -ForegroundColor Green "All Teams processed. Script concluding." Write-Host "" } catch { # One or more problems encountered during processing. Halt execution. Write-Host -ForegroundColor Red "-" $_ Write-Host -ForegroundColor Red "- Script execution halted." Exit } } ReplaceOwners -currentTeamsOwner bob@EvilCorp.com -newTeamsOwner jane@AcmeCorp.com -isTest $true -confirmEachUpdate
Don’t worry if you don’t feel like trying to copy and paste that whole block. I zipped up the script and you can download it here.
I like to make an admin’s life as simple as possible, so the first part of the script (after the comments/documentation) is an attempt to import (and if necessary, first install) the PowerShell modules needed for execution: MSOnline and MicrosoftTeams.
From there, the current owner and new owner identities are verified before the script goes through the process of getting Teams and determining which ones to target. I believe that the inline comments are written in relatively plain English, and I include a lot of output to the host to spell out what the script is doing each step of the way.
The last line in the script is simply the invocation of the ReplaceOwners function with the parameters I wanted to use. You can leave this line in and change the parameters, take it out, or use the script however you see fit.
Here’s a screenshot of a full script run in my family’s tenant (mcdonough.online) where I’m attempting to see which Teams my wife (Tracy) currently owns that I want to assume ownership of. Since the script is run with isTest being TRUE, no ownership is changed – I’m simply alerted to where an ownership change would have occurred if isTest were explicitly set to FALSE.
So there you have it. I put this script together during a relatively slow afternoon. I tested and ensured it was as error-free as I could make it with the tenants that I have, but I would still test it yourself (using an isTest value of TRUE, at least) before executing it “for real” against your production system(s).
And Mark D: I hope this meets your needs.
In this post, I cover the re-ignition of Bitstream Foundry’s fires and spend some time reflecting upon the principles that guide me in my day-to-day dealings with people.
As many of you know, last October I joined the PAIT Group as their Chief Technology Officer. The decision to join PAIT wasn’t one that came about quickly. My friend of many years Mark Rackley (you might know him as “The SharePoint Hillbilly”) and I had been involved in a couple of different discussions over a period of time … but the actual decision to join PAIT came after a series of discussions at last year’s Microsoft Ignite conference.
The idea of joining PAIT and being able to both work with friends (Mark and Stephanie Donahue) and refocus on SharePoint was the breath of fresh air I needed at the time … and once again I found some excitement and genuine happiness in the work I was doing – and in the people with whom I was interacting on a daily basis.
Things went pretty well for a while, but sometimes even friends who start with the best of intentions find that different styles, approaches, experiences, and value systems don’t always mesh the way they would like. And businesses sometimes have influencers and drivers that remain “behind the scenes” but still wield a heavy hammer in day-to-day operations and long-term strategy.
Stephanie, Mark, and I remain friends … and the desire to remain friends was the most important and overriding aspect at the end of the day. I truly wish the two of them the best of luck in everything they do. They’re top-notch SharePoint professionals, and I have a great deal of respect for both of them. And they’re still my friends, and I’ll continue to do anything I can to help them personally in their endeavors. I don’t want our parting to impact the friendships we share.
After learning of my separation from PAIT Group, the first feelings to hit me last Thursday were shock and uncertainty. I have a wife and two kids, and I’m the primary “breadwinner” for my family. Suddenly finding myself without gainful employment created a tremendous amount of stress in the immediate sense. Anytime I’d parted with an employer in the past, I had been a part of the decision – or at least a part of the discussion that led to the outcome. This time proved to be a first for me, and I’m not going to lie: I was initially scared.
Once the shock and fear subsided, I set about figuring out what to do next. Since my timetable was short, I decided to go with the “fallback” plan I’d always had the foresight to maintain: to brush the dust off of Bitstream Foundry LLC and rev things back up.
I’ve always kept my LLC in-order, kept my insurance (Business Liability and Errors & Omissions policies) paid and up-to-date, and tried to keep material related to my company current. Truth be told, I still have some work to do on that last one (I’ve spent a chunk of time this weekend updating social profiles and getting other public-facing items in order), and I still need to both migrate my company’s site and update its content.
More important than any other “get ready” aspect, though, was something else that settled over me in a somewhat unexpected way.
When I made my initial round of social and professional networking profile changes late last week to reflect the move back to Bitstream Foundry, I was immediately deluged on all channels of communication from my friends and business contacts across the SharePoint space. The outpouring was immediate, overwhelming and … extremely humbling. I was dumbstruck.
Within the space of less than 36 hours, I had no fewer than a dozen different collaboration opportunities – including a number of requests for SOWs (statements of work), some partnership and referral offers, and more. I was stunned. Simply stunned.
And that brings me to the topic of community. The SharePoint Community is like no other community I’ve ever been involved with. It’s vibrant, full of wonderful people, and chock full of life and energy. Every time I speak at a conference or present for a SPUG, I leave the event “charged” and wanting to do more.
I’ve been involved in the SharePoint Community since 2004, and I’ve actively been giving back to the community since 2009. Giving back is important to me, because I’ve benefited tremendously from knowledge that many of you have openly shared. Sharing what I know has been the right thing to do, as well, and I’ve worked to make all of my conference materials, presentations, workshops, development projects, and other efforts freely available to all.
I feel fortunate to be a part of this community, and I am so tremendously grateful for the relationships and friendships that I’ve built with many of you over the years. Simply put: you folks are awesome.
Anytime life throws me a curveball, I try to take a step back and reflect on what I’ve learned, where I’ve made mistakes, and where things have gone well. Given that I’m in the middle of another tectonic shift in my professional career, it seemed like a good time to conduct another review.
In thinking about the last six months (recent history) and the last eight years (a bit longer), I would say that I’ve tried very hard to operate according to the following principles:
Tomorrow starts Bitstream Foundry’s first week of being “back in business,” and I’m ready to jump into it. I still have a lot of things to get done to get back into “fighting shape,” but I’m looking forward to the challenge.
In the meantime, please don’t hesitate to reach out to me if you think that I may be of assistance to you in some endeavor or undertaking you have planned!
In March of 2015, the Doomsday Clock started ticking for SharePoint Online Public Sites. Some have transitioned off of the service, but many of those least able to make the move (non-profits, user groups, small businesses) are stranded and concerned. In this post, I discuss the issue and my conversation with Jeff Teper about it. I also ask Microsoft to provide us with more help and assistance for transitioning away from SharePoint Online Public Sites.
Who was the “distinguished guest” to whom I’m referring? Well, it was none other that Jeff Teper himself. Some of you may know the name and perhaps the man, but for those who don’t: Jeff is Microsoft’s Corporate Vice President for OneDrive and SharePoint. In essence, he’s the guy who’s primarily responsible for the vision and delivery of SharePoint both now and in the future. The Big Kahuna. Top of the Totem Pole. The Man in Command.
Jeff wasn’t in Nashville specifically for the event, but he took time out of his personal schedule to do an open Q&A session at the end of the SPS event. This was a *HUGE* deal, and it offered us (the speakers, organizers, and attendees) a rare chance to ask questions we’d always wanted to ask directly of the guy at the top.
Some of the questions were softballs, but several weren’t. A few of us(Mark Rackley, Seb Matthews, myself …) took the opportunity to ask questions that we anticipated might be uncomfortable but were nonetheless important to ask. To Jeff’s credit, he did a fantastic job of listening and responding to each question he received.
I asked Jeff several questions, but only one of them dealt with a topic that had started becoming a true area of concern for me: SharePoint Online Public Websites.
Some of you may be thinking, “Wait – what are you talking about?” If you came to SharePoint Online after March of 2015, then you might not even be aware that most Office 365 plans prior to that point came with a public-facing website that companies and organizations could use for a variety of purposes: public presence, blogging, e-commerce, and more. It was an extremely easy way for small-to-mid-size organizations to hang their shingle on the web for very little money and with little technical know-how.
Unfortunately, Microsoft announced in January of 2015 that it was deprecating SharePoint Online public sites. Beginning on March 9th of 2015, new customers did not receive a public site with their tenant. Those who already had the public sites, though, were allowed to keep them for a minimum of two years. In that two year period, the organizations with the public sites needed to “move on” and find an alternate hosting option. Microsoft eventually offered up a few options for public site owners, but they didn’t go very far.
Before I continue there, though, let me rewind for some additional context.
Shortly after they became available to me, I set up several of the public sites for my own use. I also put my wife’s non-profit organization on one. As of right now (May 27, 2016), these sites are still alive-and-well in SharePoint Online:
I recommended SharePoint Online public sites to everyone who needed “an Internet presence that was both cheap and easy.” That said, it’s probably easy to understand that the bulk of the public site adoptees (that I saw) were organizations who either lacked money, formal IT capabilities, or a combination of the two.
I’m not alone. It seems I’m getting into more and more conversations with other Office 365 customers about the topic, and they don’t know what to do either. It’s not that they want to wait until the last minute to make the move; they simply don’t know how to get off the SOPSI Island.
In my estimation, the organizations that have money and IT capabilities have either transitioned to another platform or are in the process of building a viable plan. As I wrote earlier, though, I think the greatest adoption of these public sites was among those who are traditionally the least capable and underfunded: small-to-mid-size companies, non-profits, user groups, and the like.
When I speak with customers in those segments, their concerns echo my own. They’re still on Office 365 Public Sites and haven’t gone to something else because they lack the money and capability to do so. And they’re growing increasingly worried.
Here’s another problem with this situation: the other hosting platforms and options that Microsoft has tossed our way don’t actually provide any sort of bridge or migration option between SharePoint Online public sites and their platforms.
The reality in all of this is that we won’t be migrating: we’ll be rebuilding. We’re going to need to find some way to drag our content out of the pages we’ve created, and then we need to go somewhere else and rebuild from the ground-up.
And, of course, any time that was spent customizing a SharePoint Online public site is going to go out the window. That tends to happen in migrations (disclosure: I’ve been doing SharePoint migrations in some form for the better part of a decade), and that’s probably acceptable in the grand scheme of things … but the users who truly need help need something more than the guidance provided in the online resource.
Fast-forward back to Nashville a couple of weeks ago.
Although I asked Jeff “Hey, what happened with the SPO public sites?,” the question that I really wanted to get an answer to was this: “Why are our options for exiting the SharePoint Online public site platform so … lousy?”
Jeff took the time to respond to the various pieces of my question, but when we got to talking about migration options and the people who were currently “stuck,” the response was something to the effect of this: he thought that most folks had already migrated or were in the process of doing so.
At that point, various other folks in the audience (representing user groups, non-profits, etc.) started sounding-off and explaining that they were stuck, too. Clearly, I wasn’t the only one with sites hanging out on SOPSI Island.
Jeff indicated he’d take our input and concerns back to Microsoft, and I believe that he will. But just to put the request in writing …
At a minimum, we need better and more practical, prescriptive guidance. For some, a tool might help – perhaps something to package up assets to take them somewhere else. If I’m allowed to dream, a tool that might actually carry out some form of migration would probably be appreciated tremendously by the smaller, less-capable customers. Regardless of the specific form(s), we need more help and probably more time to make the move.
When SOPSI Island is (likely) wiped-out in 2017, we don’t want to still be stuck on it – watching our sites disappear forever.
On April 1st, Microsoft presented me with an MVP (most valuable professional) award in the Office Development and the Office Server and Services categories. This post is a thank you to all of you who helped make the last seven years of community engagement such a fantastic and rewarding experience for me.
So, my day started with a wary mindset – fearful of what may lay around the next corner. When this arrived in my inbox, that all changed.
I’d been nominated for the Microsoft MVP (most valuable professional) award a handful of times over the years, and I had been nominated again as recently as a couple of months back … but the earlier nominations hadn’t actually turned into an award.
I had to actually read the first paragraph of the email I’d received a few times before it truly registered that yes, I was being presented with an MVP award.
As a rule of thumb, I’m not an overly emotional guy. But I’d be lying if I didn’t say that over the course of the day, I went through a wide range of emotions. Disbelief. Joy. Numbness (okay, that’s not an emotion – but it was a mental state for me). Tremendous gratitude. Humility. I got “teary” at least a few times. Even today, it still doesn’t feel “real” – even though I know it is.
Receiving an MVP award from Microsoft for Office Development and Office Servers and Services (two different categories – I’m kind of a switch-hitter) sent me thinking back to the beginning.
If you look at the Presentations and Materials section of my blog, you can see most of the stops I made between Harrison, Arkansas (in 2009) and today. There are quite a few. And I have a ton of fantastic memories from the various events and get-togethers that have taken place over the last seven years.
The reality, for me, is that the extended SharePoint Community (each of you reading this) is my “social network.” I consider many of you to be my good friends, and many more of you are familiar faces at events, conferences, and get-togethers. I love to spend time with you, hang out, and talk shop wherever I may go and wherever we may all meet up. My SharePoint community “work” has definitely been a labor of love, and I don’t see that changing anytime soon.
So, from the bottom of my heart: thank you for all the great memories, engagement, and interactions over the years. I wouldn’t have this MVP award were it not for you folks. And, of course, my thanks to Microsoft and the numerous people who helped turn this into a reality for me. It feels great, and I look forward to many more years of great community fun and engagement!
In my last post, I promised those who attended my Content Search Web Part session (at SPTechCon Austin 2016) that I’d deliver videos of the demos I normally perform during that session. This post contains links to those demo videos as well as some additional commentary.
It took a little longer than initially anticipated, but the half-dozen links below represent the demo material I would normally walk through during a delivery of my “SharePoint’s New Swiss Army Knife: The Content Search Web Part” session. If there’s a silver lining to the fact that I’m doing the demos after the actual presentation, it’s that I was able to take more time than I normally have (within the context of a 75 minute session) to show some extra content and go off the beaten path a bit more.
So, for those of you who have been waiting … here are the goods!
These videos were recorded with Camtasia and rendered directly out to YouTube. I made every attempt to keep the quality high, but if something gets “lost in translation” or you have other issues, please let me know.
I enjoyed putting these videos together, and in the past I’ve tossed around the idea of doing more videos like this. If these CSWP videos were helpful to you and/or you’d like to see more, please let me know. If enough of you find value in these, I’d be willing to put together additional videos for some of the other presentations and workshops I deliver.
Enjoy, and as with everything else, I welcome your feedback!
I just got back from SPTechCon Austin 2016, and I had some “trouble” (putting it mildly) with demos I gave during one of my sessions. This post is a note – and a promise – to those who attended my Content Search Web Part (CSWP) session during the conference.
Well, I got back from SPTechCon Austin 2016 yesterday … and I felt compelled to write something today. Yes, it was a great conference, lots of fun, and filled with awesome attendees. But there was something more to this conference that motivated me – no, compelled me – to write this post.
That “thing” that compelled me was this: death by demo.
I delivered two sessions during the event: a new one on performance troubleshooting with SharePoint Online, and one of my “standards” that is an introduction to the Content Search Web Part (CSWP). I delivered the troubleshooting session on Tuesday, and although it went long (I still need to tune it up), it went pretty well – no real issues. I can’t claim the same about the CSWP session yesterday (Wednesday) morning.
Simply put, the demos for my CSWP session were a disaster. I’d gotten everything ready to go on the Tuesday night before the session; despite that, things went off-the-rails almost immediately. I was RDP’ing back to my home desktop system where I had VMware Workstation running, and all of that (i.e., the RDP and VWware Workstation parts) seemed fine. The fashion in which things blew up was not something I’d ever seen before.
What went wrong? Well, it’s hard to describe. The best way to describe it is that left-clicking didn’t work properly in the development VM I was using. Sometimes my clicks would visibly register (e.g., on a window close button) – but nothing would happen. Other times, my left-clicks seemed to register somewhere else on the screen (other than where the mouse pointer was located). And at other times still, a left-click would highlight some weird section in the web browser window.
Because of this aberrant mouse behavior, I couldn’t show the demo material. I certainly tried enough times, and I even hobbled through one demo with the audience members helping me by shouting out keyboard shortcuts when I asked … but it was a total wreck.
As the demos were slamming into walls and catching on fire, I commented a couple of times that I’d find some way to share the demo materials with the audience at a later time. I was initially thinking I’d try to do a webcast – kind of a do-over – but I thought about it some more on the plane ride home last night and decided on something else.
Here’s what I’m going to do: rather than do the whole session over again, I’m going to work through each of the demos I intended to show and record those as a Camtasia/video that can be viewed whenever someone has the time to do so. Doing this sort of video cuts straight to the chase and is ultimately more flexible than trying to round everyone up for a webcast. It can also be re-watched as desired.
“When is this video going to be ready,” you might ask? I need to do some catching-up after having been out of town for a while, but I’m hoping to find the time this coming weekend to put it together. If I can do that, then the video will be available sometime early next week.
Once everything is ready to go, I’ll put together another blog post to announce the availability and provide a link. I’ve also been in contact with David Rubinstein at BZ Media about this, and he said that he’d blast the information out to attendees and newsletter subscribers, as well.
So, once again: my sincere apologies to those who attended my CSWP session at SPTechCon. It’ll be a few days after the actual session, but hopefully the video will make up for the demos that went nowhere during the session.
My time with Idera has come to an end, so I wanted to aggregate some of the resources I assembled with them. I also wanted to share some information about my new company, Bitstream Foundry LLC.
My last three years with Idera have been quite a whirlwind of activity. I feel very fortunate and am extremely thankful to Idera for the opportunities they’ve afforded me – especially over the last year in my role as their Chief SharePoint Evangelist. In that role, I was given the latitude to spend a significant chunk of my time focusing on an area that is very important to me personally: the SharePoint Community.
In thinking about my role and some of what I’ve done over the last three years, it occurred to me that it might be nice to summarize and link to some of the materials I assembled while at Idera. I’ve occasionally referenced these items in the past, but I don’t think I’ve ever tried to aggregate them into one post or in one place.
In the last half a year or so, my regular content generation efforts were being funneled to Idera’s SharePoint “Geek Stuff” blog. Here’s a table (with associated links) to the posts I’ve written:
March 19, 2013 | ![]() ![]() ![]() |
Plan Your SharePoint Farm Right with a SQL Server Alias |
February 8, 2013 | ![]() ![]() ![]() |
Do You Have a SharePoint Backup Strategy? |
January 17, 2013 | ![]() ![]() ![]() |
The Five Minute Cheat-Sheet on SharePoint 2013’s Distributed Cache Service |
December 20, 2012 | ![]() ![]() ![]() |
Why Administrators Will Giggle Like Schoolgirls About SharePoint 2013’s New App Model |
November 20, 2012 | ![]() ![]() ![]() |
Sean’s Thoughts on the Microsoft SharePoint Conference 2012 |
October 19, 2012 | ![]() ![]() ![]() |
Getting the Permissions Wired-Up Properly When Attaching a Content Database to a SharePoint Farm |
September 21, 2012 | ![]() ![]() ![]() |
Okay, Really – What Can I Do With a SharePoint Farm Configuration Database Backup? |
August 24, 2012 | ![]() ![]() ![]() |
Do I Really Need to Backup Up the SharePoint Root? |
June 20, 2012 | ![]() ![]() ![]() |
Interview with John Ferringer |
June 8, 2012 | ![]() ![]() ![]() |
TechEd – Why Should You Care? |
There was a point in the past when Idera was publishing a sort of newsletter called “SharePoint Smarts,” and I wrote a couple of articles for the newsletter before it eventually rode off into the sunset:
Over the years, I’ve also written or co-authored a handful of whitepapers for Idera. At the time I’m writing this post, it appears that a couple of those whitepapers are still available:
And although it isn’t available just yet, sometime soon Idera will be releasing another whitepaper I wrote that had the working title of “SharePoint Caching Implementation Guide.” If that sounds at all interesting, keep an eye on the Whitepapers section of Idera’s Resources page.
A couple of months back, I launched Bitstream Foundry, LLC, with the intention of getting back into more hands-on SharePoint work. My intention is to focus initially on a combination of custom SharePoint development work and SharePoint App Store product development. In the past, I’ve been a “switch hitter” when it comes to SharePoint, and I’ve gone back and forth between development and administration roles fairly regularly. Although I’m not abandoning my admin “comrades in arms,” I have to admit that I tend to get the greatest enjoyment out of development work. Between custom solutions and App Model development, I’m pretty sure I’ll be able to keep myself busy.
I also learned today that my application to get Bitstream Foundry listed in the SharePoint App Store was approved, so the way is paved for me to roll out Apps. Now I just need to write them!
Despite all of the recent changes, one aspect of my professional life that won’t be changing is my commitment to sharing with (and giving back to) the SharePoint community. My confidence in my current situation would probably be substantially lower if it weren’t for all of you – my (SharePoint) friends. Over the last several months, my belief in “professional karma” has been strongly reinforced. I’ve always tried to help those who’ve asked for my time and assistance, and I’ve seen that goodwill return to me as I’ve sought input and worked to figure out “what’s next.” To those of you who have offered advice, provided feedback, written endorsements/recommendations, and more, you have my most heartfelt thanks.
I love interacting with all of you, and I still get tremendous enjoyment out of blogging, speaking, teaching, and sharing with everyone in the SharePoint space. My “official” days as a full-time evangelist may be behind me, but that won’t really change anything for me going forward as far as community involvement goes. I’ll continue to answer emails, blog when I have information worth sharing, assemble tools/widgets, help organize events, and generally do what I can to help all of you as you’ve helped me. I’m also honored to be a part of several upcoming events, and I hope to see some of you when I’m “on tour.” If we haven’t met, please say hi and introduce yourself. Making new friends and connections is one of the most rewarding aspects of being out-and-about :-)
2013 promises to be a year of big changes. In this post, I cover career changes and some official resolutions I’m making for the new year.
2012 is coming to a close, and 2013 is just around the corner. I’ve been thinking about the year that has gone by, but I’ve been thinking even more about the year to come. 2013 promises to be a year of great personal change – for reasons that will become clear with a little more reading.
But first: I’ve got this friend, and many of you probably know him. His name is Brian Jackett, and nowadays he works for Microsoft as a member of their premier field engineering (PFE) team. For the last couple of years, I’ve watched (with envy, I might add) as Brian has blogged about his year-gone-by and assembled a list of goals for the coming year. He even challenged me (directly) to do the same at one point in the past, but sadly I didn’t rise to the challenge.
I’ve decided that year-end 2012 is going to be different. 2012 was a very busy year for me, and a lot of great things happened throughout the year. Despite these great things, I’m going into 2013 knowing that a lot is going to change (and frankly has to change).
I’m leaving because Idera is undergoing some changes, and the company is in the process of adjusting its strategy on a few different levels. One of the resultant changes brought about by the shift in strategy involves the company getting back to more of an Internet/direct sales-based approach. Since a large part of my role involves community based activities and activities that don’t necessarily align with the strategy change, it doesn’t make a whole lot of sense for me to remain – at least in the full-time capacity that I currently operate in.
To be honest, I didn’t expect my role or position to be around forever. As many of you heard me declare publicly, though: I wanted to make the most of it while I had the role and the backing. I got a lot out of working with my friends at Idera, and I greatly appreciate the opportunities they afforded me. I hope it’s been as much fun for them as it has been for me.
Even after my full-time role comes to a close, I’ve already had a couple of conversations around continuing to do some work with/for Idera. Despite my full-time focus on Idera over the last 2+ years, I have actually been operating as a contractor/consultant – not a full-time employee. This has left me free to take on other SharePoint work when it made sense (and when my schedule permitted). Going forward, my situation will probably just do a flip-flop: Idera will become the “side work” (if it makes sense), and something else will take center stage.
I don’t yet know what will be “showing on the main screen,” though. That’s been on my mind quite a bit recently, and I’ve been spending a lot of time trying to figure out what I really want to do next. Take a full-time role with a local organization? Do contract development work and continue to work from home? Wiggle my way into becoming the first Starbucks SharePoint barista? Something else entirely? If my preliminary assessment of what’s out there is accurate, there are quite a few different options. I’ll certainly be busy evaluating them and comparing them against my ever-evolving “what I want to do” checklist.
As I try to figure out what’s next, I’d like to ask a favor: if you feel that I’ve helped you in some significant or meaningful way (through one of my sessions, in an email I’ve answered, etc.) over the last few years, would you be willing to endorse my skills or recommend me on LinkedIn? I see a wealth of opportunities “out there,” and sometimes an endorsement or recommendation can make the difference when it comes to employment or landing a client.
Employment and the ability to support my family aside, this is the first year (in quite a few) that I’ve made some resolutions for the new year. Although it’s an artificial break-point, I’ve separated my resolutions into “work-related” and “non-work” categories. And although I can think of lots of things I want to change, I’ve picked only three in each category to focus on.
Some of you chimed-in (positively) when I recently made a comment on Facebook about unsubscribing to a lot of junk email. Over time, I’ve come to realize that all of the extra email I’ve been getting is just a distraction. I can do something about that.
The same goes for email in general. I have multiple email accounts, and mail streams into those accounts throughout the day. Rather than constantly trying to stay on top of my inbox, I’m going to shift to a “let it sit” mentality. If I’m honest with myself, 95% of the email I receive can go unanswered for a while. I’ll attend to those items that require my attention, but some of the quasi real-time email discussions I’m known to have don’t really matter in the greater scheme of getting real work done.
Social networking tools are another great example. I think they can be a very positive and helpful force (especially for someone who’s at home all day, like me), but they can very easily become a full-time distraction. I cut down my Twitter use dramatically a couple of years back. I won’t even set foot “on” Yammer because of the huge, sucking, time-consuming noise it appears to make. Going forward, I’m going to attempt to use other tools (Facebook, LinkedIn, etc.) during specific windows rather than having them open all-day, everyday – even if I’m not “actively” on them.
For distractions that can’t be removed (e.g., children running around), my only option is to better manage the distractions. My home office has doors; I’ve already begun using them more. I’ll be wearing headphones more often. These are the sorts of things I can do to ensure that I remain better focused.
2. Thoughtfully Choose Work. I had to come clean with myself on this one, and that’s why I chose to word the resolution the way I did. Work is important to me, and it’s in my nature to always be working on something – even if that work is “for fun.” While I’d like to be the type of person who could cut back and work less, I don’t know that I’d be able to do so without incurring substantial anxiety.
Knowing this about myself, I’ve settled on trying to be more thoughtful about doing work. Make it a choice, not the default. Being a workaholic who labors from home, work became my default mode rather quickly and naturally. I remember a time when weekends were filled with fun activities – and leaving work meant “leaving” in both the physical and mental sense. Even if I can’t maintain boundaries that are quite that clear nowadays, I can be more conscientious about my choices and actually making work a conscious choice. That may sound like nothing more than semantics or babble, but I suspect other work-at-home types will get what I’m saying.
For me, this mentality needs to extend to “extracurricular” work-like activities, as well. I just went back through my 2012 calendar, and I counted 19 weekends where I was traveling or engaged in (SharePoint) community activities. That’s over a third of the weekends for the year. Many of those events are things I just sort of “fell” into without thinking too much about it. Perhaps I’d choose to do them all anyway, but again – it needs to be a choice, not the default course of action.
3. Spend Time on Impactful Efforts. Of all my work-related resolutions, this is the one that’s been on my mind the most. As I already mentioned (and many of you know), I spend a lot of time answering questions in email, speaking at and organizing SharePoint events, writing, blogging, etc. Although I originally viewed all of these activities as equally “good things,” in the past year or so I’ve begun to see that some of those activities are more impactful (and thus “more good”) to a wider audience than others.
In 2013, I intend to focus more of my time on efforts that are going to help “the many” rather than “the few.” No, that doesn’t mean I’m going to stop answering email and cease meaningful one-on-one interactions, but I do intend to choose where I spend my time more carefully.
In broader terms, I also intend to focus my capabilities on topics and areas that are generally more meaningful in nature. For example, my wife and her co-worker started a project a while back that has been gaining a lot of traction at a regional level – and the scope of the project is growing. Their effort, The Schizophrenia Oral History Project, profoundly impacts the lives of people living with schizophrenia and those caring for them, providing services to them, and others. I’ve been providing “technical support” (via an introduction to Prezi, registering domain names, etc.) for the project for a while, and I’m currently building a web site for the project using SharePoint and the Office 365 Preview. This sort of work is much more meaningful and fulfilling than some of the other things I’ve spent my time on, and so I want to do more of it.
1. Lose Another Ten Pounds. My weight has gone up and down a few times in the past. At the beginning of 2012, I was pretty heavy … and I felt it. I was out of shape, lethargic, and pretty miserable. Over the course of 2012, I lost close to 30 pounds through a combination of diet (I have Mark Rackley to thank for the plan) and exercise. Now at the end of the year, I’ve been bouncing around at roughly the same weight for a month or two – something I attribute primarily to the holidays and all the good food that’s been around. In 2013, I plan to lose another ten pounds to get down to (what I feel) is an optimal weight.
2. Take Up a Martial Art Once Again. This will undoubtedly help with #1 directly above. I practiced a couple of different martial arts in the past. Before and during college, I practiced Tae Kwon Do. A few years back, I had to reluctantly cease learning Hapkido after only a couple of years in. Martial arts are something I’ve always enjoyed (well, except when I was doing something like separating a shoulder), and I’ve found that life generally feels more balanced when I’m practicing. With the recent enrollment of my five year-old son into a martial arts program, I’m once again feeling the pull. I’ve wanted to learn more about Krav Maga for a while; since there’s a school nearby, I intend to check it out.
3. Prioritize My Home Life. This may be last on my list, but it’s certainly not least. With everything I’ve described so far, it’s probably no surprise to read that I do a pretty poor job of prioritizing home life and family activities. That’s going to change in 2013. Provided I make some headway with my other resolutions, it will become easier to focus on my wife, my kids, and my own interests without feelings of guilt.
I’ve written these resolutions down on a Post-It, and that Post-It has been placed on one of my monitors. That’ll ensure that it stays “in my face.”
Do you have any resolutions you’re making? Big changes?