Author Archive

ZOMG

Friday, October 23rd, 2009

I just got interviewed by Microsoft!

On Wednesday I was at the Visio 2010 booth and I guess I impressed them enough that they wanted to interview me, on camera, talking about what I’ve done with the product. I told them about when I designed a Visual Basic solution for Visio 2000 that would capture the connection event (when two shapes are connected by a line) on a drawing, where it would track the connections between objects in a back end SQL database. And I told them about the Systems Documentation “Data Viz” solution I did, where Visio is connected to a set of SharePoint lists that track servers, SQL instances, and databases, so you can map out your entire SQL farm with data-connected images. They liked that. They said they were going to put it on their Visio page.

Wow! I was so NOT ready to be on camera!

Power to the Pivot

Thursday, October 22nd, 2009

One of the new things rolling out with Office 2010 is called PowerPivot, which can be best explained as “building an OLAP Cube in memory.”  If the preceding sentence sounds like gibberish to you, let me smile and say IT DOESN’T MATTER.  PowerPivot for Excel allows the user to casually pull in data from lots of different sources and build interactive Chart/Table solutions. 

You can, for example, show a table with product sales, then stick a chart next to it, then put a “vertical slice” above it (populated with buttons you can multi-select to show only certain categories) then put a “horizontal slice” next to it (again populated with buttons you can multi-select to show certain countries).

The Microsoft guy at the Excel PowerPivot booth demonstrated this for me on a spreadsheet that had over 4 million rows of data.  Each change, whether sorting or filtering or transforming data, was applied almost instantly.  The longest it took was when he added a calculated column to the 4 million-row spreadsheet, took about 5 seconds.  He had a 64-bit machine with 6GB, but he said that was because it was also running SQL, SharePoint, and Exchange.  On his 2GB laptop, it also screams.

Excel can now pull data in from a variety of sources, including “feeds”.  He said in SQL 2008 R2 Reporting Services, there is a small button you can click to “enable ATOM feed”.  Then this report’s data source can be exposed and consumed elsewhere.  Excel will read the data source and pull in a live resultset.

The cool part comes when you publish this to SharePoint.  The Excel spreadsheet itself can be referenced as an OLAP cube. 

BAM!  A user has just become a BI designer.

SharePoint Conference Notes: 10-21-09

Thursday, October 22nd, 2009

I was going to write about how Microsoft Office 2010 and SharePoint 2010 are a fabulously awesome mix of pixie dust and candy stars, but John Anderson’s blog over at Bamboo Solutions beat me to it.  The guy might have been sitting next to me.  You should go read it now.  G’head, I’ll wait. 

So what I’ll talk about instead is the coolness that is Project Server, in particular, the upgrade path.  What I learned is:

  • Project Server 2010 is VERY worthwhile.  You can do lots of new and valuable things.  It is worth an upgrade.  I won’t go into detail here because frankly it’s overwhelming and I need to reread it.
  • Project Server 2010 ONLY runs on SharePoint 2010 Enterprise.  But if you have a current Project Server 2007 deployment (on WSS 3.0) and have Software Assurance, this will cover the upgrade.  So you’ll end up with SharePoint 2010 Enterprise along with Project Server 2010 Enterprise.
  • Project 2003, 2007, 2010 can connect to PS 2010 when it is in Backward Compatibility Mode.  BCM is a compromise, because some (but not all) new features are disabled.
    • The experience is that:
      • Project Pro 2007 will ignore new features.
      • Project Pro 2010 will light up to reveal the new features that are available.  The unavailable features will be grayed out, and mousing over them displays a message that the product is connected in Compatiblity Mode.
    • To enable all functionality, you can move from BCM to native mode but this is one-way only.  Once you’ve disabled BCM, you can’t go back.
  • Project Pro 2010 cannot connect to Project Server 2007
  • Project Pro 2007 and 2010 can be installed on the same machine, but cannot run at the same time.  This is likely to be a common scenario while users are moving between versions of MS Project.

