|
|
-
I was lucky to attend and present at last week's SharePoint Best Practices conference. I'm still new to the whole speaking "thing" and, frankly, I was a bit nervous for the first half while I sweated out waiting to speak myself. That sort of nervous feeling made it a little hard for me to pay attention to the presenters (not that I ignored them). Instead, I focused a bit more on the attendees. Conferences always set my mind racing and there was a lot take in at this one. This conference was excellent. I think it was unusual in several ways. It wasn't a heavy developer conference. There were certainly dev parts to it, but I think it was at least 60% focused on non-dev issues, maybe as high as 80%. I think that speaks to the evolving nature of the SharePoint market. Companies are implementing SharePoint in a variety of ways and they are looking for guidance on how to do it right. And not just guidance on how to create features/solutions (which by now, has been very well established). I believe the conference was tremendously valuable to most everyone that attended and I know that the organizers plan to do the conference again early next year. Having said that, I believe there was a missed opportunity which I hope the next conference addresses. I say it's a missed opportunity, but that's not a bad thing. Discovering a community need is in and of itself a good thing. The conference discussed a number of best practices in a variety of areas such as governance, training, requirements gathering, search, development, information architecture, etc. I think that the missed opportunity has to do with the "green field" assumptions underlying many of the best practices. When we talk about green field, we mean that SharePoint hasn't gone into production and we're starting with a clean slate. This is ideal because you can start straight away using best practices for defining and managing governance, information architecture, etc. However ... what happens when you're already in production with several thousand users (or 10's of thousands) and you didn't follow best practices at the beginning? I've seen companies with ... ahem ... a very odd information architecture baked into their environment. I don't think that this conference provided much guidance for organizations with that kind of problem (and I don't just mean IA, but governance, search, many other areas). Of course, knowing you have a problem is a big part of the solution and that's very valuable. I think that the online SharePoint community hasn't done much to address this either. I know I have not. It's a very hard problem to solve at many levels. Technically it's hard. Budget-wise it's hard. Culturally, it's hard. However, it's probably a bigger real world problem than most. Since the conference ended, I've been thinking about these kinds of problems and how one would solve them. There has to be a better answer than, "uninstall and reinstall" and the community needs to face it head on. I think that this a great opportunity for the blogging community and experienced thought leaders to lay out some guidance on how to repair their environments. I think there's a small but non-zero risk that SharePoint could end up with a bad and enduring reputation as a result of poorly architected implementations that fail due to poor governance, IA, etc. </end> Subscribe to my blog. Technorati Tags: Best Practices
|
-
It's the beginning of the month and now is as good a time as any for your company's search committee to get together and analyze Best Bets, successful and not so successful searches, etc. You don't have a search committee? Then form one :) WSS and especially MOSS search benefit from some human oversight. Investing a few hours a month on a consistent monthly basis is not only more fun than a barrel of monkeys, it can: - Give insight into the information needs of the enterprise. If people are searching left and right for topic "xyzzy," you know that's an important topic to the enterprise.
- Identify potential training requirements. If people are searching for topic "xyzzy" but should really be searching for "abcd" then you can use that to educate folks on where and how to find the information.
- Help your organization refine its information architecture.
- Identify opportunities to enhance the thesaurus.
- Other opportunities will no doubt present themselves.
Who should be on search committee? You would know your people best, but consider: - At least one (and maybe only one) IT person who understands (or can learn) the various ways to tweak search, including best bet, thesaurus, managed properties, etc.
- Several subject matter experts that can read the search reports, ingest it and communicate business-savvy actions to IT so that IT can push the buttons, pull the levers and open/close valves as necessary to on committee recommendations.
- One or more information architects who can validate, one way or another, whether the information architecture is search friendly and whether it's working out well for the enterprise.
- A rotating seat on the committee. Bring in one or two people who don't normally participate in these kinds of efforts. They may bring unusual and valuable insights to the table.
Happy analyzing! </end> Subscribe to my blog.
|
-
| 
| This morning, Microsoft emailed to tell me I have given the Microsoft MVP award for SharePoint! It's a lot to take in all at once. When I've had a chance to properly reflect, I'll share more of my thoughts on the whole thing. I know it's a subject of great interest to a lot of people. I'm bursting with excitement. The SharePoint MVP crew is a great group of men and women dedicated to building and expanding the community. I've only met a handful and look forward to meeting more and helping to expand and improve community resources over the coming year. It's going to be a while ride... | </end>
|
-
A few weeks back, I was working with my developer colleague on a project involving SQL Server Reporting Services plug-in for MOSS. He was developing a web part that provides a fancy front-end to the report proper (the main feature being a clever lookup on a parameter with several thousand searchable values behind it). This was working great in the development environment but in the user acceptance testing (UAT) environment, it wouldn't work. Firing up the debugger, we would see exception details like this: The permissions granted to user ‘UAT_domain\mosssvc’ are insufficient for performing this operation.(rsAccessDenied). If you do a live search on the above error, you find it's quite common. Scarily common. The worst kind of common because it has many different potential root causes and everyone's suggested solution "feels" right. We probably tried them all. In our case, the problem was that we had done a backup/restore of DEV to UAT. Somewhere in the data, something was still referring to "DEV_domain" (instead of the updated "UAT_Domain"). We created a new site, added the web part and that solved our problem. Hopefully this will save someone an hour or two down the line. </end> Subscribe to my blog.
|
-
We needed to invoke the "CreateSubscription" method on an SSRS web service that is hosted in an FBA managed MOSS environment from a custom web part. We kept getting variations of: - 401: Not authorized
- Object Moved
The "object moved" message was most interesting because it was saying that the "object" (our SSRS service) had "moved" to login.aspx. This clearly meant we had some kind of authentication problem. I eventually realized that I had bookmarked a blog entry by Robert Garret that described how to invoke a general purpose WSS/MOSS web service living inside an FBA environment. Note that I can't link directly to the article (as of 06/09/08) because it wants to authenticate. The link I provide brings you to an "all posts" view and you can locate the specific article by searching for "Accessing MOSS Web Services using Forms Based Authentication". Here's the code that worked for us: ReportingService2006 rs = null; // Authenticate Authentication auth = new Authentication(); auth.Url = "http://URL/_vti_bin/Authentication.asmx"; auth.CookieContainer = new CookieContainer(); LoginResult result = auth.Login("userid", "password"); if (result.ErrorCode == LoginErrorCode.NoError) { // No error, so get the cookies. CookieCollection cookies = auth.CookieContainer.GetCookies(new Uri(auth.Url)); Cookie authCookie = cookies[result.CookieName]; rs = new ReportingService2006(); rs.Url = "http://server/_vti_bin/ReportServer/ReportService2006.asmx"; rs.CookieContainer = new CookieContainer(); rs.CookieContainer.Add(authCookie); } try
{
rs.CreateSubscription(report, extSettings, desc, eventType, matchData, parameters1);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message.ToString());
} |
I interpret things to work like this:
- Our web part needs to dial up the authentication service and say, "Hey, Tony, it's me!".
- Authentication service replies saying, "Hey, I know you. How are the kids? Here's a token."
- We call up the SSRS service and say, "Tony sent me, here's the token."
</end>
Subscribe to my blog.
|
-
During the past week, my colleague and I were doing some work for a client in NYC. We were testing a different aspects of a MOSS implementation using their "standard" workstation build (as opposed to our laptops). While doing that, we ran into a few errors by following these steps: - Open up an MS word document via windows explorer (which uses WebDAV).
- Make a change.
- Save it.
We came to realize that some times (usually the first time) we saved the document, the save didn't "stick." Save did not save. We would pull that document back up and our changes simply were not there. We didn't understand the root issue at this point, but we figured that we should make sure that the latest MS Office service pack had been installed on that work station. The IT folks went and did that. We went through the test again and we discovered a new problem. When we saved it, we now got this error:  This time, it seemed like every change was, in fact, saved, whether we answered Yes or No to the scripts question. We finally had a look at the actual version of Office and it turns out that the workstation was running MS Office 2000 with service pack 3 which shows up under Help -> About as "Office 2002". The moral of the story: I will always use Office 2003 as my minimum baseline office version when using WebDAV and MOSS. </end> Subscribe to my blog. (For search engine purposes, this is the error's text): Line: 11807 Char: 2 Error: Object doesn't support this property or method Code; 0 URL: http://sharepoint01/DocumentReview/_vti_bin/owssvr.dll?location=Documents/1210/testworddocument.doc&dialogview=SaveForm Do you want to continue running scripts on this page?
|
-
Last week, I was working out how to loop and implement a state machine using SharePoint Designer and mentioned, as an aside, that I would probably write a blog post about better workflow logging. Well, Sanjeev Rajput beat me to it. Have a look. Saving log data into a custom list seems superior to using the regular workflow history: - It's just a custom list, so you can export it to excel very easily.
- You can create views, dynamically filter the data, etc.
- It's not subject to the auto-purge you get with regular workflow history.
There are some risks / downsides: - Many running workflows with a lot of logging could cause too much data to be written to the list.
- Maybe you *do* want automatic purging. You don't get that feature with this approach (without coding).
- Security is tricky. In order to write to the list, the user must have permission to do so. That means that it's probably not suitable for any kind of "official" audit since the user could discover the list and edit it. This could be overcome with some custom programming.
</end> Subscribe to my blog.
|
-
This past week I finished off a proof of concept project for a client in Manhattan. While implementing the solution, I ran into another shortcoming of MOSS KPIs (see here for a previous KPI issue and my workaround). Background: We used SharePoint Designer workflow to model a fairly complex multi-month long business process. As it chugged along, it would update some state information in a list. KPIs use this data to do their mojo. We decided to create a new site each time a new one of these business processes kicks off. Aside from the workflow itself, these sites host several document libraries, use audience targeting and so forth. Just a bunch of stuff to help with collaboration among the internal employees, traveling employees and the client's participating business partners. We also wanted to show some KPIs that monitor the overall health of that specific business process as promoted by the workflow state data and viewed using the KPIs. Finally, we used KPI list items that do a count on a view on a list in the site (as opposed to pulling from another data source, like excel or SQL). The Problem: As you can imagine, assuming we were to carry the basic idea forward into a production world, we would want a site template. Provision a new site based off a "business process" template. The problem is that you can't seem to get a functioning KPI that way. When I create a new site based on a template with a KPI List and KPI web part, the new site's KPI data are broken. The new site's KPI list points at whatever source you defined when you first saved it as a template. By way of example: - Create a new site and build it to perfection. This site includes the KPI data.
- Save that as a template.
- Create a new site and base if off the template.
- This new site's KPI list items' sources point to the site template, not the current site.
The instantiation process does not correct the URL. I tried to solve this by specifying a relative URL when defining the KPI list item. However, I couldn't get any variation of that to work. I always want to pair up these "problem" blog posts with some kind of solution, but in this case I don't have a good one. The best I can figure is that you need to go in to the newly provisioned site and fix everything manually. The UI makes this even harder because changing the URL of the source list causes a refresh, so you really have to redefine the whole thing from scratch. If anyone knows a better way to handle this, please post a comment. </end>
|
-
This week, I've struggled a bit with my team to get MOSS installed in a simple two-server farm. Having gone through it, I have a greater appreciation for the kinds of problems people report on the MSDN forums and elsewhere. The final farm configuration: - SQL/Index/Intranet WFE inside the firewall.
- WFE in the DMZ.
- Some kind of firewall between the DMZ and the internal server.
Before we started the project, we let the client know which ports needed to be open. During the give and take, back and forth over that, we never explicitly said two important things: - SSL means you need a certificate.
- The DMZ server must be part of a domain.
Day one, we showed up to install MOSS and learned that the domain accounts for database and MOSS hadn't been created. To move things along, we went ahead and installed everything with a local account on the intranet server. At this point, we discovered the confusion over the SSL certificate and, sadly, decided to have our infrastructure guy come back later that week to continue installing the DMZ server. In the mean time, we solution architects moved ahead with the business stuff. A weekend goes by and the client obtains the certificate. Our infrastructure guy shows up and discovers that the DMZ server is not joined to any domain (either a perimeter domain with limited trust or the intranet domain). We wasted nearly a 1/2 day on that. If we hadn't let the missing SSL certificate bog us down, we would have discovered this earlier. Oh well.... Another day passes and the various security committees, interested parties and (not so) innocent bystanders all agree that it's OK to join the DMZ server with the intranet domain (this is a POC, after all, not a production solution). Infrastructure guy comes in to wrap things up. This time we successfully pass through the the modern-day gauntlet affectionately known as the "SharePoint Configuration Wizard." We have a peek in central administration and ... yee haw! ... DMZ server is listed in the farm. We look a little closer and realize we broke open the Champaign a mite bit early. WSS services is stuck in a "starting" status. Long story short, it turns out that we forgot to change the identity of the service account via central administration from the original local account to the new domain account. We did that, re-ran the configuration wizard and voila! We were in business. </end> Subscribe to my blog.
|
-
I've recently learned that it's possible and even fairly easy to create a state machine workflow using SharePoint Designer. Necessity is the mother of invention and all that good stuff and I had a need this week that looked for an invention. Coincidentally, I came across this MSDN forum post as well. My personal experience this week and that "independent confirmation" lends strength to my conviction. I plan to write about this at greater length with a full blown example, but here's the gist of it: - The approach leverages the fact that a workflow can change a list item, thereby triggering a new workflow. I've normally considered this to be a nuisance and even blogged about using semaphores to handle it.
- SharePoint allows multiple independent workflows to be active against a specific list item.
To configure it: - Design your state machine (i.e., the states and how states transition from one to the next).
- Implement each state as separate workflow.
- Configure each of these state workflows to execute in response to any change in the list item.
Each state workflow follows this rough pattern: - Upon initialization, determine whether it should really run by inspecting state information in the "current item". Abort if not.
- Do the work.
- Update the "current item" with new state information. This triggers an update to the current item and fires off all the state workflows.
Aside from the obvious benefit that one can create a declarative state machine workflow, all that state information is terrific for building KPIs and interesting views. It does have a fairly substantial drawback -- standard workflow history tracking is even more useless than normal :) That's easily remedied, however. Store all of your audit type information in a custom list. That's probably a good idea even for vanilla sequential workflow, but that's for another blog post :) I call this a "mea culpa" because I have, unfortunately, said more than once on forums and elsewhere that one must use visual studio to create a state machine workflow. That simply isn't true. </end> Subscribe to my blog. Technorati Tags: Workflow
|
|
|
|