TF20507: The string argument contains a character that is not valid: U+0009

I've been working with a client on an integration between their current requirements management system in Caliber and TFS. We recently started receiving the TF20507 error after upgrading to TFS2015.  Our integration work used the TFS API, and it would go after User data in TFS as it was trying to insert records. The User Retrieval logic started throwing the TF20507, but the error doesn't tell you which user, and it doesn't tell you which field in the user record is causing the issue.  It only tells you the invalid character (U+0009, or a TAB character in this case).

Doing some searching around the interwebs for that error message returned some example code and methods for tracking down the error user.. my trouble was that the code examples I was running across were all using the TFS API for TFS 2010, and the methods they were using were not working with the newer TFS API's.

So I ended up working through the code and converting things over in a manner that would give me the SID of the user that was causing the issue, only now in a TFS API that works with newer versions.  I ended up with the code below, which will loop through all of the users in the Project Collection Valid Users group, and it tries to call the IIdentityManagementService.ReadIdentities method for each SID.  This lets me find which user SID throws the TF20507 error.

var GSS = tfs.GetService<IIdentityManagementService>();

           

 

            TeamFoundationIdentity SIDS = GSS.ReadIdentity(

Microsoft.TeamFoundation.Framework.Common.IdentitySearchFactor.General,

"Project Collection Valid Users"

Microsoft.TeamFoundation.Framework.Common.MembershipQuery.Expanded,

Microsoft.TeamFoundation.Framework.Common.ReadIdentityOptions.None);

            foreach(var member in SIDS.Members)

            {

 

                if (member.IdentityType == "System.Security.Principal.WindowsIdentity")

                {

                    string v = member.GetType().ToString();

                    string[] mIDS = { member.Identifier };

                        try {

                        TeamFoundationIdentity[][] u = GSS.ReadIdentities(IdentitySearchFactor.Identifier,

                        mIDS, MembershipQuery.Expanded, ReadIdentityOptions.ExtendedProperties);

                       // Console.WriteLine(u[0][0].UniqueName);

                            }

 

                        catch(System.Exception ex)

                        {

                            Console.WriteLine("Error :  " + ex.GetBaseException().Message);

                            Console.WriteLine("for sid :" + member.Identifier);

 

                        }

                }

               

                       

            }



This code ends up spitting out the TF20507 Error and the SID for each User that is throwing the exception/causing my troubles.