Geeks in Line

Thursday, October 22nd, 2009

Here are some observations about the animal behaviors of Geeks.

 Geeks are a peculiar breed of human being.  Predominantly male, these creatures find that their preoccupation with abstract concepts places them far outside the social mores of commonly accepted behavior. 

 Geeks have a marvelously short attention span.  Geeks standing in line will, within 3-25 seconds, whip out any mobile or electronic device and begin (playing/texting/speaking/staring off into space).  Studies have found that it doesn’t matter how long the line is, and in fact they may even be in the front.  Any stationary Geek will need to preoccupy himself with something.  (Note: Geeks who do not have mobile devices are outcasts even in their own outcast subculture.)

 Geeks do not feel embarrassed about sitting on the floor if it means they can use their laptops.  They may even reject an available chair if it is not close to an electrical outlet.

Geeks with “bling” will proudly display it.  Logos, name badges, wristbands, hats, and all other types of adornment are seen as status symbols, even if 99.999% of the public has no idea what the slogans or logos mean.  Geeks seek status within their own outcast subculture.

Even for Geeks, sex sells.  If a vendor is advertising a relatively boring product, they may seek to employ a non-geek “hottie” who will do her best to dress scantily, wink, and flirt with Geeks passing by, to get them to stop and listen.  To wit: a “SharePoint Fairy” dressed in a costume with wings and wand can stop a Geek at a hundred paces.  A “SharePoint businesswoman” with a southern drawl and an easy wink can gather a throng of Geeks in minutes.  Geeks even be aware of this manipulation, but don’t care.  They are, after all, predominantly male.

Geeks don’t dance.  Ever.  A large sampling of 7500 Geeks at a recent Huey Lewis and the News concert shows that Geeks won’t do more than nod their heads to the beat even at the most catchy of tunes.  During this time it was observed that one Geekette was dancing, but she may have only been marginally Geeky.

SharePoint Conference Notes: 10-20-09

Wednesday, October 21st, 2009

First, a couple of links to items of interest:

Now, some thoughts about SharePoint 2010 and Social Computing:
Traditionally executives have nothing but scorn for “social computing” methods like blogging, Twitter, and Facebook.  According to one speaker yesterday, it all boils down to a fear of being sued.  She said there really isn’t much basis to fear social computing, because it is just another medium that should be covered by your company’s Electronic Communications policy, for example: an employee could write a toxic blog post just as easily as they could write a  toxic email, and the existing management should be able to handle either (and if you think about it, a blog post is easier to delete). 
 
Steve Ballmer mentioned this during the keynote on Monday, as covered here: 
At the end of his keynote on Monday at Sharepoint 2009, an interviewer asked Steve Ballmer about social computing. Ballmer recounted a story about a friend of his, a CEO for a Fortune 50 company. He said the guy is adamant in his opposition to social computing in his company. But if he had assurances that corporate data would be safe, then it might be a different story.

It was an interesting end to Ballmer’s keynote. It was all Ballmer, practically yelling at the crowd to make his point about the ways the social web will make it into the enterprise. 

http://www.youtube.com/watch?v=KI90RTD6kOw 

Ballmer sounded like a guy rallying his troops. He kissed his fingertips as if he were talking about a masterpiece. He then told the audience that after the conference they would be equipped to tell the Sharepoint story. And they will be the ones who bring social computing into the enterprise. 

This may seem like arrogance to some, but we are further convinced that Ballmer’s remarks do reflect the monumental fears that top management has about social services like Twitter and Facebook. But it is also important to look at what Ballmer says and temper it with the reality of the market.

So there have been a number of sessions at the conference about rolling out social computing with SharePoint 2010.  I’ll admit that the “blog” and “wiki” features of MOSS 2007 tend to inspire a yawn, but there have been some real improvements in this area.  Keep in mind that Microsoft does own Facebook, and they have taken a lot of the things that work there and brought them in to SharePoint. 
 
