No soup for you! Is Cisco the Soup Nazi of NLB products?

Today, I tried to access a document library via windows explorer.  This doc lib is living inside a system that consists of two WFE’s load balanced by some kind of Cisco NLB solution.  (If/when the network wizards tell me what it is, I’ll update this post).

Windows explorer couldn’t connect.  I did some research and eventually, the network wizards said that WebDAV is disabled by / not supported by / beneath the dignity of the NLB.

So, assuming the network wizards aren’t just telling me the network wizard equivalent of "take a long walk off a short bridge", I have to wonder — does NLB, by nature, disable WebDAV?  Do we lose our windows file explorer interface to SharePoint?  Is Cisco the Soup Nazi?

Managing MOSS / WSS Environments — keeping up with Microsoft’s knowledge base

Microsoft creates knowledge base articles day in and day out and some of those are darned important to know about if you live in the SharePoint world.

I keep up to speed with them via a service provide by the good folks at www.kbalertz.com.  KBAlertz enables you to sign up for your favorite MS technology and they send you digest versions of Microsoft KB articles via email.

Web Application Policy, Security Sites and Security Trimming — Know your configuration

(UPDATED 11/29 to explain how to access web application policy settings via the UI)

I had one of those "why is MOSS doing this to me????" moments today.  In the end, it’s all my fault.

We have an enterprise MOSS project going on and we want to secure "place holder" sites so that no user may access it or see it.  That’s easy:

  1. Go to the site.
  2. Break the security inheritance.
  3. Remove every user/group from site permissions.

The above should leave just the site collection administrator with permission to see the site.

If anyone else logs in, they should no longer see the site and it should be security-trimmed from all the usual places.

But … it was not.  At the same time, I suddenly realize that my "Joe User" standard user test account with no priv’s other than restricted read access has a "Site Actions" choice everywhere he goes.  I double check one thing and double check something else.  I pick up the phone to call a colleague, but put it down and check something else.  I go for a walk and try everything all over again.  I call a colleague and leave a message.  And then, finally, I find that at Ethan’s blog, his opening graph makes it quite simple:

MOSS 2007 has a new feature called Web Application Policies. These are security permissions that is tied to a Web Application. These security settings override any security setting that is set at the Site Collection or Site (Web) level for that user.

A quick visit to web application policies shows that "NT Authority\authenticated users" had been granted Full Read.  I removed them from the list and everything finally started working as expected.  I believe they were added in the first place by someone with the mistaken impression that that is best method to grant read access to everyone in the enterprise.  It does, but, to strain a quote, "It does not mean what you think it means."

Access web application policies this way:

  1. Go to Central Administration
  2. Select Application Management
  3. Select "Policy for Web Application"
  4. On that screen, make sure you pick the correct web application.  For me, it defaults to the web application of central admin which may not be the one you want.

When I had this problem, I searched for the following phrases and got surprisingly little in terms of direct help on this issue:

Site actions visible for all users

Site actions visible to all users

site actions are not security trimmed

secure a MOSS site

introduction to moss security

Technorati Tags:

Quick and Simple: Use Fixed Keyword Query in Search Core Results

Quick and Simple Instructions:

Edit a page and add a Search Core Results web part.

Edit that web part and expand "Fixed Keyword Query".

Add the fixed keyword query (e.g. ContentType:"Training invoice" TrainingInvoiceNumber:1111)

Expand Results Query Options and change "Cross-Web Part query ID" to a value other than "User Query" (e.g. "Query 2").

Notes:

Using core search results in this manner allowed me to create a page that shows information from another site collection.  The client has two major site collections: Departments and Products.

The product site collection contains, naturally enough, product information.  Each product in the site collection aggregates data from multiple sources.

One of the departments, codes and testing, is on such source.  When users access product XYZ, they should see codes and testing data directly on the XYZ main page.  Since codes and testing is hosted in another site collection, it’s a little awkward.  We decided to use the core search results web part since search spans site collections.  Codes and Testing manages product data via a custom list that is constrained by a specific content type.  Aa keyword query that uses first the content type and then the product number narrow down the search to a single row in the custom list.

The keyword query above is an AND.  It returns documents of content type "Training Invoice" and where the invoice number equals "1111".

A nice benefit from this approach: We can edit the XSL from the core search results web part and generate any format that we want. 

