If your Release Management application pool keeps crashing and you get the following error: Message: Object reference not set to an instance of an object.: \r\n\r\n at (Object ) … at RM.MonitoringAgent.Services.MonitorService.ProcessScheduledPromotions(), run the following command to fix the issue:
appcmd.exe set config -section:system.webServer/globalModules /[name='SPNativeRequestModule'].preCondition:integratedMode,bitness64
Make sure that you run this command as an administrator.
For those who have attended At The Movies (ATM) event in the past, I'm happy to announce that ATM event is back on. You know it'll be awesome, so make you register at http://objectsharp.com/atm before we run out of space in Scotibank movie theater.
For those who have not attended At The Movies (ATM) event in the past, well, you have missed out on a lot of fun (and expert knowledge.) So, don't let that happen to you again and register for the event at http://objectsharp.com/atm. You will not be disappointed. Did I mention that this is a free event?!?
To remind you how awesome ATM events are, I have added a few links to old videos from past ATM events:
What can I say. Visual Studio, TFS, Azure, SharePoint , Windows 8, etc. Pure geeky fun time. See you there on May 8th, 2014! :)
OK, so I'm upgrading TFS 2008 with SharePoint Foundation 2007 installation to TFS 2013 with SharePoint Foundation 2013. Naturally, you do an upgrade using an intermediary server with TFS 2012 with SharePoint 2010 install, because you cannot upgrade TFS 2008 to TFS 2013 directly (you have to upgrade to TFS 2012 first), just as you cannot upgrade SharePoint 2007 to SharePoint 2013 (you have to upgrade to SharePoint 2010 first). All goes well except for the SharePoint portion of the upgrade.
Running Test-SPContentDatabase against SharePoint content database produces a few weird errors, like:
Category : MissingFeature Error : True UpgradeBlocking : False Message : Database [WSS_Content] has reference(s) to a missing feature: Id = [00bfea71-c796-4402-9f2f-0eb9a6e71b18], Name = [Wiki Page Library], Description = [An interconnected set of easily editable web pages, which can contain text, images and web parts.], Install Location = [WebPageLibrary]. Remedy : The feature with Id 00bfea71-c796-4402-9f2f-0eb9a6e71b18 is referenced in the database [WSS_Content], but is not installed on the current farm. The missing feature may cause upgrade to fail. Please install any solution which contains the feature and restart upgrade if necessary
You would think that Wiki Page Library feature should exist in new SharePoint, and it does, but the error still shows up. Makes no sense, right. Well, if you try to go ahead and proceed with an upgrade anyways, you will see even stranger things. Upgrade completes successfully, but none of the SharePoint pages come up properly. None of the "default" SharePoint web parts come up properly. To make things worse, you cannot get to any of the system pages in SharePoint. When you try to access any system pages, like Site Settings, you get Access Denied errors (strange part is that you are denied access to built-in v4.master master page; how is that possible!). Very strange…
After a bit of digging on the web, I have found a solution. Apparently, the problem was caused by the fact that SharePoint 2013 has two modes (hives), 2010 (v14) and 2013 (v15). Apparently, by default, a new SharePoint 2013 installation mostly only installs v15 features. Using SharePoint Feature Admin Tool, we can tell that v14 features we needed were not installed. Now that we know that we can simply install missing v14 features individually using SharePoint 2013 Management Shell or we can simply install all existing features in both the v14 or v15 hives by running the following cmdlet.
Install-SPFeature -AllExistingFeatures
Second approach was easier, so I run with it. Running that cmdlet fixed all of my SharePoint problems, and that's a good thing.
Release Management for Visual Studio 2013 (formerly known as inRelease client) is tightly integrated with Team Foundation Server (TFS 2010, TFS 2012 and TFS 2013 versions are supported. Visual Studio Online is not supported yet) To connect Release Management server to Team Foundation Server, you need to use Release Management Client for Visual Studio 2013:
- Launch Release Management Client for Visual Studio 2013. If you launch it for the first time, you will be prompted with Configure Services dialog window. Just enter Release Management server name and port number, and click on OK.
- Click Administration tab to connect Release Management server to TFS. Then, click on Manage TFS section.
- Click New button to add a TFS connection. You can add connections to many project collections hosted on different TFS servers or many separate project collections hosted on the same TFS server.
- Provide the following connection settings:
- name or the URL of TFS server
- name of the project collection
- service account credentials to connect to TFS
- HTTP/HTTPs protocol used to connect to TFS
- Click Verify to validate the settings provided.
- Click Save and Close to save the connection to TFS
That's all. Now you should be able to start using Release Management server with TFS. Oh, almost forgot, to configure connection to TFS, your account(s) must have the following minimal permissions
- Collection Level
- 'Make requests on behalf of others' permission (required to setup TFS Connection in release management server)
- 'View collection-level information' permission (to get list of Build Definitions on behalf of current user)
- 'View build resources' permission (to set a Build to Release)
- Team Project Level – for all projects used in release management
- 'View project-level information' permission (to add a TFS Group)
- Build Definition Level – for all build definitions used in release management server
- 'Retain Indefinitely' permission (when starting a Release)
To keep things simple, you can simply make service account used by release management server to connect to TFS a member of the Project Collection Service Accounts group.
If you’re working with the Release Management Server (and you should, because it's awesome) and cannot find the location of the Release Management Build Process Template, then try looking under
C:\Program Files (x86)\ Microsoft Visual Studio 12.0\ReleaseManagement\bin.
In some cases you might only see ReleaseDefaultTemplate.11.1.xaml (TFS 2012 build template) or ReleaseDefaultTemplate.xaml (TFS 2010 build template) under C:\Program Files (x86)\ Microsoft Visual Studio 12.0\ReleaseManagement\bin. But where is TFS 2013 build template you might ask. Without one you cannot properly integrate Release Management with TFS 2013, which would be fairly disappointing. Luckily, you can download TFS 2013 template here. Inside this .zip file you will find three files:
- TfvcTemplate.12.xaml (for when you're using TfvcTemplate.12.xaml)
- GitTemplate.12.xaml (for when you're using GitTemplate.12.xaml)
- ReleaseTemplate.12.Snippets.xaml (for when you would like to add release management functionality to your custom TFS 2013 build template. snippets file only contains sections with start / end markers to indicate which parts to copy)
Please note that, Release Management Build Process Template are not installed in TFS by default, so it won’t appear as an available build process template until you add it. To add the release management build process template, you will need to check it in to your TFS source control, and then add the build process file when editing (or adding) a Build Definition. Once the release management template has been added to the list of build templates, you can start using it. More on how to use release management build template later...
TFS Release Management allows you to use deployment metadata as a value for configuration variables in release templates. It comes in very handy when you need to refer to the build drop location or build number. The following is the list of available Metadata that can be used with Configuration Variables.
Build Directory $(PackageLocation)
Build Number $(BuildNumber)
Build Definition $(BuildDefinition)
TFS Collection $(TfsUrlWithCollection)
Team Project $(TeamProject)
Unfortunately, you cannot create custom deployment metadata just yet. Hopefully that will change one day. Another "catch" is that deployment metadata can only be used in components. Deployment metadata cannot be used in actions or tools because those are taking place outside of the build process.
At one of our clients, TFS build server was choking for no good reason with the following error “Please contact your administrator. There was an error contacting the server. Technical information (for administrator): System.ServiceModel.ServiceActivationException.” Not very useful error message, isn’t it? TFS logs were a bit more informative and had the following error:
WebHost failed to process a request.
Sender Information: System.ServiceModel.ServiceHostingEnvironment+HostingManager/4342953
Exception: System.ServiceModel.ServiceActivationException: The service '/tfs/queue/DefaultCollection/Services/v4.0/MessageQueueService2.svc' cannot be activated due to an exception during compilation. The exception message is: This collection already contains an address with scheme http. There can be at most one address per scheme in this collection. If your service is being hosted in IIS you can fix the problem by setting 'system.serviceModel/serviceHostingEnvironment/multipleSiteBindingsEnabled' to true or specifying 'system.serviceModel/serviceHostingEnvironment/baseAddressPrefixFilters'.
Parameter name: item. ---> System.ArgumentException: This collection already contains an address with scheme http. There can be at most one address per scheme in this collection. If your service is being hosted in IIS you can fix the problem by setting 'system.serviceModel/serviceHostingEnvironment/multipleSiteBindingsEnabled' to true or specifying 'system.serviceModel/serviceHostingEnvironment/baseAddressPrefixFilters'.
Parameter name: item
at System.ServiceModel.UriSchemeKeyedCollection.InsertItem(Int32 index, Uri item)
at System.Collections.Generic.SynchronizedCollection`1.Add(T item)
at System.ServiceModel.UriSchemeKeyedCollection..ctor(Uri[] addresses)
at System.ServiceModel.ServiceHost..ctor(Type serviceType, Uri[] baseAddresses)
at System.ServiceModel.Activation.ServiceHostFactory.CreateServiceHost(Type serviceType, Uri[] baseAddresses)
at System.ServiceModel.Activation.ServiceHostFactory.CreateServiceHost(String constructorString, Uri[] baseAddresses)
at System.ServiceModel.ServiceHostingEnvironment.HostingManager.CreateService(String normalizedVirtualPath, EventTraceActivity eventTraceActivity)
at System.ServiceModel.ServiceHostingEnvironment.HostingManager.ActivateService(ServiceActivationInfo serviceActivationInfo, EventTraceActivity eventTraceActivity)
at System.ServiceModel.ServiceHostingEnvironment.HostingManager.EnsureServiceAvailable(String normalizedVirtualPath, EventTraceActivity eventTraceActivity)
--- End of inner exception stack trace ---
at System.ServiceModel.ServiceHostingEnvironment.HostingManager.EnsureServiceAvailable(String normalizedVirtualPath, EventTraceActivity eventTraceActivity)
at System.ServiceModel.ServiceHostingEnvironment.EnsureServiceAvailableFast(String relativeVirtualPath, EventTraceActivity eventTraceActivity)
Process Name: w3wp
Now, that’s a much better error message. It actually tells us that the problem is caused by multiple bindings in IIS on TFS website and it tells us how this error can be fixed. I love such errors. Anyway, to fix the problem we need to add the following line to web.config file on TFS server:
<serviceHostingEnvironment
aspNetCompatibilityEnabled=”true"
multipleSiteBindingsEnabled="true"
/>
Then restart TFS Build Service, and it’s all good again…
Recently we have come across an interesting bug in Office 365. In the scenario where you use ADFS to authenticate your Office 365 users and some of the users have multiple email address aliases assigned using adsiedit.msc, Lync might display a wrong name.
For example, user’s name is Walter and his primary email address is walter@office365-is-awesome.com (not a real email address). Imagine that Walter’s colleague Jesse is leaving the company and they need Walter to take over Jesse’s clients and make sure that all emails that addressed to Jesse are now sent to Walter. At the same time, you don’t want to keep Jesse’s mailbox active because Office 365 charges you per mailbox and that would be a waste of money. So, you archive Jesse’s existing mailbox and add an alias jesse@office365-is-awesome.com to Walter’s mailbox. And, because you use ADFS, you have to add aliases using adsiedit.msc instead going through Office 365 management portal. Make sense, right? Well, this is where it starts being interesting and very-very confusing. Now, when Walter logs into Lync some of the users will see Jesse’s name show up in their Lync client instead of Walter. Weird, isn’t it?
What appears to be happening is that Lync Address Book Service (ABSConfig) queries proxyAddress attribute in user properties and uses whatever entry query returns first. Because proxyAddress field stores data in alphabetical order, in Walter’s user attributes the name “Jesse” entry comes before “Walter.” That’s why we see the wrong name displayed. It’s that simple.
Anyways, if this was an on-premise Lync server then there at least couple of fixes for this problem. Both fixes have to do with making changes on the server side. But this is Office 365, and we do not have access to the server-side. What are those of us living in the cloud supposed to do?! As far as I know, there is no fix, but there is a workaround. Instead of creating email address aliases using adsiedit.msc, you can:
- Create a distribution list in Office 365 management portal. Make sure to allow external senders send emails to this distribution list, so that emails don’t bounce back.
- Assign any email address aliases to that distribution list right from Office 365 management portal. For example, jesse@office365-is-awesome.com or this-not-really-walter@office365-is-awesome.com
- Add an intended recipient(s) to the distribution list. For example, walter@office365-is-awesome.com. Now, when people send email to Jesse every email will be sent to Walter’s mailbox and everyone will see Walter as Walter when he signs into Lync. It’s a win-win.
- (Optional) Hide distribution list from Address Book, so your people don’t get confused when they search internal Global Address Book.
Well, it’s not exactly a fix, it’s a workaround and it will do for now. I do hope though that Microsoft will fix this bug in Office 365. Sometime in the next 20 minutes would be great. ;)
As we start using SQL Azure more and more for storing data, we had to come up with a easy and inexpensive way to backup Azure databases. There is a number of various tools available to backup Azure databases, but they usually require a separate install and they are never free. Although, sometimes, they are fairly inexpensive. I like free ones better though.
So, after a bit of research I have discovered an easy way to backup SQL Azure databases to my on-premise (offsite) SQL Server: SQL Data Sync. D’oh! This is an existing functionality in Azure, and it can be accessed through an “old” Windows Azure portal interface (https://windows.azure.com). I am not going to write step-by-step instructions because, in this case, user interface is actually very intuitive and once you get to Data Sync part of Azure portal, you will know what to do. Good luck!
{ Ping me, if you need any help or have any questions about this article }
Did you ever wonder how SharePoint farm locates its configuration database. It’s not in a web.config or in any other configuration files. It’s actually a lot simpler than it probably should have been. SharePoint actually stores the connection to the configuration database in the registry (see dsn key).
SharePoint 2007: HKLM\SOFTWARE\Microsoft\Shared Tools\Web Server Extensions\12.0\Secure\ConfigDB
SharePoint 2010: HKLM\SOFTWARE\Microsoft\Shared Tools\Web Server Extensions\14.0\Secure\ConfigDB
SharePoint 2013: HKLM\SOFTWARE\Microsoft\Shared Tools\Web Server Extensions\15.0\Secure\ConfigDB (this one I have not actually checked, but I am betting it’s still there)
Scary, isn’t it?