At a session I attended yesterday the speaker made the point that social computing is coming to the enterprise and that businesses need to face the fact.  More and more people are blogging, twittering, facebooking, and waving, and it will naturally spill over into the workplace.  And employers should recognize that social computing has its uses both on and off the clock.

SharePoint Conference Notes: 10-19-09

Tuesday, October 20th, 2009

What’s so damn special about SharePoint 2010? 

If you read the tech news, this sounds like a minor upgrade, adding a “handful of new features“.  (I guess when you’re a journalist for a tech magazine it takes a lot to impress you).  But from what I’ve seen, the new features are nothing compared to what happens under the hood.

Performance 

For one thing, it performs a lot better.  Old SharePoint (Versions 2003 and 2007) were classic ASP.NET applications, which meant that when you load a page for the first time, you have to wait for it to compile and then successive page loads are much faster because they’re cached.  In all the demos I saw yesterday, SharePoint was lightning fast.  These were undoubtedly premium machines, overloaded with RAM and processing power, but nonetheless impressive, as it shows the possibilities of SharePoint in production.  Every page load and search result was returned nearly instantly.  It was refreshing to see, I can tell you, because SharePoint’s performance is usually the first thing people complain about.

In that vein, at a later session I learned about some of the IT features for SharePoint administrators.  There is an entire database devoted to logging and performance monitoring, and some of the metrics you can collect are what a user is doing, which pages are popular, etc.  but the one that caught my eye was the “slowest pages” report.  You can identify which pages or items are performing the slowest, and (if you’re an administrator) each page in SharePoint can be loaded in “diagnostic mode”, which reveals a panel at the bottom of the page with all kinds of information about what the page is doing.  So in the case of the demo, we had a very large graphic that someone had scaled down instead of resizing, and it was adding 5 seconds to the load time.  Once we swapped it out with a resized image, the load time went to zero.

Scale

SharePoint 2010 can now handle a much larger scale of data than it used to.  In MOSS 2007, they strongly advise you to limit document libraries to under 2000 items (because then they take a very long time to load in the web browser).  But the new SharePoint boasts of the capability to host millions, if not hundreds of millions, of documents in a single library.  SharePoint is now positioned to challenge file shares as an effective document storage solution.  Although storing data in SharePoint is still more expensive, there is a greater degree of control over the disposition and metadata of a document. 

Disaster Recovery

Backup, restore, and disaster recovery in general has been revamped, addressing another (some would say unforgivable) weakness in SharePoint.  Now you can perform any level of backup and restore, from a multiserver farm to an item level restore. 

Search

They spent a long time showing off the new search features.  With the current version of SharePoint, you have a rather dumbed-down experience that might return unpredictable results, and performs rather slowly.  Microsoft purchased a company named FAST, which has a very nice search technology, and this has been grafted in to SharePoint.  What this now means is that you can very quickly search or drill down via keywords until you have a small resultset of relevant items.  If you’ve seen the Bing! Search engine, it is very similar (except SharePoint doesn’t automatically assume you want to go shopping).  This search dialog, which appears as a sidebar in most places, also works on very large lists and libraries: in the example, one document library had over a million items, and the search dialog was able to narrow the results down, refreshing the resultset with each new filter, until we had just what we were looking for.  What impressed me, again, was the speed.  The demonstrators often channeled Emeril, shouting “BAM!” to emphasize how quickly the search worked. 

PowerShell

SharePoint, along with all the next generation of servers being released in 2010, is heavily integrated with PowerShell.  There are over 500 new cmdlets you can use to administer and manipulate SharePoint.  Better face it guys, PowerShell isn’t going away.  Think of it as the return to the DOS prompt.