That's great and all, but knowing the SID is only half the battle.. I then needed to find which User ID's were the culprits... for that we took a peek in to the TFS Config database to find the SIDs (NOTE -- We are only SELECTING data here to find the culprit.. DON'T try to edit data in the TFS Configuration database! It won't end well for you unless you REALLY REALLY know what you're doing...)

SELECT *

  FROM [Tfs_Configuration].[dbo].[tbl_Identity]

  WHERE Sid = 'put in your SID here'


Once we found the user ID's of the user's causing the trouble, we were able to remove them from TFS.  Working with the security folks who manage the Active Directory, we found that the user's had TAB characters in a description field in Active Directory.  Having the Active Directory accounts updated to remove all the TAB's we then re-added the users to TFS... and no more issue!

Upgrading to TFS 2013 Update 4 with Bugs on the Backlog

Over time I've worked with several different companies performing customizations to their TFS Process Templates.  One topic would come up fairly regularly: "How Do I see Bugs on my Backlog?".  Companies would want to use one of the Agile-based templates, but wanted to have bugs appear on the backlog.  After some discussions on handling bugs, often we would settle on adding bugs to the backlog

Now, Microsoft must've heard a lot about this as well, and they set out to make things better.  As of TFS 2013 Update 4, each team can choose to set to have bugs display on the backlog!  There is a nice little setting in the admin section to do just that!!  Wonderful! No more manipulation of Process Templates to make this little feature work!  Or is there?

You see, I recently worked to upgrade a company from TFS 2010 to TFS 2013.4, and you guessed it, they had ALREADY had bugs on their Agile backlogs through a Process Template customization.  Now when it came time to upgrade their template, I "fixed" the template so that it would work with the new Bugs on the Backlog setting (had to take the Bug work item out of the Requirements Category).  This seemed to work out great! Each team within a Team Project could now even choose to display bugs how they wanted! All was happy... for a few minutes...

Two things made them want to change back to include Bugs as a requirement category item, and thus break the setting in the Admin section (with the nasty little note: TF400917: the current configuration is not valid for this feature).


First was a minor little nag, the company wanted to utilize Tiago Pascoal's nifty Task Board Enhancer.  One piece of that enhancer color-codes the cards on the task boards to match the Red/Blue coloring for Bugs and User Stories... BUT, that only works when there are more than one work item type in the Requirements Category.  Without setting this, there was no color-coding on the Task Board.. not a HUGE deal, but it was one of the things that a lot of people really liked about the Task Board enhancer...

The Second thing was a little bit more trouble.  The QA team started coming to me complaining that they could no longer add "Bugs" to their suites when adding Requirements to the Suite.  They would get a message stating that their query needed to return User Stories.  This was causing them trouble, because over time they had become very accustomed to putting Bugs in to their requirements-based suites.  Adding the Bug back as a requirement category item returned that functionality to them.

Those two things were more than enough for the company to be fine with the nagging TF400917 error on the Settings for their Team.  They could no longer choose to turn things on/off through a setting, but their intention was to always have it on anyway.

Attending ThatConference

Last week I had the opportunity to attend ThatConference in Wisconsin.  Sub-titled "Summer Camp for Geeks", it really is a great three days of fun, geeky, IT learning.  The schedule of sessions was really wonderfully diverse, so I was always able to find a session that was interesting, informative, and relevant.  Each day started with a Keynote (after breakfast of course! can't start your day without some bacon!) that gave me plenty to think about.  The opening day's keynote from Elizabeth Naramore was particularly inspiring.  Titled "Ripples in the Pond" she went on to challenge us in the IT community to be the best us we could be.  To be helpful, welcoming, understanding and generally "good" people to work with, instead of falling in to the traps of being negative, and critical and difficult to work with.  There were many good examples and lots of good food for thought which was really a great way to kick off everything.  Tim Huckaby's keynote on Tuesday was full of great techno-geekery that was exciting and fun.  And Mike McGee's keynote on Wednesday was inspiring and challenging, to see what is possible when you really put your mind to accomplish a big vision.  Great job was done by all of them.

Then each day we would break out for four sessions for the morning and afternoon.  There were really so many sessions to choose from it sometimes became difficult to nail down just which one I wanted to get to... But I was really happy with the sessions I ended up at.  I saw several great session on mobile development, talking through some topics like mass, cross-platform notification using Windows Azure messaging hubs, to cross-platform development with Xamarin and Azure Mobile services, to fun applications like Geo-fencing capabilities baked in to the Windows Phone development kit. Great stuff.  Then I was able to see some interesting ALM-related sessions, including one from the TFS Whisperer Angela Dugan, which was a great lesson in real-world problems and was very informative. I was also able to catch a session on Automated Build and Deployment on Wednesday.  That session covered tools that I was not really super familiar with, TeamCity for build, and Octopus for deployment.  Now, as a TFS ALM geek, I fall in to using the Microsoft tools like TFS Build, and Release Management to handle these tasks, so this was a great opportunity to get exposure to these other tools, and to see how other people are utilizing them in the real world. Very good for me.

For all of that learning and experience, there is another side to ThatConference.  I was amazed by the great group of people that were assembled for the three days.  I was able to meet, and chat with some great people doing impressive things from all over the area... Wisconsin, Illinois, Ohio, Indiana, and even Florida and Texas.  Great to be able to get to chat and learn from them.  Also ThatConference, even with the amazing set of scheduled sessions, goes above and beyond and sets up "Open Spaces", where people can sign up to have an open discussion on any given topic that they are interested in learning or talking more about.  As if it wasn't hard enough to pick a session to attend, now I had an even wider selection! I didn't end up finding my way over to any of the open spaces talks.. I really had my sessions picked out, and didn't waver, but it was really super cool to see some ever more amazing topics pop up on the schedule every time I refreshed it.

Now for all of that, it was a huge win for me to be able to attend! I got so much out of the three days.  But one other really big win for me was having my boys be able to attend the family track sessions.  I loved seeing my oldest son Jacob especially get excited about the opportunity to learn more about computers and programming.  The boys attended a Minecraft mod-ing session, and then Jacob really wanted to go learn what he could in the "Teaching Junior Campers to program with Grown Up Tools".  They were introducing the kids to using VisualStudio and C#! How cool is that! And Jacob loved it! You know that they're enjoying their time, when they want to go to a conference room to LEARN instead of running around the water park all day! Awesome! 

Also, (shhhh, my boss may be reading) there was a ton of fun things to do in the down time.. of course there is the amazing water park (including a fun late-night private party at the water park!), and pig roast, and game night! and Badge ribbon collecting! it was a total blast to be there..  we had a great time!  And there was even a group of "campers" that would get up early to go run.. they called it "That5k" and that served as an excuse to go run and exercise, so that helped keep me motivated to get out and try to keep up with my marathon training, sweet!

Here is a shot of my badge and my son Owen's badge at the end of the conference.. the ribbon collecting got infectious!


Removing SSRS Scale-Out Deployment Servers.. when the Config UI just won't do it

I am currently working on a TFS Upgrade.  We're going from an older TFS 2010 (that I think started life as something earlier than that) up to TFS 2013 (Update 3!).   We're following the ALM Ranger guidance and doing a Migration-based upgrade.  We've got a shiny new SQL Server 2014 with SSRS installed and it's time to migrate the old Reporting database over to the new hardware.  I've taken my backup from the old machines, and restored them to the new machines, then it's on to the SSRS Configuration manager to change databases over.. no troubles.. restore the old Encryption Key... and...  ahh, we find that the SSRS Server gives me this dreaded message when I try to view it:

Scale-out deployment is not supported in this edition of Reporting Services.

Yes, when I changed databases, it brought over the old server to put in the Scale-Out deployment setting.  No trouble! I can go in to the Scale Out Deployment settings through SSRS Configuration Manager and Remove the un-needed server(s)!  Except, no, I can't.. it fails to remove them.  The old SSRS installation is SQL 2008R2, and I don't think my shiny new SQL 2014 server is up to the task of communicating quite perfectly.. I see this when I try to remove one of the old servers from my Scale-Out Deployment "Removing report server <instance id Guid> from the web farm of the local instance.   --- The task failed". Great!



When looking in the Tell me more about this problem link I get some details like this:

Microsoft.ReportingServices.WmiProvider.WMIProviderException: No report servers were found. ---> System.Management.ManagementException: Invalid namespace

   at System.Management.ManagementException.ThrowWithExtendedInfo(ManagementStatus errorCode)

   at System.Management.ManagementScope.InitializeGuts(Object o)

   at System.Management.ManagementScope.Initialize()

   at System.Management.ManagementScope.Connect()

   at ReportServicesConfigUI.WMIProvider.RSInstances.GetInstances(String machineName)

   --- End of inner exception stack trace ---


Well I HAVE to get it out of there somehow!  A little research, and a lot of asking for help, and a tip comes that I should try to use the command line to get that done.

Reading the MSDN Page Add and Remove Encryption Keys for Scale Out Deployment gets me what I need:

rskeymgmt -r <installation ID>

You can get the <installation ID> part of that from logging in to the machine you want to remove, and finding it in the rsreportserver.config file.  Or, WAY more easily, the error screen on the Configuration Manager when I tried to remove server also provides the Instance ID for me! 

Logging in to the SSRS Server, firing up the command prompt and running the command gave me no troubles.  The servers were removed from my Scale-Out Deployment, and my Report Server migration piece is crossed off!


Running BlogEngine.Net on a GoDaddy site

So I thought I'd post a little something about getting this blog up and running.  I chose to use BlogEngine.Net based on the recommendations of some colleagues, and because it had a strong set of features and it is written in .Net, which I have familiarity with.  So that's great.  I chose to set up a hosting account with that company famous for their sponsorship of the #10 NASCAR car and for their Super Bowl ads, GoDaddy. 

GoDaddy offers BlogEngine.Net as one of the applications that they can install.  That worked smoothly.  I set up a sub-domain and installed BlogEngine.Net in to the root of the new sub-domain site.  Smooth, slick, no trouble.  I waited a few minutes for everything to settle, and was greeted with a  fresh blog site. That's when the fun began.  I found that when I logged in and attempted to do any work under the Administration section I would receive an error that looked like this


Yuck... Clicking any of the Administration settings would result in that error.. Of course the GoDaddy support couldn't help me with the application error... So debug time.  I turned off the Friendly Error Messages in the site's Web.config section and was greeted by a Security Exception:

Exception Details: System.Security.SecurityException: Request for the permission of type 'System.Security.Permissions.SecurityPermission, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' failed.

Source Error:



Line 4: @{
Line 5: App_Code.WebUtils.CheckRightsForAdminPagesPages(false);
Line 6: string loginUrl = Href(Utils.RelativeWebRoot + "Account/login.aspx");
Line 7: var userRights = Security.CurrentUserRights().Select(r => r.Flag).ToArray();
Line 8: }

A little help from the BlogEngine.Net forums pointed me to the IIS ASP.Net trust level.  It needed to be set to "Full", but the default was set to "Medium".  I navigated to the settings for my Sub-domain in the Plesk manager that GoDaddy uses, and found the ASP.Net settings:

And Changed the CAS Trust level to Full:


And... TADA! magic, my Admin section was now working without troubles.

From there I was able to go through and set up the blog settings I wanted, uploaded a Theme, and began blogging away!

First Post and other stuff

So This is my new blog, it's going to focus on technical computer/programming/TFS things I run in to in the course of my normal life.. you see I work as a IT Consultant for Polaris Solutions.  In that line of work, there is always something new to learn, try, or break.  So I hope to post some good information here that can help others along the way. 

I have worked as a .Net developer for many years, and more recently have been getting my hands dirty working with Team Foundation Server.  I also like to dabble on the side with some mobile development on my Windows Phone, and have had fun recently fooling around with Azure and how Microsoft's tools there can be leveraged in the Mobile development space. 

So, I think that will give me plenty of areas to draw from.  I am also starting up my training for the Chicago Marathon this October, so I'll try not to let too much complaining about training workouts bleed in to here too much!


Calendar

<<  June 2017  >>
MonTueWedThuFriSatSun
2930311234
567891011
12131415161718
19202122232425
262728293012
3456789

View posts in large calendar

Category list

Page List

Month List

AuthorList