See here (http://devcow.com/blogs/jdattis/archive/2007/04/17/SharePoint_2007_How_to_Rollup_Content_from_multiple_Site_Collections.aspx) for another blogger’s discussion on this topic.

 </end>Subscribe to my blog.

Tell me about your blog!

If you maintain a blog that is at least minimally connected to SharePoint, please let me know in comments.  I would love to add you to my blog list.

If you maintain a blog that is not connected to SharePoint but want me to add it anyway, let me know.  I’ll may create a separate blog list.

Please give:

  • Your blog URL (obviously)
  • A short description of your blog.

I want to keep the link to "active" blogs, which I’m roughly defining as one post per week and minimum three months old.  If you don’t meet that "requirement" add your name to comments anyway.  It’s *my* list so I can break my own rule if I want to.

Thanks!

Employee Training Schedule and Materials Template — Decrement bug in the template

The client noticed a bug today with the above mentioned template. 

Course managers create courses.  When creating a course, the manager specifies maximum number of available seats.

The template provides for self-service enrollment.  I enroll and a workflow attached to the registration list decrements the "available seats" associated with that course.

Individuals may also unregister from a course.  The bug lies here.  Unregistering from a course does not increment the available seats counter.  As a result, available seats is not accurate.  This bug is compounded by the fact that when available seats decrements to zero, no more self-service registration is allowed.

Fortunately, Microsoft provides the workflow for this process.  Even better, it’s a straight-forward workflow created via SharePoint Designer.

Follow these high level steps to fix it:

  1. Fire up SDP.
  2. Access the site based off the training template.
  3. Access "Attendee unregistration" workflow.
  4. Insert these steps (I made them the first two steps):
    1. Calculate Courses:Filled Seats minus 1 (Output to Variable:calc)
    2. (then) Update item in Courses

Click Finish and you’re done.

Screen shots:


SharePoint Designer:

image

Finished workflow:

image

Calculate drill-down:

image

Update item in Courses:

image

Give good news frequently; give bad news early

I’ve been a consultant for a lot of years now and as any experienced consultant knows, good communication is one of the key pillars to the successful delivery of a project. It’s so obvious, it’s really almost boring to talk about.  This isn’t a post about generic communication.  Instead, I’m writing about the darker side of communication — communicating bad news.

It goes without saying that giving good news to the client is done all the time, as often as possible.  Who doesn’t want to give good news?  Who doesn’t like to hear good news? 

On the flip side, bad news is no fun at all.  I have always struggled with this.  In the earlier days of my career, I would know something was awry with a project and instead of telling the client, I would work longer hours to try and solve the problem.  I would enjoin my team to work harder.  It’s a natural enough impulse to think that a super-human effort can save the day.  Some times this works, some times it does not.  Even when it "works" it’s often a mixed bag.  Is the quality of the deliverable really up to spec when key parts have been developed over several 60 to 80 hour weeks? 

What is the best way to handle bad news?  The answer is: tell it early.  Don’t wait until one week before the project budget will be consumed.  If you know six weeks out that there simply isn’t enough time to deliver some bit of promised functionality, tell the client right then and there.  The client may get upset (probably will), there may be incriminations and accusations and hurt feelings.  But, when emotions cool off, there’s still six weeks left on the project.  Six weeks is a good chunk of time.  There’s time to adjust plans, change schedules, get the ball rolling on budget extensions (good luck!) and just generally come to grips with the "facts on the ground" and devise a new plan that still results in a successful project. 

Case in point: I’m working on a project characterized by:

  • T&E budget with a capped "Not to exceed" dollar amount.
  • A "best efforts will be made" promise to deliver X, Y and Z by project’s end.
  • Lack of promised key resources on the client side.  These resources were not withheld on purpose, nor for any "bad" reason, but they were withheld.
  • A dawning realization as the project passed the half-way point that we were not going to be able to deliver "Z" (mainly because the promised resources were not actually available).
  • Regular status reports and "CYA" documentation that backed us (the consulting team) up. 
  • Tightly knit implementation team with members drawn from the consulting organization (my company) and the client.
  • Distant management team, in both a metaphorical and physical sense.  The management team was focused on another large enterprise project and due to space constraints, the implementation team was housed in a separate building on campus, down a hill and relatively far way from "civilization".

With roughly six weeks left on the project budget, we (the implementation team) knew that we were trouble.  The contract said that we needed to deliver "Z".  Even though the project is time & materials and even though we only promised "best efforts" to deliver Z and even though we had great justification for missing the delivery … the bottom line is that it wasn’t looking good — we were not going to deliver Z in a shape a quality that would make anyone proud.

Recognizing this, we went to management and told them that the project budget would be consumed by a certain date and that we were in trouble with Z.

A mini firestorm erupted over the next few days.

Day 1: Management team calls in its staff for a special meeting (we, the consultants are not invited).  Contracts are printed and handed out to everyone and a line-by-line review ensues.  Management puts the staff members on the defensive.  I don’t think the phrase "Stockholm Syndrome" is *actually* used, but you get the picture.  We’re a tight-knit group, after all, and the staff has been working with us consultants day in and out for several months now.

Day 2: Management calls another staff meeting.  They feel a little better.  They want options and ideas for moving forward.  They realize there’s still six weeks remaining in the current project budget, which is still a decent bit of time.  One of the action items: schedule a meeting with full implementation team (including consultants).

Day 5: Full team meets, constructive meeting ensues and a new achievable plan put into place.  Even better, we’ve already begun discussing phase two and the client invites us to prepare proposals for that phase immediately.

If we had waited until just three weeks remained, or even worse, one or two weeks, it would have been much different.  Instead of a constructive meeting to re-align the project, we would have been pulling out status reports, parsing the contract and reviewing old emails to justify this or that decision.  We would have "won" but is it really "winning" in this case? 

So, if you have to give bad news, give it early.  Bad news given late isn’t just bad, it’s horrible.

Using “Person or Group” in a calculated column

People commonly ask about using a column of data type "Person or Group" in another column of data type "Calculated".

Bottom line, this does not work in WSS 3.0 (or MOSS).

When adding a calculated column, WSS shows the list of fields it allows you to use for the calculation.  If you type in the name of a column that is not in its list, it tells you:

One or more column references are not allowed, because the columns are defined as a data type that is not supported in formulas.

Workaround: Use an event handler.  The event handler fires when the user saves the item.  It performs the update you would have wanted the calculated column to do for you.

Useful links on calculated fields in general:

Quick disclaimer: I believe the above to be true and accurate, but I’ve seen enough clever tricks here and there in MOSS/WSS that I wouldn’t be extremely surprised (agog if you will) if someone has figured out a way to do this without resorting to code.  If you’ve figured out clever work-around or know someone that did, please let me know!

MOSS/WSS tells me: “The page has been modified by another author on …” but actually, it was not.

We did some heavy duty re-organizing of our site taxonomy via "Manage Content and Structure".  For reasons unknown to me, this process (though working in the main) broke some navigation links in the quick launch.  The broken links are characterized by:

  • Wrong URL.  For example, it should be "/sites/departments/HumanResources/…".  However, the new link is "/sites/Corporate/HumanResources/…".
  • Repeated bits on the query string of the heading, as in:

/sites/departments/HumanResources/_layouts/viewlsts.aspx?BaseType=0?BaseType=0?BaseType=0?BaseType=0

That’s easy enough to fix via site settings/navigation.  Except, MOSS presents me with this when I try and do it:

image

The fact is, no one is making any change there (aside from me, of course).

A quick search turns up this MSDN forums discussion: http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=1691577&SiteID=1

William Heurdier lays it out nicely in the the penultimate (as of 10/02/07) post:

Fact is:

To reset corrupted headings, you have to :

– remove all the lists under corrupted heading

– remove corrupted heading

– From the list settings, add a removed list to the quick launch (This regenerate a non corrupted heading)

You are then good to go….


Sharepoint Expert – Sogeti Cap Gemini Switzerland

I was a bit confused because I kept wanting to go to the navigation page, make the change and then get hit with the "page was modified" message.  Eventually, I realized I had to go to the list settings and remove/add it to quick launch.  That did the trick.  Happy times are here again!

</end>

 Subscribe to my blog!

Problems with “Pause Until Date” activity in SPD-created workflows

UPDATE 12/10/07: Hotfix as described in MSDN KB929816 solved the problem for us mentioned below.  Obtain the hotfix and then install on each server on the farm.  Then, sharepoint configuration utility on each server.  Here is the MS Support link for that KB: http://support.microsoft.com/kb/932816

Background:

We have a business requirement where an environmental engineering manager needs to ensure that 30 some-odd manufacturing locations located throughout the United States needs to ensure that those plants file for their various state-mandated permits in a timely fashion.  One approach we’ve investigated leverages the "Pause Until Date" activity available to us via SharePoint Designer worfklow.  The engineering manager (or her assistant) enters all the required permits and reminder dates at the start of the year.  The system then does all the heavy lifting.

Environment:

MOSS, 64 bit, virtual machine environment (development box), 2 servers (SQL on server #1, everything else on server #2).

Problems:

The Pause Until Date action seems like the perfect solution and it may well prove itself to be.  However, it does not work well out of the box (for us). 

  1. The workflow job was not scheduled to run, ever.  I discovered this by reading through Christopher White’s (http://chrissyblanco.blogspot.com/2007/06/issues-with-delay-activity-in-moss.html) excellent write-up by using stsadm thusly:

    C:\>stsadm -o getproperty -propertyname "job-workflow" -url http://localhost

    <Property Exist="No" />

    C:\>

    That was a surprising result but easily solved:

    C:\>stsadm -o setproperty -propertyname "job-worfklow" -propertyvalue "every 1 minutes between 0 and 59" -url http://localhost

    Operation completed successfully.

    C:\>

    Upon doing that, the first "In Progress" workflow quickly fired up and did it’s job.

  2. Sadly, the next one didn’t work as expected.  Thankfully, Christopher refers us here (http://support.microsoft.com/kb/932816).  As of writing of this entry, we’re waiting for the IT department to obtain that hotfix, but it does look promising.  Our copies of the affected .dll’s do not share the same byte size, so hopefully this will solve the problem.

Workaround:

Re-running the stsadm -o setproperty command seemed to prod the workflow timer awake.  It would, roughly 7 minutes later, actually wake up and continue along with the workflow. 

Questions / Issues Addressed:

Pause Until Date does not work.

Pause Until Date does not resume.

Workflow status does not change from "In Progress"

Workflow status stays "In Progress"