Project Server 2010

 I attended a couple of sessions on Project 2010 and Project Server 2010.  While the first one almost put me to sleep, the second one was very interesting.  Project 2003 and 2007 make extensive use of legacy code and ActiveX controls, so you could only use Internet Explorer to browse the Project Web Access sites.  But it’s now been rewritten in Javascript, which means you can use any browser.  And the functionality of the interface is so good, I could not tell right away if we were working in Project Professional or Project Server.  They have simplified Project Server a great deal, so a once-daunting Project Server solution becomes a lot more straightforward and powerful. 

Hands-On Labs

Maybe the best thing I did all day was take the time to sit through a couple of Hands-On Labs.  Here I got to work directly with Office 2010 and SharePoint, and it was very cool.

So… What’s so damn special about SharePoint 2010? 

Let me make a comparison here.  One of my complaints about SharePoint 2007, for all its awesomeness, is that users do not feel compelled to use it.  They load the site, poke around, then go do something else.  They don’t feel inspired to play around.  They don’t think it’s “okay” to change anything.  It looks like your standard, boring, webmaster-controlled website.  Sorry Microsoft, but that’s the truth.

When I got my new iPhone, I felt the exact opposite.  Here was something that just naturally flowed, form following function, inviting me to learn more and do it all.  I think the new SharePoint is a step in this direction.  It’s still not as simple as a finger drag, but it doesn’t suck either.  I’m not comparing interfaces here, I am talking about the “invitiveness” of the interface.  When I see the new SharePoint site I immediately start thinking about how I would like to customize it.  It’s like handing a blank notepad and a box of crayons to a little kid.  It’s exciting.  That’s what I’m talking about.

How to Tell Who Has Access to What in SQL Server

Thursday, October 8th, 2009

I have written a PowerShell script to “walk” the security structure of each SQL instance to find:   

  • Each Login (Windows or SQL)
    • Its Server Roles
    • Every database to which the login is mapped
    • The associated “Database User” for this login
      • Its Database roles
      • Any explicitly assigned permissions 

This is not an “all encompassing” look at every piece of security, but it does give a pretty comprehensive look at who has access to what.  I wrote a script because gathering this information manually would be very, very time consuming.  As far as I know, there is no function in SQL Server to collect all this information into one place.  I guess I could have used a series of TSQL scripts to pull the info out by other means, but I am on a PowerShell kick, and I wanted to do it this way.

 Besides, using my method, you can automate the process and audit multiple instances at once. Sound like fun?

 I wrote this quick-and-dirty so there is no error handling. There is, of course, no warranty expressed or implied and you should use caution when running this (or any other script you find on the Internet). That said, all of my calls to SQL are read-only, so I don’t think you’ll have any problems.  

I’ll go ahead and paste the script and then explain it below:

# =================================================================================
#
# NAME: InventorySQLUserSecurity.ps1
#
# Comment: This script is designed to “walk” the security structure of each SQL instance to find:
#
#    · Each Login (Windows or SQL)
#          o Its Server Roles
#          o Every database to which the login is mapped
#               § The associated “Database User” for this login
#                    · Its Database roles
#                    · Any explicitly assigned permissions
#
# The script is hard-coded to locate a text file with a list of instance names (Hostname\instancename format).
# The text file should contain one instance per line.
# All output is dumped to console.
# About the only error checking included is to check whether a database is online before analyzing it.
#  =================================================================================

#  =================================================================================
#
# Declare Functions
#
#  =================================================================================

