I realized how obsessed I am with much I appreciate Windows PowerShell today, as I was working with Exchange 2013. I needed to find the differences in access rights between a PublishingEditor and Editor. The image below, pulled from a Microsoft web page, lists the different access rights.
One way to determine the difference would be to sit and stare at the screen. Nah. It didn’t take my eyes long, darting back and forth between lines, to desire a better way. Another way would be to take a screen capture and mark off the common entries. The image below shows what that looks like. Seriously, though, I can do better. Let’s do this in PowerShell and give ourselves a little practice. More on that in a moment.
I copied and pasted the first line I wanted to my PowerShell console.
PS> PublishingEditor CreateItems, ReadItems, CreateSubfolders, FolderVisible, EditOwnedItems, EditAllItems, DeleteOwnedItems, DeleteAllItems
Then, I bounced around the entry to ensure that $PublishingEditor became a variable, by adding a dollar sign. I also added the = assignment operator and put single quotes around the entire group of access rights, but this wasn’t quite enough.
PS> $PublishingEditor = 'CreateItems, ReadItems, CreateSubfolders, FolderVisible, EditOwnedItems, EditAllItems, DeleteOwnedItems, DeleteAllItems'
The next thing I did was add a couple methods — one right after the other, at the end of the command. The first method I added was .Replace(). In the version I added, .Replace(‘ ‘,”), it replaces all single spaces with nothing, effectively removing the spaces. The next method I added was .Split(). This, when added as .Split(‘,’), splits the string at each comma.
PS> $PublishingEditor = 'CreateItems, ReadItems, CreateSubfolders, FolderVisible, EditOwnedItems, EditAllItems, DeleteOwnedItems, DeleteAllItems'.Replace(' ','').Split(',')
Next, I copied the second line, for Editor access rights, pasted it in the console and cleaned it up, too.
PS> $Editor = 'CreateItems, ReadItems, FolderVisible, EditOwnedItems, EditAllItems, DeleteOwnedItems, DeleteAllItems'.Replace(' ','').Split(',')
At this point, I had two variables, $PublishingEditor and $Editor. I needed a way to compare the two variables to determine which one had additional access rights (presumably PublishingEditor) and what those were.
The first thing I did was echo the variables’ values to my screen. The second, was to run a comparison of the two. This was done using the Compare-Object cmdlet, where I provided one variable, $PublishingEditor, as the value for the -ReferenceObject parameter, and the other variable, $Editor, as the value for the -DifferenceObject parameter.
PS> $PublishingEditor CreateItems ReadItems CreateSubfolders FolderVisible EditOwnedItems EditAllItems DeleteOwnedItems DeleteAllItems PS> PS> $Editor CreateItems ReadItems FolderVisible EditOwnedItems EditAllItems DeleteOwnedItems DeleteAllItems PS> PS> Compare-Object -ReferenceObject $PublishingEditor -DifferenceObject $Editor InputObject SideIndicator ----------- ------------- CreateSubfolders <=
The results, above, indicate that $PublishingEditor (the InputObject) has an additional access right, called CreateSubfolders. As you can see, the default results of Compare-Object only show the differences. Had I used the -IncludeEqual parameter the results would have looked like the example below.
PS> Compare-Object -ReferenceObject $PublishingEditor -DifferenceObject $Editor -IncludeEqual InputObject SideIndicator ----------- ------------- CreateItems == ReadItems == FolderVisible == EditOwnedItems == EditAllItems == DeleteOwnedItems == DeleteAllItems == CreateSubfolders <=
Thanks for reading. Now off to find some other way to use PowerShell to speed up my day.
Before I do that, though, I mentioned practice earlier in this post. To really get PowerShell, we need to take every opportunity to continue to learn, but also to practice what we already know. This was a perfect opportunity. Not only would I get the results I needed — the difference in access rights — but I also got a half of minute of working with the Compare-Object cmdlet and the .Replace() and .Split() methods, where I may not have otherwise.
The more I use PowerShell, the less I have to try and remember when I really need it.