Posts Tagged ‘Tips’
September 16th, 2013 by Tobias Zimmergren
So recently, while working with the (awesome!) Work Management Service Application in some of our environments, we got the common problem of not receiving any actual tasks on our My Sites. The reason is that we see this message instead:
Now, throw a google query and you’ll find plenty of resources and fixes for how to configure the permissions of your Service Applications in order to make this service work.
Due to various policies, restrictions and IT related stuff we couldn’t just configure permissions in any way we wanted. So we needed to figure out another way to fix this simple problem.
The solution is simple, for us:
- Delete your Work Management Service Application
- Re-create a new Work Management Service Application
- Create a new Application Pool, but use the same account as for the Application Pool hosting your My Sites/Social or Portal.
- Run a crawl
- Incremental, continuous or full crawl should suffice.
In some scenarios this may work, in others it may not work. For our various farms (Test, Pre-Production, Production) it works great, and given it works in 3 different environments (with different accounts et al) it’s pretty neat.
After the crawl did it’s job, I could start engaging the Tasks list on my My Site with collective tasks throughout my entire farm:
Looks like it did the trick, and the tasks are now working like a charm including all data related to the task.
If this still doesn’t work, check this TechNet article out about configuring the service permissions. Doing the above and configuring the permissions should definitely do the trick (http://social.technet.microsoft.com/wiki/contents/articles/12525.sharepoint-2013-work-management-service-application.aspx)
And here’s another tip if you’re still having issues: http://honggyem.blogspot.se/2013/05/my-tasks-not-updating-seen-following.html
Instead of messing about with permissions (for various reasons) we’ve managed to get it started and working with simply configuring the same Application Pool account. Should that not suffice, a combination will more likely work.
September 16th, 2013 by Tobias Zimmergren
In one of the projects I’m currently involved, we’re in the process of upgrading from SharePoint 2010 to SharePoint 2013. One of the problems we faced were the fact that we had some orphaned content databases in our production environments, but the problem didn’t surface in SharePoint 2010 but was given light in 2013. So this short post is talking about how I fixed those issues, which was a bit of a pain to be honest.
In the environments we’re working, we’ve set up a scheduled upgrade that takes place once every week on a schedule. The reason for this is to re-iterate the upgrade process as many times we can, with production data, before the actual upgrade which will take place later down the road when all bugs, code tweaks/customizations and other random problems have been taken care of. One of the problems that surfaced recently was that we couldn’t create any new Site Collections, where the ULS spit out the unfortunate message:
Application error when access /_admin/createsite.aspx, Error=Object reference not set to an instance of an object. at Microsoft.SharePoint.Administration.SPContentDatabaseCollection.FindBestContentDatabaseForSiteCreation(IEnumerable`1 contentDatabases, Guid siteIdToAvoid, Guid webIdToAvoid, SPContentDatabase database, SPContentDatabase databaseTheSiteWillBeDeletedFrom)
While it took some time to boil down the nuts of what was going on, here’s the details in case you end up with the same issues.
Cannot create new Site Collections
So the problem we faced of not being able to create new Site Collections surfaced itself in the ULS logs, stating this message:
Application error when access /_admin/createsite.aspx, Error=Object reference not set to an instance of an object. at Microsoft.SharePoint.Administration.SPContentDatabaseCollection.FindBestContentDatabaseForSiteCreation(IEnumerable`1 contentDatabases, Guid siteIdToAvoid, Guid webIdToAvoid, SPContentDatabase database, SPContentDatabase databaseTheSiteWillBeDeletedFrom) at Microsoft.SharePoint.Administration.SPContentDatabaseCollection.FindBestContentDatabaseForSiteCreation(SPSiteCreationParameters siteCreationParameters, Guid siteIdToAvoid, Guid webIdToAvoid, SPContentDatabase database, SPContentDatabase databaseTheSiteWillBeDeletedFrom) at Microsoft.SharePoint.Administration.SPContentDatabaseCollection.FindBestContentDatabaseForSiteCreation(SPSiteCreationParameters siteCreationParameters) at Microsoft.SharePoint.Administration.SPSiteCollection.Add(SPContentDatabase database, SPSiteSubscription siteSubscription, String siteUrl, String title, String description, UInt32 nLCID, Int32 compatibilityLevel, String webTemplate, String ownerLogin, String ownerName, String ownerEmail, String secondaryContactLogin, String secondaryContactName, String secondaryContactEmail, String quotaTemplate, String sscRootWebUrl, Boolean useHostHeaderAsSiteName, Boolean overrideCompatibilityRestriction) at Microsoft.SharePoint.Administration.SPSiteCollection.Add(SPSiteSubscription siteSubscription, String siteUrl, String title, String description, UInt32 nLCID, Int32 compatibilityLevel, String webTemplate, String ownerLogin, String ownerName, String ownerEmail, String secondaryContactLogin, String secondaryContactName, String secondaryContactEmail, Boolean useHostHeaderAsSiteName) at Microsoft.SharePoint.ApplicationPages.CreateSitePage.BtnCreateSite_Click(Object sender, EventArgs e) at System.Web.UI.WebControls.Button.RaisePostBackEvent(String eventArgument) at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)
Given some reflector magic and investigations I found out that this specific method causing the problem was looking for the best Content Database to put the new Site Collection in. While it was trying to do this, it obviously want to balance the Site Collections in a way that means they’re evenly distributed over the Content Databases.
The reason for why we got this error message is due to invalid references in our Config database pointing to Content Databases that no longer exist, for whatever reason. The result of this is that the method tried to create the new Site Collection into a Content Database that doesn’t really exist, even though SharePoint thought it existed.
Steps to find and kill the broken/invalid references to the non-existent content databases
After some SQL magic, finding out the null-references were rather easy. Following these steps allowed me to figure out the details of the broken databases:
Step 1: Get the Web Application ID
Either use SharePoint Manager or simply a quick PowerShell statement to quickly figure out the GUID of your Web Application where the problem is persisted:
$wa = Get-SPWebApplication http://awesome.intranet.com $wa.ID
Obviously you should note/save this ID for reference in the next steps.
Step 2: Query your Config database for the appropriate information
Save this ID, head on over to your SQL server and run this command (replace GUID with your ID from Web App)
USE SP13_Config SELECT ID, CAST(Properties as XML) AS 'Properties' FROM Objects WHERE ID = 'GUID' -- GUID of the Web Application
As you can see when using the CAST(Properties as XML) bit of the query, you can get a clickable link in the results window given you an awesome overview of the XML represented. Thanks to a SQL friend of mine for pointing that out, saved the day
Here’s what the results looks like (1 row):
Step 3: Investigate the returned results (XML) and find your null-values
Click the XML link and find this section containing the Microsoft.SharePoint.Administration.SPContentDatabaseCollection and see if you find any place where the fld value is null, something like this:
As you can see, most of the databases in our environment has a sFld and a fld xml node where the GUID of the database are stored. However in some cases (in 2 places in our environment!) you may find that it says null instead. That is essentially your invalid reference pointing to nothing at all. So SharePoint tries to create the Site Collection in the Content Database with the null-fld.
As with previous steps, make a note of the GUID from your broken database references.
Step 4: Delete the database(s) using PowerShell
The best way we found to delete these databases were by using PowerShell. At first I didn’t think it actually worked, but after re-running the SQL query after running the PowerShell command it occurred to me that the command had actually removed the invalid reference. The reason for why I didn’t think it worked is because PowerShell is throwing some errors on the screen for you, but it looks as if it’s actually working the right magic under the hood for us – thus leaving us with an intact and working farm again.
So, make sure you’ve got the ID’s of your broken databases and first and foremost make sure that you haven’t copied the incorrect GUID (!) – what I did was simply query my Web Application and filtered the query to give me the ID and Names of all Content Databases so I could make sure that I didn’t delete an actual Content Database by mistake.
$wa.ContentDatabases | ft ID, Name
After running this command we got a list of databases where we could just make sure that the GUID’s we’ve coped didn’t actually represent any of our real databases that were intact:
Great, now that I’m sure the ID of the databases I copied isn’t the ID of a production DB which I know is intact, but represents my broken ones, I can execute the delete-command on those buggers!
In order to do that, I simply ran this PowerShell command:
The results of this were as follows, causing a lot of nice error messages.. However, the magic under the hood still worked:
Step 5: Verify by running the SQL query again
So the PowerShell throws an error message stating that “Object reference not set to an instance of an object.”, however under the hood the magic has been applied properly and in my Config-database the values that were incorrect are now deleted as can be verified if we re-run the SQL query:
Well, I’ve learnt a lot this week about the Config database and playing around with the GUIDs within. The scary part was that these errors didn’t surface in SharePoint 2010, but they did in 2013 once we upgraded. Another good reason to get a good iterative upgrade-routine in place before an actual upgrade is attempted.
Speaking about iterative upgrade processes I might discuss that in a future post, namely how we commence our upgrades every week without lifting a finger (almost)
July 14th, 2009 by Tobias Zimmergren
Lately I’ve been looking around for some decent rich text editors for use in my asp.net (and SharePoint) applications.
I found this awesome article explaining 20 free rich text editors you can use, some better than others: http://www.webdesignerdepot.com/2008/12/20-excellent-free-rich-text-editors/
My favorite ones
As for which ones I would call my favorite (based on functionality, compatibility, performance and ease of deployment) – I would have to say:
- http://freetextbox.com/ [ASP.NET Based Editor]
Just be sure to read the license for each of the different editors. Some are GPL/LGPL, others are completely unlicensed and some uses other licensing models.
April 5th, 2007 by Tobias Zimmergren
This is by no means meant to be anything other than a small tip on how to interact with the object model. If you need more information on how to interact and code with the object model, drop me a comment. But for now this is just to show you guys out there who havn’t done any coding with SharePoint, that it’s actually a piece of cake!
Start off by creating a new Visual Studio 2005 Windows Forms application.
Add the following namespaces: (Administration-namespace might not be needed depending what you want to do further from this point)
Also make sure you’ve got something in the Recyclebin that will show up when we launch our application later:
I made an interface like this, really hot:
Then just add the following simple code:
That’s all there’s too it! It’s not hard at all to interact with the object model. As you can see I’ve used the commonly used SPSite which contains the SPRecycleBinItem. From this point, you should know how to move on with this. An example, all you need to do in order to enable deletion of things in that recyclebin from your application is to use the .Delete() method of the SPRecycleBinItem called rItem in this case.
All very basic, should get you interested if nothing else!
March 18th, 2007 by Tobias Zimmergren
This is the first post I’m making in a series of small "how-to’s" and "aha!"-posts. It will be basic stuff that you often want to know, and why not write them down here instead of in a hidden document that I’ll forget about..
Today’s tip is: Enabling Annonymous Access to your site
- Begin by navigating to central administration (CA from now)
- Choose Application Management
- Choose Authentication Providers in the Application Security section
- Select the correct web application
- Click the Default Zone link
- Check Enable Anonymous Access and hit Save
From the Permissions-page in your site you can choose Settings -> Anonymous Access and from there make ajustments to what permissions anonymous access will have.
November 16th, 2006 by Tobias Zimmergren
In this post I will show you how to configure search by creating a content source that should be indexed and a search scope to limit the results when searcing. I will also show you how to customize the Search Center and adding a tab with a custom search and search results page.
I will walk you though how to set up searchscopes and content sources (such as fileshares).
We will begin by creating a content source and a search scope This will presume that youve got a network share with files and folders, e.g. the share whateversomeShare mapped against Z: on your local system.
1. Open SharePoint Central Administration and the Shared Services Provider admin site.
2. Open the Search Settings page
3. Choose the Content Sources link in the Crawl Settings section.
4. Choose New Content Source in the toolbar menu
5. Enter a name (I used "Demo Documents")
6. Choose File Shares as Content Source Type
7. Enter the start address (e.g. whateversomeShare)
8. Choose if it should include all subfolders or not under Crawl Settings
9. Set a schedule of your preference and choose to start the crawl if you want, then click OK
10. It should now look something similar to this image:
(Image broken due to SharePointBlogs.com crash )
Now you need to start the crawl, if you didn’t do so when creating the content source
Creating a scope to narrow down the search results to only file shares
1. Navigate to Site Settings
2. Click on View Scopes in the Scope Settings section
3. Click Create New Scope in the toolbar and enter e.g. "File Shares" as the name and click OK
4. Note that the "Items" column states "Empty".
5. Click on the name (File Shares) to navigate to the Scope Properties and Rules page
6. Select "Empty > Add rules"
7. Select "Demo Documents" in the Content Scope and press OK to create the rule.
8. Now note that it says "New Scope – Ready after the next update (starts in n minutes)." To avoid this waitint time, go back to the Search Settings and click "Start Update Now" under the Scopes section.
9. Click the Site Settings menu at the top right of this site collection and choose Search scopes
10. Click the "Search Dropdown" display group and then check the "File Shares" scope and click OK.
11. Go to the Search Center to validate that the scope actually works and shows in the drop down
October 26th, 2006 by Tobias Zimmergren
Monday through wednesday (today) I went the T2617 course held by Göran Husman, Sweden’s only MVP in sharePoint. The overall impression was great, and my thanks goes out to Göran who did a great job as the tutor.
I will in my upcoming post(s) describe some of the subjects covered, and what that really means. I will set up a MOSS 2007 labenvironment on which I’ll make some examples and try to explain some general concepts that are new for 2007.
I’ll update you guys in a couple of days.
September 28th, 2006 by Tobias Zimmergren
<!DOCTYPE html PUBLIC “-//W3C//DTD HTML 4.01 Transitional//EN” “http://www.w3.org/TR/html4/loose.dtd“>
<%@ Import Namespace=”Microsoft.SharePoint” %>
<%@ Register Tagprefix=”SPSWC” Namespace=”Microsoft.SharePoint.Portal.WebControls” Assembly=”Microsoft.SharePoint.Portal, Version=126.96.36.199, Culture=neutral, PublicKeyToken=71e9bce111e9429c” %>
<%@ Register Tagprefix=”SharePoint” Namespace=”Microsoft.SharePoint.WebControls” Assembly=”Microsoft.SharePoint, Version=188.8.131.52, Culture=neutral, PublicKeyToken=71e9bce111e9429c” %>
<%@ Register Tagprefix=”WebPartPages” Namespace=”Microsoft.SharePoint.WebPartPages” Assembly=”Microsoft.SharePoint, Version=184.108.40.206, Culture=neutral, PublicKeyToken=71e9bce111e9429c” %>
<%@ Register Tagprefix=”PublishingWebControls” Namespace=”Microsoft.SharePoint.Publishing.WebControls” Assembly=”Microsoft.SharePoint.Publishing, Version=220.127.116.11, Culture=neutral, PublicKeyToken=71e9bce111e9429c” %>
<%@ Register Tagprefix=”PublishingNavigation” Namespace=”Microsoft.SharePoint.Publishing.Navigation” Assembly=”Microsoft.SharePoint.Publishing, Version=18.104.22.168, Culture=neutral, PublicKeyToken=71e9bce111e9429c” %>
<%@ Register TagPrefix=”wssuc” TagName=”Welcome” src=”~/_controltemplates/Welcome.ascx” %>
<%@ Register TagPrefix=”wssuc” TagName=”DesignModeConsole” src=”~/_controltemplates/DesignModeConsole.ascx” %>
<%@ Register TagPrefix=”PublishingVariations” TagName=”VariationsLabelMenu” src=”~/_controltemplates/VariationsLabelMenu.ascx” %>
<%@ Register Tagprefix=”PublishingConsole” TagName=”Console” src=”~/_controltemplates/PublishingConsole.ascx” %>
<%@ Register TagPrefix=”PublishingSiteAction” TagName=”SiteActionMenu” src=”~/_controltemplates/PublishingActionMenu.ascx” %>
<asp:ContentPlaceHolder runat=”server” id=”head”>
<asp:ContentPlaceHolder id=”PlaceHolderPageTitle” runat=”server” />
<asp:ContentPlaceHolder id=”PlaceHolderAdditionalPageHead” runat=”server” />
<form runat=”server” onsubmit=”return _spFormOnSubmitWrapper();”>
<wssuc:Welcome id=”explitLogout” runat=”server”/>
<PublishingWebControls:AuthoringContainer id=”authoringcontrols” runat=”server”>
<PublishingConsole:Console runat=”server” />
<asp:ContentPlaceHolder id=”PlaceHolderMain” runat=”server” />
<asp:Panel visible=”false” runat=”server”>
<asp:ContentPlaceHolder id=”PlaceHolderSearchArea” runat=”server”/>
<asp:ContentPlaceHolder id=”PlaceHolderTitleBreadcrumb” runat=”server”/>
<asp:ContentPlaceHolder id=”PlaceHolderPageTitleInTitleArea” runat=”server”/>
<asp:ContentPlaceHolder id=”PlaceHolderLeftNavBar” runat=”server”/>
<asp:ContentPlaceHolder ID=”PlaceHolderPageImage” runat=”server”/>
<asp:ContentPlaceHolder ID=”PlaceHolderBodyLeftBorder” runat=”server”/>
<asp:ContentPlaceHolder ID=”PlaceHolderNavSpacer” runat=”server”/>
<asp:ContentPlaceHolder ID=”PlaceHolderTitleLeftBorder” runat=”server”/>
<asp:ContentPlaceHolder ID=”PlaceHolderTitleAreaSeparator” runat=”server”/>
<asp:ContentPlaceHolder ID=”PlaceHolderMiniConsole” runat=”server”/>
<asp:ContentPlaceHolder id=”PlaceHolderCalendarNavigator” runat =”server” />
<asp:ContentPlaceHolder id=”PlaceHolderLeftActions” runat =”server”/>
<asp:ContentPlaceHolder id=”PlaceHolderPageDescription” runat =”server”/>
<asp:ContentPlaceHolder id=”PlaceHolderBodyAreaClass” runat =”server”/>
<asp:ContentPlaceHolder id=”PlaceHolderTitleAreaClass” runat =”server”/>
######### Page file ends here ############