Function GetDatabaseUser($Dbase)
{
 if ($dbase.status -eq “Normal”)
   {$users = $Dbase.users | where {$_.login -eq $SQLLogin.name}
       foreach ($u in $users)
        {
           if ($u)
               {
                 write-host $spc5 “===== Database: ” $Dbase.Name
                 write-host $spc5 “Login’s Database Mappings: ”
                 #$u | select-object name, login, parent, createdate, datelastmodified, DefaultSchema, HasDBAccess
                    Write-host $spc10   “Name             : ” $u.Name
                    Write-host $spc10   “Login            : ” $u.Login
                    Write-host $spc10   “CreateDate       : ” $u.createdate
                    Write-host $spc10   “DateLastModified : ” $u.datelastmodified
                    Write-host $spc10   “DefaultSchema    : ” $u.DefaultSchema
                    Write-host $spc10   “HasDBAccess      : ” $u.HasDBAccess

                 write-host $spc5  “Database Roles for this DBUser:”
                 $DBRoles = $u.enumroles()
                 if ($DBRoles)
                    {$spc10 + $DBRoles}
                 Else
                {Write-host $spc10 “None.”}
                write-host $spc5  “Explicit Database Permissions for this DBUser:”
                $DBExplict = $Dbase.EnumObjectPermissions($u.Name) | select-object objectname, permissiontype, permissionstate
                if ($DBExplict)
                    {$spc10 + $DBExplict}
                Else
                    {Write-host $spc10  “None.”}
           }
 # This is commented out to make the output less wordy.
        #else
        #{Write-host $spc10 “None.”}

     } # Next user in database

    }

 # This is commented out to make the output less wordy.
    #else
    #{write-host $spc10 “InventoryUserSecurity.PS1: Error connecting to database ” $db.name “.  Skipping to next database.”}

}

#  =================================================================================
#
# Main Program Starts Here
#
#  =================================================================================

[reflection.assembly]::LoadWithPartialName(“Microsoft.SqlServer.Smo”) | out-null
[string] $spc5 = “     ”
[string] $spc10 = “          ”

foreach ($SQLsvr in get-content “C:\SomePath\Instances.txt”)
{
    $svr = new-object (“Microsoft.SqlServer.Management.Smo.Server”) $SQLsvr
    write-host “=================================================================================”
    write-host “—–”
    write-host “—–         SQL Instance: ” $svr.name
    write-host “—–”
    write-host “=================================================================================”
    Write-host “SQL Version:” $svr.VersionString
    Write-host “Edition:” $svr.Edition
    Write-host “Login Mode:” $svr.LoginMode

    $SQLLogins = $svr.logins
    foreach ($SQLLogin in $SQLLogins)
    {
        write-host “———————————————————————————”
        write-host “—– Login: ” $SQLLogin.name
        write-host “———————————————————————————”
        write-host $spc5  “Login Type: ” $SQLLogin.LoginType
        write-host $spc5  “Created: ” $SQLLogin.CreateDate
        write-host $spc5  “Default Database: ” $SQLLogin.DefaultDatabase
        write-host $spc5  “Has Access to this instance: ” $SQLLogin.HasAccess
        write-host “     —————————————————————————-”

        write-host $spc5  “Server Roles for:” $SQLLogin.name
        $SQLRoles = $SQLLogin.ListMembers()
        if ($SQLRoles)
            {$spc10 + $SQLRoles}
        else
            {Write-host $spc10 “None.”}

        Write-host $spc5  “This login maps to database users in the following databases:”

 # $SQLLogin.EnumDatabaseMappings(): this line of code first checks to see if the login is mapped to any databases. 
 # If not, it won’t bother running through all the different databases.  This results in a cleaner output,
 # but it does slow things down a bit. 

        if ($SQLLogin.EnumDatabaseMappings())

            {Write-host ” ”
            foreach ( $DB in $svr.Databases)
                {
                GetDatabaseUser($DB)
                } # Next Database
           }
        Else
            {Write-host $spc10 “None.”}
    } # Next Login
} # Next Server

 

