| The Microsoft SharePoint Conference 2012 is beginning in just a couple of days. I am attending and am looking forward to the break from work. However, I don't feel a part of the SP Community as I did for SPC09. Since taking this consulting job, I've had little time for user groups, SharePoint Saturdays or other conferences. I don't have Twitter access from most client sites, so can't keep up on the daily topics. And while I used to blog about all sorts of SharePoint issues, I find that what I want to blog about now is part of company intellectual property so always am walking a thin line when I do post a new blog.
There will be some familiar faces – familiar to me anyway – at SPC12. And perhaps some will even be friendly. This conference is supposed to be huge, so I don't envision having a lot of "face" time with individuals.
I've filled my daily schedule with educational sessions and left little time for running around the Exhibitor floor. I have volunteered to spend some time in the Community Hub and maybe that will be fun. I imagine the evenings will be filled to overflowing with people trying to make connections and push the envelope of propriety just because they are in Las Vegas and feel they can get a bit wild. The Bon Jovi concert should be fun…at least the music should be good.
For all the organized fun, the training, and the throngs of people – it will likely be a time of finding out just how much the community has moved on without me over the past three years. Not that even my ego would be big enough to think that I was essential, but perhaps at least a welcome part.
So, I journey this weekend to Las Vegas with mixed feelings. Maybe by the end of the week there will be more good memories than blah or bad.
See you in Vegas! |
| I have had many instances where users wanted to be able to not only see a SharePoint calendar in MS Outlook, but also wanted the ability to add an event in a SharePoint calendar to their own personal calendar.
I'll leave the interface for making this happen up to you, but here is the description of the mechanics of a workflow that will achieve this - either making it automatic or a choice.
In a workflow, you can automatically send an email to the user, and then within the email, there can be a link that will add the item to their own personal calendar.
How to obtain this link? Well, open up any calendar item, and right-click on "Export event", and copy that URL so that you can use it. Then, you dissect the URL...
See where it says ID=8 in there? Well, 8 is the list item's ID number. So, in the URL within your email, just replace that number with the lookup or variable that represents that ID field. You can pretty it up by adding HTML href encoding if you wish.
Then, when users receive the email, they can simply click that link to be prompted to add the item to their calendars.
It's that easy. |
| SharePoint security can often be the subject of many a long day of planning, implementing and/or troubleshooting. And as more companies become security-conscious, having the right security in your SharePoint sites is essential to insuring a smoothly running collaborative environment.
This is the first installment of a series on SharePoint security. It is written for the end-user and the site administrator alike. In future installments we will explore the topics of permissions levels, SharePoint groups vs. Active Directory groups, and permissions inheritance.
Anyone that has navigated around Microsoft SharePoint sites shall have noticed that they have different options available to them on different sites or even different locations within the same site. And perhaps even the Help feature was not enough as the instructions referred to menu options that you just could not see. This is not an attempt to frustrate.
SharePoint only shows you the sites, site content, and menu options to which you have been granted permissions to see or successfully use. This is referred to as a security trimmed user interface (UI).
SharePoint security can be assigned to allow actions through an entire site, or fine-tuned to have different permissions on each list or library in the site or even each document in a library. Your permissions can differ between sites and can differ between the content on the same site, such as: lists, libraries, items in lists, and files in libraries. As such, menu options you have on one site, library or item may not be available in a different location.
Following are a couple of examples to help show how a security trimmed UI affects users with different permissions for a SharePoint site and its content. The examples assume the default installation of a SharePoint site and its content, your site may have different menu options.
Site Actions Menu
You may or may not have seen the Site Actions button in the upper corner of a SharePoint site. The Site Actions menu contains options that potentially affect the entire site by adding additional content or changing site settings. Here are two examples of what options are displayed when the Site Actions menu button is clicked. The menu options vary depending on the features active within the SharePoint site and the permissions of the user that selects the menu. Assuming a typical site with typical default features active, we have the following example.
Site Owner Menu
Figure 1 - Site Owner |
Site Member Menu
Figure 2 - Site Member |
When William, the site administrator for Sales, clicks the Site Actions menu on the Sales site, the options available to him are represented in Figure 1 – Site Owner. William has permissions to perform all of these options.
William is a member of the default Site Owners group for the Sales site. The Site Owners group has the Full Control permission level for the site. This is a common permission level for a person who manages a SharePoint site. Users with the Full Control permission level can do almost anything they want to a site and its content.
When Elizabeth, a member of the Sales team, clicks the Site Actions menu on the Sales site, the options available to her are represented in Figure 2 – Site Member. Elizabeth has permissions to perform all of these options.
Any options in the Site Actions menu that would allow editing the site settings or structure are not available for Elizabeth, like they were for William. Elizabeth has the Contribute permission level, which isn't sufficient to perform actions such as create sites or document libraries, change site settings or edit with SharePoint Designer, so the menu options are not displayed for her.
Elizabeth is a member of the default Site Members group for the Sales site. The Site Members group has the Contribute permission level for the site. This is a common permission level for people who add, edit, and delete content on a SharePoint site. They have no permissions to change the overall layout of the site, site settings or site security.
When Louis, an accountant in the company, visits the Sales site, the Site Actions menu is not displayed for him.
Louis is a member of the default Site Visitors group for the Sales site. The Site Visitors group has the Read permission level for the site. This is a common permission level for people who need to read content on a site but not make any changes to it. The Read permission level isn't sufficient to perform actions that change the entire site, so the Site Actions menu is not displayed for him.
Library Ribbon
William, from the preceding example, goes to the Shared Documents library of the Sales site. Here are the Document options available to him in the ribbon menu. William has permissions to perform all of the options listed in the menus. * You may not see identical menu options; they also depend on the features of your SharePoint environment.
Figure 3 – Site Owner Documents Menu
And if William selects the Library menu, he will have the following Ribbon menu available to him.
Figure 4 - Site Owner Library Menu
Elizabeth goes to the same library as William. Elizabeth has the Contribute permission level. With this permission, Elizabeth has almost all the same abilities for documents in a library as a site owner as can be seen in Figure 5.
Figure 5 - Site Member Documents Menu
However, since the Contribute permission level has no rights to change any of the Document Library settings, any options on the Library ribbon menu that would allow such editing are not available. Elizabeth's Library options are limited to those which pertain to different ways to view the library, but not making any changes to it.
Figure 6 - Member Library Menu
Louis goes to the same library as William. As a site visitor Louis has the Read permission level, which does not allow him to add or edit document in the library, so few Ribbon menu options are available to him. These basically allow Louis to open the document, view its properties or download a copy of the document. No options that allow any changes or creation of new content are available.
Figure 7 - Visitor Document Menu
Finally, when Louis chooses the Library ribbon menu, his options as a visitor with Read permissions are even more limited than Elizabeth's.
Figure 8 - Visitor Library Menu
Any ability to view the library in a different manner mostly rely on doing so in external applications. Louis cannot even create a customized personal view of the Library.
As before, the options which actually display on your ribbon menus may differ due to different features being active in your site(s).
In this article, we have explored the reasons behind differences in menus and options based on the permissions assigned to different users of a SharePoint site. In future articles in this series we will delve deeper into SharePoint security with topics aimed more for site administrators in hopes of demystifying security and assisting them to create their own security-trimmed collaborative environment. |
| I have often had clients that had entered the same information on multiple SharePoint sites. In this client's case, they had created a manual entry in their Quick Launch and given it an absolute URL to point to a custom list (Named "Links" ) within that site. They then used this site as a template, which meant this absolute URL was propagated through hundreds of sites. And then it came time to change the URL as their FQDN was changing and the old one would no longer work.
So, instead of hunting through hundreds of sites to update this one Navigation item, I came up with this little script in PowerShell. I'll show the script then explain it.
$site = Get-SPSite http://www.domain.com/sites/sitecollection
$site | get-spweb -limit all | foreach-object{
$webURL = $_.url
$web = Get-SPWeb $webURL
$NewURL = $WebURL + "/lists/links/allitems.aspx"
$navigationNodes = $web.Navigation.QuickLaunch
ForEach ($Node in $NavigationNodes)
{
if($node.Title -eq "Lists")
{
$PreviousChild = $node.children | where {$_.Title -eq "Tasks"}
$childnode = $node.children | where {$_.Title -eq "Links"}
If($Childnode -eq ""){continue}
[Microsoft.SharePoint.Publishing.Navigation.SPNavigationSiteMapNode]::UpdateSPNavigationNode($ChildNode, $PreviousChild, "Links", $NewURL, "", "", "", $false)
$web.web.update()
}
}
$web.Dispose()
} |
The intent of this script is:
- Iterate through all the sites in a site collection
- Find entries in the Quick Launch menu that equal "Links"
- Update the URL for that entry with the information constructed in the script.
First we identify the site collection. Then we find the site collection's current URL property and append it to the path to create our new URL ($NewURL).
Then we find all the sub-sites (webs) within that site collection. We step through each web and look at the Quick Launch menu in each web. Then for each Navigational element (node) in the Quick Launch menu, we look at it to find the heading of "Lists". Then we look at all the child navigational elements under "Lists" looking for on named "Links" ($Childnode). Since we're going to use the UpdateSPNavigationNode method to change our URL, the entry is actually re-created – effectively making a new entry. So we need to identify the navigational item we wish our new "Links" entry to follow ($PreviousChild).
We allow for the possibility that a site might not have a "Links" entry in the "Lists" section. If not, the script will throw an error on the UpdateSPNavigationNode method as $ChildNode will be kinda Null. (Kinda null because there will be no node value entered into the $childnode variable – but, it will have a blank value of "". So we can't use $null.)
We've mentioned it and looked at it, now let's tell you what the UpdateSPNavigationNode method will be doing for us. The C# syntax is:
public
static SPNavigationNode UpdateSPNavigationNode(
SPNavigationNode node,
SPNavigationNode previous,
string name,
string url,
string description,
string target,
string audience,
bool forceCreate
) |
This means our first value is the SPNavigationNode value of our "Links" item. Next is the SPNavigationNode value of the "Tasks" item, which our new "Links" will come behind. Followed by the name that will be displayed "Links", the URL we created ($NewURL). The description, target, and audience are not required, but we must allow for their space, hence blank values of "". Finally the forceCreate property which is either $false (default) or $true. If left to $false, the properties of the navigation element will be updated. Remember, though, that since we are changing the URL, we will be re-creating this navigation entry anyway, so go ahead and leave it $false.
Then we step on to the next sub-site and do it all over again.
With each successful update, you will see a set of properties display in the PowerShell window. Setting other properties is a whole other lesson.
Good luck! And keep sharing!
Kevin |
| I finally broke down and decided to take the 70-667 (TS) and 70-668 (PRO) Microsoft SharePoint 2010 certification tests. I looked over the MOC for a couple of days and then scheduled the tests back to back last Wednesday.
I didn't really find them that difficult, but didn't ace them either. I did note that the MOC was no real preparation for either test. In fact, the MOC seemed to be just the opposite of what MS has said it was designed to do. MS had stated the MOC was designed to take someone with 2-3 years experience with a product and teach them to translate that experience into a test environment.
However, I found that the MOC for SP 2010 was more designed to teach the basics of the product and related technologies and less about how to translate your experience into a test environment.
I would surmise that if one had spent 2-3 years administering half a dozen cutting edge SP 2010 farms which utilized 90% of SP2010's capabilities one could pass the TS (70-667) without test prep. And by the same method - if one had spent 2-4 years designing, building and doing governance and DR for a few dozen different SP2010 environments which utilized 90% of SP2010's capabilities and interacted with related systems and LoB apps, then one could pass the PRO (70-668) without test prep.
Of course, test prep could help if you don't have such wide experience. There are probably sources for the exact questions on the test if one wished to try to memorize the test pool instead of learning the product.
I will say, though, that no longer could one just read a book and pass these tests. That's good. But, I am sure people will still cheat to get the credentials. So, what are they really worth?
Keep sharing! |
| When the out-of-the-box permission levels do not suit your needs, SharePoint 2010 allows you the capability to create new combinations of permissions that can then be assigned to individuals and/or groups. This is easy enough to accomplish via the SP2010 GUI, so I won't cover that here. In fact if all you need to do is create a permission level for a single site collection or site it is most likely faster to do this through the GUI than programmatically…it isn't something most do very often anyway.
However, what if you have 5000 site collections that already exist in a web application? It certainly doesn't make sense to go to each one and manually create a permission level for each site collection. And while you may use Policies for Web Applications to assign global "full read" or "full control", if you need more fine-tuned permissions, then that won't work either.
What's a SharePoint Guru to do? Enter PowerShell!
We prepare our PowerShell script in two steps.
First we write the part to create our custom permission level. Our goal in this example is to create a permission level that allows all the permissions of the OOTB Contributor permission level minus the ability to delete. Below is the code to create just such a permission level. Use your own web application URL.
$spWeb = Get-SPWeb http://intranet.domain.com #This is just an example Web App
$spRoleDefinition = New-Object Microsoft.SharePoint.SPRoleDefinition
$spRoleDefinition.Name = "NoDelete"
$spRoleDefinition.Description = "Can Create and Modify Items, Not Delete"
$spRoleDefinition.BasePermissions = "
AddListItems,
EditListItems,
ViewListItems,
OpenItems,
ViewVersions,
CreateAlerts,
ViewFormPages,
Open,
ViewPages,
BrowseDirectories,
CreateSSCSite,
BrowseUserInfo,
UseClientIntegration,
EditMyUserInfo,
UseRemoteAPIs,
AddDelPrivateWebParts,
UpdatePersonalWebParts,
ManagePersonalViews
"
$spweb.RoleDefinitions.Add($spRoleDefinition) |
Note that we must enumerate all the permissions we will give the custom permission level and we must not forget any prerequisite permissions else this custom permission level will not function. Where do we get the prerequisite permissions? How do we know which permissions are even a part of the Contributor permission level?
I use the GUI for finding out which permissions are part of a permission level. From Site Settings, click on Site Permissions under Users and Permissions. In the ribbon click on Permission Levels. Click on the Contribute (for example) level and you will see all the different permission assigned to this level.
To get a list of all the permissions available to assign to a level run the following PowerShell command in the SharePoint Management Utility:
[System.Enum]::GetNames("Microsoft.SharePoint.SPBasePermissions") |
Alright. Now we can do this once. But how do we insert this permission level into our 5000 existing site collections?
We get loopy!
//Name of the web application
$webapp = Get-SPWebApplication http://intranet.domain.com #This is an example web application
//Loop through each site collection within the web application
foreach ($SPSite in $webapp.sites)
{
//Open the web
$OpenWeb = $SpSite.OpenWeb()
$spWeb = Get-SPWeb $OpenWeb.url
$spRoleDefinition = New-Object Microsoft.SharePoint.SPRoleDefinition
$spRoleDefinition.Name = "NoDelete"
$spRoleDefinition.Description = "Can Create and Modify Items, Not Delete"
$spRoleDefinition.BasePermissions = "
AddListItems,
EditListItems,
ViewListItems,
OpenItems,
ViewVersions,
CreateAlerts,
ViewFormPages,
Open,
ViewPages,
BrowseDirectories,
CreateSSCSite,
BrowseUserInfo,
UseClientIntegration,
EditMyUserInfo,
UseRemoteAPIs,
AddDelPrivateWebParts,
UpdatePersonalWebParts,
ManagePersonalViews
"
$spweb.RoleDefinitions.Add($spRoleDefinition)
//Cleanup
$SPSite.Dispose()
$OpenWeb.Dispose()
} |
In this script we identify the web application, then use PowerShell to get a list of the site collections, loop through them and in each one create our custom permission level. Then, as always when using the OpenWeb method, we dispose of it to clean up our code.
To take this a step further, suppose we wanted to assign a user or an Active Directory group to use this permission level in every site collection?
We would add the following code inside our "Foreach" brackets just before the //cleanup portion:
#Assign domain\domain users to custom permission level
New-spuser $NoDelete -web $OpenWeb.url -PermissionLevel "NoDelete" |
This gives explicit permissions for the "NoDelete" permission level to the AD Domain Users security group throughout the site collection.
Obviously, you can take this example and apply it to numerous specific scenarios. But, the basic principle is sound enough to use for lots of things.
I will revisit the idea of looping as I write up more examples that have allowed me to more easily manage very large SharePoint 2010 farms.
~Kevin |
| For many of the large scale SharePoint deployments I have architected over the last several months I have often run into change orders. Some of these have required the removal of web parts from pages in a site. While having a single web part on a single SharePoint site is not going to be even a moderate effort when it comes to removing a web part from a page, when we are speaking of 5000+ site collections with the same web part deployed to the default.aspx layout page of each site, we are talking about a major effort. And when this modification will only be temporary – that you’ll need to put it back after some issue is resolved – then you really need a solution you can reverse just as easily.
Some web parts are coded very well to allow for just such an eventuality and by merely performing the normal remove process from the farm scope the web part code will clean up all instances of its occurrence. Ok..who am I kidding? I’ve never seen a web part coded that well.
So, I’ve learned to programmatically remove a web part from a page using PowerShell in the SharePoint 2010 Management Shell. I know you’re saying, “Kevin? Coding?” And I say, “Yes, but it’s really scripting…it just looks like real coding.”
I’ve seen a few posts on doing this very thing, but I wanted to clear up a couple things I’ve run into. First, let me show you the code I use to Close the web part. Some people will recommend that you never Close a web part, that you should always delete it and then you can add it back to the page if you need to do so. That’s all well and good if you have a small number of sites. But, if you are working with thousands, or if the solution needs to be repeatable and reversible, then you definitely want to Close the web part. It is much easier to reverse.
Here’s the code to delete a single web part from the default.aspx page :
[System.Reflection.Assembly]::Load("Microsoft.SharePoint, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c") | out-null
[System.reflection.Assembly]::LoadWithPartialName("Microsoft.SharePoint")
# set-up working variables...
#define your site URL
$targetSiteUrl=”http://server.domain.com/sites/0001”
#define your page URL
$pageURL="http://server.domain.com/sites/0001/default.aspx"
write-host "Deleting Web part"
$spSite = new-object Microsoft.SharePoint.SPSite($targetSiteUrl)
$web=$spSite.Openweb()
$webpartmanager=$web.GetLimitedWebPartManager($pageURL, [System.Web.UI.WebControls.WebParts.PersonalizationScope]::Shared)
foreach ($webpart in $webpartmanager.WebParts)
{
if ($webpart.Title -eq "Web part Title")
{
# Perform the close function
$webpartmanager.CloseWebPart($webpart);
$webpartmanager.SaveChanges($webpart);
}
}
write-host "Web part deleted."
Now, what is different about my code than others? First, it can be used for more than one web part on a page – especially if you want to close all but a single web part. Second, the other examples of similar code use an equals sign (=) in the If statement. I found that this sets the Title Property on ALL web parts on your page to whatever is in quotes – then disables them all since all will evaluate to True after that. So, I replaced the (=) with the PowerShell comparator –eq. This just compares and doesn’t try to set values.
What tipped me off on why this was happening was that I tried to use other web part properties to try to keep it from happening. When I used ID the page was unloadable because there were then two web parts with the same GUID. When I used DisplayTitle I got a bit more of an epiphany. I got an error that the property was Read Only and so could not be set. That told me that the script was setting the value before it tried to compare it.
And if I need to reopen that closed web part again, I run the same code but change the CloseWebPart method to OpenWebPart. It’s that simple.
So, this works for one web site. But, what if I need to iterate through 100 or 1000 or 10000 sites to do the same thing?
All I need to do is insert this code into code that loops through all my sites. Personally, I prefer to use a Comma-separated Value (.csv) file to store all the URLs for my site collections. Then I use code very much like the following:
$file = Import-CSV "C:\ps\testbatchsites1.csv"
#Initialize Variables
#Iterate through rows
foreach ($row in $file)
{
[System.Reflection.Assembly]::Load("Microsoft.SharePoint, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c") | out-null
[System.reflection.Assembly]::LoadWithPartialName("Microsoft.SharePoint")
# set-up working variables...
#define your site URL
$targetSiteUrl = $row.targeturl
#define your page URL
$pageURL= $row.targeturl + "/default.aspx"
Write-Host $pageURL
write-host "Deleting Webpart"
$spSite = new-object Microsoft.SharePoint.SPSite($targetSiteUrl)
$web=$spSite.Openweb()
$webpartmanager=$web.GetLimitedWebPartManager($pageURL, [System.Web.UI.WebControls.WebParts.PersonalizationScope]::Shared)
foreach ($webpart in $webpartmanager.WebParts)
if ($webpart.Title -eq "Client Information")
{
# Perform the Web Part Close operation
$webpartmanager.CloseWebPart($webpart);
$webpartmanager.SaveChanges($webpart);
}
}
write-host "Webpart Deleted"
Again, if you need to reopen the closed web parts on all your site collections just change CloseWebPart to OpenWebPart and rerun your script against the same .csv file.
So, hope this helps you get a little further with an issue or two.
Sharing the Wealth
SharePointKevin
|
| Join SharePoint architects, developers, and End Users that work with SharePoint for 'SharePoint Saturday', on Saturday, December 11th, 2010. SharePoint Saturday will be an educational, informative & lively day filled with sessions from respected SharePoint professionals & MVPs, covering a wide variety of SharePoint-orientated topics. SharePoint Saturday is FREE, open to the public and is your local chance to immerse yourself in SharePoint!
Visit the SharePoint Saturday Kansas City website for more information: http://sharepointsaturday.org/kc/default.aspx
|
| SharePoint Online is offered as a collaboration and communications tool for organization's Intranets. It offers the following types of functionality.
· Collaboration
· Portals
· Search
· Content Management
· Business Process and Forms
In the standard version, you do not get all the functionality that you would if you implemented your own version of SharePoint on premise or if you subscribed to the Dedicated Version. Here's a look at what you get and don't get.
Collaboration |
What you get:
· Six default site templates (wiki, blog, team site, document workspace, blank, basic meeting)
· Surveys
· People and Groups
· Calendars
· Issue Tracking
· Document Collaboration
· Site Admin templates |
|
What you don't get:
· Presence awareness (without Communicator)
· Social networking
· Templates (all meeting templates except basic)
· Site Templates (My Site, News Site, Internet Presence Site)
· Templates requiring server side code
· Server Admin Templates |
Portals |
What you get:
· Client Integration
· SharePoint Designer Integration
· Audience Targeting to a SharePoint group
· Portal Site templates
· Site Manager
· Site and Document Aggregation
· Document Rollup Web Part
· Mobile Device Support |
|
What you don't get:
· My Sites
· Audience targeting to distribution groups or the ability to create audiences
· Membership web parts
· User Profiles Import
· Back and Restore via SP Designer |
Content Management |
What you get:
· Document Information and Panel Bar
· Site Authoring
· Master Pages, Page Layouts, navigation controls
· Some retention and auditing policies
· Three State Workflow and all standard document workflows
· WYSIWYG Editor
· Standard Publishing Site Templates: Collaboration and Publishing
· Site Variations |
|
What you don't get:
· Content Staging, Publishing and Deployment
· Standard enterprise site templates
· Records repository and legal holds
· Email content as records |
Search |
What you get:
· Search within site collection
· Security trimmed results
· Configurable scope |
|
What you don't get:
· Cross collection search
· Enterprise content sources
· People Search
· Search Federation
· Business Data Search |
Business Process and Forms |
What you get:
· Form Libraries
· Custom no-code workflows |
|
What you don't get:
· Custom workflows that are coded
· Browser-based forms
· SharePoint Server OOTB workflows (except 3-state WF) |
Customization Capabilities
You can do customizations, but you are limited to customizing only what doesn't require coding.
SharePoint Designer is the tool to use to customize your SharePoint Online site. With it you can:
· Create no-code workflows
· Modify and create master pages, page layouts
· Create content types and taxonomy
· Create custom site templates
· Use the Data Form Web Part to create mashups of SharePoint data or other data brought in using Web Services
· Create InfoPath Forms — no code allowed
If you are using Visual Studio to build custom web parts, features or workflows, then you don't want SharePoint Online:
· No in-line code is allowed, including code in InfoPath Forms or custom coded workflows
· Can't create features, site definitions, web parts, solutions — anything that requires something be installed and configured on the server.
· You also can't modify SharePoint files, web.config settings or security
· No custom database modifications
· No configuration changes that affect the web server or the .NET framework
Other Gotchas
- It doesn't support email-enabled lists.
- It doesn't allow for anonymous access.
- Vanity domains are not supported. This means you are stuck with URLs like http://company-1.microsoftonline.com.
|
| I have been inspired by research done by the Association for Information and Image Management (AIIM) that indicates the large growth of SharePoint as a platform of choice for businesses of all sizes but that this growth is being done with without formal business plans or governance. Having been working with SharePoint for a decade (among other technologies and platforms) as both a consultant and an employee part of IT staff in businesses of all different sizes, I think I have some insight into the reasons behind this.
The first is the SharePoint product itself. It is HUGE! It is so capable of filling so many roles within an organization that it can’t easily be pigeon-holed into categories. Managers and Executives cannot easily point to any particular sales material and call SharePoint just a database platform or just a web site technology or just an ECM platform or just anything else. It crosses bounds. But, it also doesn’t do much out of the box. It, like most true platforms (as opposed to applications) is a framework used to build solutions. Oh, it has web sites and some collaborative tools that are easily created. But, OOB, even they won’t do much for a business.
So, the ease of basic deployment of the platform and basic collaborative functionality leads many IT Pros and managers into a false sense of having a clue. SharePoint won’t solve any business problems by itself. It must be designed, configured, tested and deployed. And that takes people specifically skilled in the platform. But, they can’t begin to get started until the business knows what it needs – what problems need to be solved. And most businesses don’t know that…at least not in writing.
Think of building a house. You buy land, you have a number to a lumber yard that will supply you with all the materials you wish to build your house. You call a construction company and pay them to build the house. You want the house done in 30 days, so they better get started. So they get to your land with all their tools, trucks and people. Now, at this point, any construction foreman worth his paycheck would have everyone stop where they are and do absolutely nothing. You tell them that if it isn’t done by your deadline they will be fired – that should get them motivated. They are professionals (we will assume) so they still do not move. They don’t pick up a single hammer or piece of wood. Why? No blueprints. No architect drawings. No plans.
They have no idea what to build. They don’t know what you want except that you want a house. How big? How many rooms? Where do you want the rooms? How many floors? Basement? How many windows and doors? What kind of roof? What kind of heating/cooling? Where will the plumbing and other utilities be run? What kind of insulation? What materials will make up the walls, floors, ceilings? Which direction will the front door face? What kind of lighting do you want? Room for a laundry? Fireplaces? Built-in book cases? Laundry chutes? Copper pipes or PVC? Garage – how big? Attached? Room above?
Do you get the idea? No one in their right mind would start building a house, where their family’s health and well-being will be centered, without plans.
But, businesses do it every day for things that are so fundamentally important to their business’s health and well-being. They buy software, such as SharePoint, buy servers, get one or two people trained or hired and say, “Build me SharePoint.” But…what do they want built? It won’t matter how many incentives, good or bad, you give for building SharePoint if your IT Pros don’t know what to build. So, many businesses are turning to outside consultants, such as the company for which I work. This is great for my paycheck, but no better for my stress than if I was part of that client’s IT team. They come to us and say, “We don’t know how to build SharePoint. Build me SharePoint. Here’s money.”
But, they have still not provided any plan for what to build.
Now, good consultants will ask a lot of questions and maybe even get some good answers. But, the more they have to ask, the more they have to charge – time is money! By this time the business’s managers are usually wavering over whether to scrap SharePoint altogether or to throw “good money after bad” just to save their jobs and/or reputations. So, they pressure the consultants to deliver “something.” And we do. The better of us will try our best to try to deliver something that will make the client happy enough to not stop payment on the check. And if we’ve been able to actually communicate directly with the business employees (not just chosen representatives who rarely have any idea what their people really need) we might just get lucky and provide some business value.
When I was working for HNTB the first thing I was tasked with when I was hired was helping to come up with a Governance Plan for SharePoint. They had already had SharePoint in a limited distribution for a few years but it wasn’t really used. Some in the company didn’t even know it existed. So we wrote a plan. It ended up being more like rules for use more than a plan for the future. But, it was more than most companies have done prior to a wide roll-out of SharePoint. Later, I was tasked with coming up with just such a plan for growth and development for SharePoint. I did my best, but no one really wanted to state what they wanted out of the platform. They knew they had problems, and I knew some of them could be solved with some implementation of SharePoint or systems integrations tech but I just couldn’t get anyone to commit to particular needs or projected uses. My plan, as good as I tried to make it, was almost completely rejected. Of course, portions of it seemed to come up “piecemeal” as things to do from management. Typical.
But, I don’t bring that up about HNTB to tell you how bad they were. On the contrary! They were leaps and bounds ahead of most businesses that implement SharePoint because they, at least, figured out they needed a plan of some sort. True they deployed and then planned. But, they didn’t do a company-wide rollout until after the plan was completed.
Business managers want measurable results. They want a Return on Investment. And they don’t want to have to wait for a year, or more, to get it. I’m not sure why they are so short-sighted. But that might be due to both the platform (again – it doesn’t work like other software) and the general lack of planning in all aspects of businesses that seems to be very wide-spread. Consultants want to make money and so will deliver “something” that looks good and usually provides some functionality. And usually the business managers are happy to have that something to show off to their superiors to show they haven’t just wasted all that money. The business’s IT Pros can then take it and run with it…but they rarely will be given firm direction. They just build and wait for someone to complain. Then they try again.
It is the rare business that actually sees the value in planning prior to purchase. It is the MOST important part of any SharePoint implementation. Otherwise, when it comes down to it – we’re still building a house without blueprints.
|
View in Web Browser /_layouts/VisioWebAccess/VisioWebAccess.aspx?listguid={ListId}&itemid={ItemId}&DefaultItemOpen=1 0x0 0x1 FileType vdw 255 Manage Subscriptions /_layouts/images/ReportServer/Manage_Subscription.gif /_layouts/ReportServer/ManageSubscriptions.aspx?list={ListId}&ID={ItemId} 0x80 0x0 FileType rdl 350 Manage Data Sources /_layouts/ReportServer/DataSourceList.aspx?list={ListId}&ID={ItemId} 0x0 0x20 FileType rdl 351 Manage Shared Datasets /_layouts/ReportServer/DatasetList.aspx?list={ListId}&ID={ItemId} 0x0 0x20 FileType rdl 352 Manage Parameters /_layouts/ReportServer/ParameterList.aspx?list={ListId}&ID={ItemId} 0x0 0x4 FileType rdl 353 Manage Processing Options /_layouts/ReportServer/ReportExecution.aspx?list={ListId}&ID={ItemId} 0x0 0x4 FileType rdl 354 Manage Cache Refresh Plans /_layouts/ReportServer/CacheRefreshPlanList.aspx?list={ListId}&ID={ItemId} 0x0 0x4 FileType rdl 355 View Report History /_layouts/ReportServer/ReportHistory.aspx?list={ListId}&ID={ItemId} 0x0 0x40 FileType rdl 356 View Dependent Items /_layouts/ReportServer/DependentItems.aspx?list={ListId}&ID={ItemId} 0x0 0x4 FileType rsds 350 Edit Data Source Definition /_layouts/ReportServer/SharedDataSource.aspx?list={ListId}&ID={ItemId} 0x0 0x4 FileType rsds 351 View Dependent Items /_layouts/ReportServer/DependentItems.aspx?list={ListId}&ID={ItemId} 0x0 0x4 FileType smdl 350 Manage Clickthrough Reports /_layouts/ReportServer/ModelClickThrough.aspx?list={ListId}&ID={ItemId} 0x0 0x4 FileType smdl 352 Manage Model Item Security /_layouts/ReportServer/ModelItemSecurity.aspx?list={ListId}&ID={ItemId} 0x0 0x2000000 FileType smdl 353 Regenerate Model /_layouts/ReportServer/GenerateModel.aspx?list={ListId}&ID={ItemId} 0x0 0x4 FileType smdl 354 Manage Data Sources /_layouts/ReportServer/DataSourceList.aspx?list={ListId}&ID={ItemId} 0x0 0x20 FileType smdl 351 Load in Report Builder /_layouts/ReportServer/RSAction.aspx?RSAction=ReportBuilderModelContext&list={ListId}&ID={ItemId} 0x0 0x2 FileType smdl 250 Edit in Report Builder /_layouts/images/ReportServer/EditReport.gif /_layouts/ReportServer/RSAction.aspx?RSAction=ReportBuilderReportContext&list={ListId}&ID={ItemId} 0x0 0x4 FileType rdl 250 Edit in Report Builder /_layouts/ReportServer/RSAction.aspx?RSAction=ReportBuilderDatasetContext&list={ListId}&ID={ItemId} 0x0 0x4 FileType rsd 250 Manage Caching Options /_layouts/ReportServer/DatasetCachingOptions.aspx?list={ListId}&ID={ItemId} 0x0 0x4 FileType rsd 350 Manage Cache Refresh Plans /_layouts/ReportServer/CacheRefreshPlanList.aspx?list={ListId}&ID={ItemId}&IsDataset=true 0x0 0x4 FileType rsd 351 Manage Data Sources /_layouts/ReportServer/DataSourceList.aspx?list={ListId}&ID={ItemId} 0x0 0x20 FileType rsd 352 View Dependent Items /_layouts/ReportServer/DependentItems.aspx?list={ListId}&ID={ItemId} 0x0 0x4 FileType rsd 353 Compliance Details javascript:commonShowModalDialog('{SiteUrl}/_layouts/itemexpiration.aspx?ID={ItemId}&List={ListId}', 'center:1;dialogHeight:500px;dialogWidth:500px;resizable:yes;status:no;location:no;menubar:no;help:no', function GotoPageAfterClose(pageid){if(pageid == 'hold') {STSNavigate(unescape(decodeURI('{SiteUrl}'))+'/_layouts/hold.aspx?ID={ItemId}&List={ListId}'); return false;} if(pageid == 'audit') {STSNavigate(unescape(decodeURI('{SiteUrl}'))+'/_layouts/Reporting.aspx?Category=Auditing&backtype=item&ID={ItemId}&List={ListId}'); return false;} if(pageid == 'config') {STSNavigate(unescape(decodeURI('{SiteUrl}'))+'/_layouts/expirationconfig.aspx?ID={ItemId}&List={ListId}'); return false;}}, null); return false; 0x0 0x1 ContentType 0x01 898 Edit in Browser /_layouts/images/icxddoc.gif /_layouts/formserver.aspx?XsnLocation={ItemUrl}&OpenIn=Browser&Source={Source} 0x0 0x1 FileType xsn 255 Edit in Browser /_layouts/images/icxddoc.gif /_layouts/formserver.aspx?XmlLocation={ItemUrl}&OpenIn=Browser&Source={Source} 0x0 0x1 ProgId InfoPath.Document 255 Edit in Browser /_layouts/images/icxddoc.gif /_layouts/formserver.aspx?XmlLocation={ItemUrl}&OpenIn=Browser&Source={Source} 0x0 0x1 ProgId InfoPath.Document.2 255 Edit in Browser /_layouts/images/icxddoc.gif /_layouts/formserver.aspx?XmlLocation={ItemUrl}&OpenIn=Browser&Source={Source} 0x0 0x1 ProgId InfoPath.Document.3 255 Edit in Browser /_layouts/images/icxddoc.gif /_layouts/formserver.aspx?XmlLocation={ItemUrl}&OpenIn=Browser&Source={Source} 0x0 0x1 ProgId InfoPath.Document.4 255 View in Browser /_layouts/xlviewer.aspx?id={ItemUrl}&DefaultItemOpen=1 0x0 0x1 FileType xlsx 255 View in Browser /_layouts/xlviewer.aspx?id={ItemUrl}&DefaultItemOpen=1 0x0 0x1 FileType xlsm 255 View in Browser /_layouts/xlviewer.aspx?id={ItemUrl}&DefaultItemOpen=1 0x0 0x1 FileType xlsb 255 |
|
|
|
|
|
|
|
View in Web Browser /_layouts/VisioWebAccess/VisioWebAccess.aspx?listguid={ListId}&itemid={ItemId}&DefaultItemOpen=1 0x0 0x1 FileType vdw 255 Manage Subscriptions /_layouts/images/ReportServer/Manage_Subscription.gif /_layouts/ReportServer/ManageSubscriptions.aspx?list={ListId}&ID={ItemId} 0x80 0x0 FileType rdl 350 Manage Data Sources /_layouts/ReportServer/DataSourceList.aspx?list={ListId}&ID={ItemId} 0x0 0x20 FileType rdl 351 Manage Shared Datasets /_layouts/ReportServer/DatasetList.aspx?list={ListId}&ID={ItemId} 0x0 0x20 FileType rdl 352 Manage Parameters /_layouts/ReportServer/ParameterList.aspx?list={ListId}&ID={ItemId} 0x0 0x4 FileType rdl 353 Manage Processing Options /_layouts/ReportServer/ReportExecution.aspx?list={ListId}&ID={ItemId} 0x0 0x4 FileType rdl 354 Manage Cache Refresh Plans /_layouts/ReportServer/CacheRefreshPlanList.aspx?list={ListId}&ID={ItemId} 0x0 0x4 FileType rdl 355 View Report History /_layouts/ReportServer/ReportHistory.aspx?list={ListId}&ID={ItemId} 0x0 0x40 FileType rdl 356 View Dependent Items /_layouts/ReportServer/DependentItems.aspx?list={ListId}&ID={ItemId} 0x0 0x4 FileType rsds 350 Edit Data Source Definition /_layouts/ReportServer/SharedDataSource.aspx?list={ListId}&ID={ItemId} 0x0 0x4 FileType rsds 351 View Dependent Items /_layouts/ReportServer/DependentItems.aspx?list={ListId}&ID={ItemId} 0x0 0x4 FileType smdl 350 Manage Clickthrough Reports /_layouts/ReportServer/ModelClickThrough.aspx?list={ListId}&ID={ItemId} 0x0 0x4 FileType smdl 352 Manage Model Item Security /_layouts/ReportServer/ModelItemSecurity.aspx?list={ListId}&ID={ItemId} 0x0 0x2000000 FileType smdl 353 Regenerate Model /_layouts/ReportServer/GenerateModel.aspx?list={ListId}&ID={ItemId} 0x0 0x4 FileType smdl 354 Manage Data Sources /_layouts/ReportServer/DataSourceList.aspx?list={ListId}&ID={ItemId} 0x0 0x20 FileType smdl 351 Load in Report Builder /_layouts/ReportServer/RSAction.aspx?RSAction=ReportBuilderModelContext&list={ListId}&ID={ItemId} 0x0 0x2 FileType smdl 250 Edit in Report Builder /_layouts/images/ReportServer/EditReport.gif /_layouts/ReportServer/RSAction.aspx?RSAction=ReportBuilderReportContext&list={ListId}&ID={ItemId} 0x0 0x4 FileType rdl 250 Edit in Report Builder /_layouts/ReportServer/RSAction.aspx?RSAction=ReportBuilderDatasetContext&list={ListId}&ID={ItemId} 0x0 0x4 FileType rsd 250 Manage Caching Options /_layouts/ReportServer/DatasetCachingOptions.aspx?list={ListId}&ID={ItemId} 0x0 0x4 FileType rsd 350 Manage Cache Refresh Plans /_layouts/ReportServer/CacheRefreshPlanList.aspx?list={ListId}&ID={ItemId}&IsDataset=true 0x0 0x4 FileType rsd 351 Manage Data Sources /_layouts/ReportServer/DataSourceList.aspx?list={ListId}&ID={ItemId} 0x0 0x20 FileType rsd 352 View Dependent Items /_layouts/ReportServer/DependentItems.aspx?list={ListId}&ID={ItemId} 0x0 0x4 FileType rsd 353 Compliance Details javascript:commonShowModalDialog('{SiteUrl}/_layouts/itemexpiration.aspx?ID={ItemId}&List={ListId}', 'center:1;dialogHeight:500px;dialogWidth:500px;resizable:yes;status:no;location:no;menubar:no;help:no', function GotoPageAfterClose(pageid){if(pageid == 'hold') {STSNavigate(unescape(decodeURI('{SiteUrl}'))+'/_layouts/hold.aspx?ID={ItemId}&List={ListId}'); return false;} if(pageid == 'audit') {STSNavigate(unescape(decodeURI('{SiteUrl}'))+'/_layouts/Reporting.aspx?Category=Auditing&backtype=item&ID={ItemId}&List={ListId}'); return false;} if(pageid == 'config') {STSNavigate(unescape(decodeURI('{SiteUrl}'))+'/_layouts/expirationconfig.aspx?ID={ItemId}&List={ListId}'); return false;}}, null); return false; 0x0 0x1 ContentType 0x01 898 Edit in Browser /_layouts/images/icxddoc.gif /_layouts/formserver.aspx?XsnLocation={ItemUrl}&OpenIn=Browser&Source={Source} 0x0 0x1 FileType xsn 255 Edit in Browser /_layouts/images/icxddoc.gif /_layouts/formserver.aspx?XmlLocation={ItemUrl}&OpenIn=Browser&Source={Source} 0x0 0x1 ProgId InfoPath.Document 255 Edit in Browser /_layouts/images/icxddoc.gif /_layouts/formserver.aspx?XmlLocation={ItemUrl}&OpenIn=Browser&Source={Source} 0x0 0x1 ProgId InfoPath.Document.2 255 Edit in Browser /_layouts/images/icxddoc.gif /_layouts/formserver.aspx?XmlLocation={ItemUrl}&OpenIn=Browser&Source={Source} 0x0 0x1 ProgId InfoPath.Document.3 255 Edit in Browser /_layouts/images/icxddoc.gif /_layouts/formserver.aspx?XmlLocation={ItemUrl}&OpenIn=Browser&Source={Source} 0x0 0x1 ProgId InfoPath.Document.4 255 View in Browser /_layouts/xlviewer.aspx?id={ItemUrl}&DefaultItemOpen=1 0x0 0x1 FileType xlsx 255 View in Browser /_layouts/xlviewer.aspx?id={ItemUrl}&DefaultItemOpen=1 0x0 0x1 FileType xlsm 255 View in Browser /_layouts/xlviewer.aspx?id={ItemUrl}&DefaultItemOpen=1 0x0 0x1 FileType xlsb 255 |
|
|
|
|