The basic flow of the script is:

  • Open the Instances.txt file, which is a simple text file with one instance per line.
    • The script will loop through each of the instances and prepare a report for each of them.
  • Provide some basic information about the instance.
  • For each Instance:
    • Connect to the instance’s “Logins” collection.
      • For each Login:
        • Provide basic information about the login:
          • Whether it is SQL or Windows security
          • When the login was created
          • What the login’s default database is
          • Whether or not the login currently has database access (i.e. disabled or not)
          • List any server roles
          • Find if the Login is associated with any database users.
            • If the Login has any database users (i.e. the $SQLLogin.EnumDatabaseMappings() is not null) then:
              • For Each Database:
                • If the database is online (i.e. its status is “Normal”) then:
                  • Show the SQL Login and its associated Database Username
                  • When it was created/modified
                  • What its default schema is
                  • Whether or not it has access to the database (i.e. denied or granted)
                  • The Database user’s DB roles
                  • Any explicitly granted permissions (e.g. to tables or stored procedures)
              • Next Database
      • Next Login
  • Next SQL instance

The output of this is a somewhat-formatted and fairly detailed look at what each person has access to. I’m sure I could have done this a myriad of other ways, but I was in a hurry.

Note that, depending on the number of logins and databases, this could chug for quite a while and output a lot of information (one instance I audited gave a 374-page report). The output is dumped to the console, which in PowerShell ISE is not a problem because it has a very large buffer. The next version of this will have the option to write to a text file, which isn’t much more difficult; I just didn’t have the reference in front of me on how to do that. So what I’ve been doing is copy/pasting the text into Word and finessing it from there.

My next version of this will probably be database-connected. I have been working on a PowerShell-based solution to inventory all SQL Servers on a network, including information on Hosts, SQL instances, Databases, Filegroups, and files; the end result is to have a comprehensive look at who owns what data and what resources the Business Units are consuming (e.g. Do the HR division’s databases take up more disk space than the Administration division’s databases?) This security audit data will be grafted into the database. If anyone’s interested I can write about that, too.

Troubleshooting SSRS 2008 and SharePoint Integration

Wednesday, July 1st, 2009

I recently implemented SQL Server 2008 Reporting Services in SharePoint Integration mode.  Although I followed all the directions and walkthroughs, it took me two days to get it implemented.  I was installing SSRS on an existing MOSS WFE, and though every indication showed a successful installation, it would not integrate.  I finally did get it working, though.  Here is what I did.

While I was testing the broken SSRS implementation the symptoms included:

  • No report would open or display.
  • I could not configure any of the SSRS-specific properties of any SSRS object, including reports, models, and data sources.
  • The SharePoint-specific properties, such as version and metadata, were still editable.
  • Every failure resulted in the unhelpful error message: "An unexpected error occurred while connecting to the report server. Verify that the report server is available and configured for SharePoint integrated mode."

The SSRS logs and SharePoint logs did not have much in the way of useful information, except a generic .NET failure message:

Timestamp   Process   TID   Area   Category   EventID   Level  

6/29/09 17:17

OWSTIMER.EXE (0×0820)

0×0FBC

Office Server

Office Server Shared Services

7fy6

Exception

 

Message:

System.IO.FileNotFoundException:

Could not load file or assembly 'Microsoft.ReportingServices.SharePoint.Common, Version=10.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91' or one of its dependencies.

The system cannot find the file specified. File name: 'Microsoft.ReportingServices.SharePoint.Common, Version=10.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91' at System.Reflection.Assembly._nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, Assembly locationHint, StackCrawlMark& stackMark, Boolean throwOnFileNotFound, Boolean forIntrospection) at blah blah blah…

In the SharePoint site I set up to test SSRS, I put a Report Viewer Web Part on the page and attempted to link to an existing RDL file in a document library on the same site. When I clicked the browse button, instead of seeing the custom "browse for file" dialog, I saw a SharePoint page stating that a 401 error had been returned). This was not the generic IIS 401 page, but a SharePoint page.

This is where I had an "aha!" moment.  SharePoint has a known issue with a 401.1 error, where access will be denied when attempting to browse to a host header that doesn't match the hostname of the server.

On my MOSS server, SharePoint integration is configured as follows:

Service   URL   Port
MOSS   http://portal (a host header)   80
SSRS   http://Moss1 (a hostname)   8080

The way MOSS and SSRS integrate is that reporting services creates an HTTP endpoint and hands off to MOSS (and vice versa). As far as the user is aware, the interface is seamless and only one URL (http://portal) is presented. That's the way it's supposed to work.

But since our MOSS portal is using a host header, this is triggering some built in security on Windows 2003's part. Since SP1, the default behavior has been to block host header browsing from the server itself. If you browse from any other machine to the server, it works fine. But on MOSS1, for example, I would not have been able to browse to http://portal , since this would be looping back on itself and possibly a reflection attack.

Normally this is a simple inconvenience. So what if you can't browse to a host-header site from the server it's hosted on? No biggie, right?

But SSRS is another web service trying to communicate to MOSS via a host header, and that is what broke. After modifying the registry to disable loopback protection and rebooting, the integration began working as expected.

References:

 

Anybody seen this? IE8 and Datasheet view

Tuesday, April 21st, 2009

Ever since upgrading to Internet Explorer 8, I've noticed one or two issues with SharePoint.  I wonder if it's just my machine, but has anybody seen this?

For users with Microsoft Office, SharePoint has the capability of displaying a list in DataSheet View, which is actually powered by a DLL from Microsoft Access.  This gives you a nice quick-editing experience.  One of the things I commonly use is the "Fill Handle".  You know what I'm talking about: it's that little dot on the lower right corner of a cell, where if you click and drag it will either copy the text of the cell into every cell you select, or if it's numeric it will auto-copy and increment the numbers in each cell.  Handy!

Except after I upgraded to IE8, it stopped working.  I've observed this on several machines.  Those with IE7 work just fine on the same list, but those with IE8 can't use the Fill Handle.  The mouse pointer still changes when you attempt to drag, but it does not have any effect.

I've simply put up with this, since I do like IE8 otherwise, but I've been missing using the feature. 

The MOSS Service Pack 2 is coming out on April 28th, and I am hoping that maybe this issue will go away.  They do mention that this service pack "adds support for IE8", so maybe this is one of the things they have fixed.

 

When SharePoint Pukes

Friday, April 17th, 2009

Yes, we've all seen it. SharePoint can become your worst nightmare when it goes down, especially when you're following behind someone who didn't quite know what he was doing. SharePoint goes down, the event logs are full of nasty, cryptic errors, and people are very, very nervous about losing their work forever. I guess I shouldn't be surprised when I see it; SharePoint is really easy to screw up, or at least to misconfigure. I know for a fact that a lot of IT guys read an article about SharePoint, get their hands on a CD, and put it into production without thinking about what might happen.

We all know that there are two things that could happen:

  1. The company's users ignore it, or avoid it like they owe it money.
  2. The company's users love it, and find it more and more useful, until they want to use it for everything and move all their files onto it.

We always expect Option #1, but if you think about it, Option #2 is terrifying.

What if the customer put a Basic-installation standalone SharePoint server out on the network running on SQL 2005 Express? Your scalability options are really limited, even if you put it on a powerful machine (remember, SQL Express can only use 1GB of memory and a single processor).

Or what if you see a dozen autonomous SharePoint farms crop up, each of them unmanaged and out of control?

And then how does your undertrained IT staff manage them?

And then let's say someone decides to apply SharePoint SP1 to one of the servers, but it breaks because the GroupBoard Workspace 2007 Template is installed on the farm?

Couple this with the fact that providing disaster recovery for SharePoint, at least at a granular level, isn't exactly easy or obvious unless you've been around SharePoint for a while… and you have a perfect recipe for panic. Or a Benny Hill chase scene, with the implementer just two steps ahead of the mob.

I've talked to a lot of Network Services folks, who are generally pretty smart to begin with, and they have told me that they find SharePoint a very complex product, and they are realizing more and more than they need a SharePoint tech on their payroll. While this is good news for folks like us, it could blow up in our faces if customers begin to decide that it's too complicated to support.

For all the glitz and glurge I've read about SharePoint in the blogosphere, there doesn't seem to be a lot of focus on what happens when SharePoint goes down. And of course SharePoint does go down. It dies and it's messy and the event logs are full of blood. SharePoint Portal Server 2003 used to be worse; at least with MOSS the errors make sense. I've fixed quite a few SharePoint messes, and I have to say that when SharePoint pukes, I'd rather it was MOSS-puke I was cleaning up.

I had an interesting day, fixing a broken SharePoint server that had myriad issues:

  1. The server in question was a MOSS 2007 Trial Edition server, installed and forgotten about since the installer left the company long ago.
  2. The farm was supposed to be a pilot/proof of concept, but the end users immediately began using it for production.
  3. It was an in-place upgrade from SharePoint Portal Server 2003.
  4. As mentioned above, the GroupBoard Workspace template was installed, which it turns out has a known issue with MOSS SP1.
    1. When browsing to the site, users simply saw this message: '

      Server error: http://go.microsoft.com/fwlink?LinkID=96177

      1. This link simply takes you to a TechNet site that talks about deploying updates for WSS. Lame!
    2. In the SharePoint logs were messages like this, basically saying that the configuration database was newer than the SharePoint binaries:

      [SPDatabaseGbwSequence] [ERROR] [4/13/2009 11:41:47 AM]: Upgrade object too new (build version = 12.0.0.6219, schema version = 3.0.1.0). Current server (build version = 12.0.0.4518, schema version = 3.0.1.0).

       

      [SPManager] [ERROR] [4/13/2009 11:41:47 AM]: CanUpgrade [SPContentDatabase Name=WSS_AdminContent Parent=SPDatabaseServiceInstance Name=OfficeServers] failed.

       

      [SPManager] [ERROR] [4/13/2009 11:41:47 AM]: The specified SPContentDatabase Name=WSS_AdminContent Parent=SPDatabaseServiceInstance Name=OfficeServers has been upgraded to a newer version of SharePoint. Please upgrade this SharePoint application server before attempting to access this object.

       

    3. And in the event logs:

      Event Type:    Error

      Event Source:    Windows SharePoint Services 3

      Event Category:    Topology

      Event ID:    5617

      Date:        4/13/2009

      Time:        11:36:33 AM

      User:        N/A

      Computer:    SHAREPOINT1

      Description:

      The schema version (3.0.149.0) of the database WSS_Content on SHAREPOINT1OfficeServers is not consistent with the expected database schema version (3.1.3.0) on SHAREPOINT1. Connections to this database from this server have been blocked to avoid data loss. Upgrade the web front end or the content database to ensure that these versions match.

      .

    4. I resolved this by uninstalling the GroupBoard Workspace and then running:
      1. STSADM.EXE -o upgrade -inplace -forceupgrade –url http://site for each web application, then
      2. psconfig -cmd upgrade -inplace b2b -wait –force

       

  5. Also, every thirty seconds or so:

    Event Type:    Error

    Event Source:    SharePoint Portal Administration Service

    Event Category:    None

    Event ID:    202

    Date:        4/13/2009

    Time:        11:35:03 AM

    User:        N/A

    Computer:    SHAREPOINT1

    Description:

    Synchronization exception occurred

    1. This is what I meant about SPS 2003 and its cryptic errors. There isn't any intuitive way to tell, other than clairvoyance, what this error really means. Fortunately, though, there is always eventid.net.
    2. I found this was due to the server having been upgraded from SPS 2003. This legacy service was jonesing for a content database and couldn't find one. I disabled the service and the error went away.

For what it's worth, the customer plans to retire this server and migrate all the content off to a real MOSS farm. Yay!