WSS and MOSS Language Pack Slipstreaming by Joe Rodgers

This question was wondering around in my head last week after having seen a slipstreamed distribution at one of my customers. Previously having been told it was not possible to slipstream language packs, I had my doubts and went hunting for some information.

I found the answer on Joe Rodger’s blog

He wrote: 

In case you didn’t know, you can slipstream server pack 1 (or the latest SP) of a language pack into the RTM service pack installation point, creating a single install point for each language pack include includes SP1.  You may think, big deal, I’m saving one installation.  That’s true, but if you have a a medium or large farm, it cuts the number of items you need to install by half, which can add up over time, especially if you have a dev and QA/staging environment you keep in sync.  Unfortunately, you can only do this per language, so you still need to do one install per language, but every little bit helps.

 For WSS Language Packs (example here is for the Spanish language pack):

  1. Download the WSS Language Pack RTM and SP1 packages for the languages you are installing to C:/WSS_LPs/Spanish.
  2. Extract the RTM package to a folder using the following command:

    C:\WSS_LPs\Spanish>SharePointLanguagePack.exe /extract:C:\WSS_LPs\Spanish\

  3. Extract the SP1 package to the UPDATES folder inside your language folder, using the following command:

    C:\WSS_LPs\Spanish>wssv3lpsp1-kb936988-x86-fullfile-es-es.exe /extract:C:\WSS_LPs\Spanish\Updates

  4. Install the language pack with SP1 by executing C:\WSS_LPs\Spanish\setup.exe


For MOSS Language Packs (example is for the Spanish language pack):

  1. Download the MOSS Language Pack RTM and SP1 packages for the languages you are installing to C:\MOSS_LPs/Spanish.
  2. Mount the ServerLanguagePack.img file using a virtual CD drive application
  3. Copy all the contents from the mounted volume to C:\MOSS_LPs\Spanish\
  4. Extract the SP1 package to the UPDATES folder inside of your language folder, using the following command:

    C:\MOSSLanguagePacks\Spanish>officeserverlp2007sp1-kb936984-x64-fullfile-es-es.exe /extract:C:\MOSS_LPs\Spanish\Updates

  5. Install the language pack with SP1 by executing C:\MOSS_LPs\Spanish\setup.exe

List All Groups and All users of site collection on a single page

Yes, you have been asked this question before haven’t you?

“Dear Admin, can you send me a complete list of all the users in the Visitors group of my site collection, because there are so many in them and I am not able to export to Excel……”

Well, I finally got sick of either copy/pasting the info from the People and Groups page or exporting all users using a powershell script, that I took the time to create my own aspx page that will display that directly.

the code for this page looks like this:

<%@ Assembly Name=”Microsoft.SharePoint, Version=, Culture=neutral, PublicKeyToken=71e9bce111e9429c”%>
@ Page Language=”C#” MasterPageFile=”~/_layouts/application.master” Inherits=”Microsoft.SharePoint.WebControls.LayoutsPageBase” %>
@ Import Namespace=”Microsoft.SharePoint” %>

script runat=”server”>
   protected override void OnLoad(EventArgs e) {
using (SPWeb thisWeb = this.Web)
string output = “”;
           output +=
“<table style=\”width=100%\”>”;
           foreach (SPGroup group in thisWeb.Groups)
output += “<tr><td colspan=\”3\”><strong>” + group.Name + “</strong><td></tr>”;
               int i = 0;
if (group.Users.Count > 0)
foreach (SPUser user in group.Users)
                          output +=
output += “<td>” + user.Name + “</td>”;
output += “<td>” + user.Email + “</td>”;
output += “<td>” + user.LoginName + “</td>”;
                          output += “</tr>”;
output += “<tr><td colspan=\”3\”>Group is empty<td></tr>”;
              output +=
“<tr><td colspan=\”3\”>&nbsp;<td></tr>”;
         output +=
         lblUsers.Text = output;
asp:Content ID=”Main” runat=”server” contentplaceholderid=”PlaceHolderMain” >
<p>Site Groups and Users</p>
<asp:Label ID=”lblUsers” runat=”server” />
asp:Content ID=”PageTitle” runat=”server” contentplaceholderid=”PlaceHolderPageTitle” >
Site Groups and Users
asp:Content ID=”PageTitleInTitleArea” runat=”server” contentplaceholderid=”PlaceHolderPageTitleInTitleArea” >
Site Groups and Users

Now save this code into an aspx page and then copy that page to the 12-hive\TEMPLATE\Layouts folder. In my case I named the file Allusers.aspx, so now I f I am in a specific site collection, I can simply call upon the page using _layouts/allusers.aspx and have my listing of all the groups with all the users in a single page.

It is so simple, but never really had the time or desire to create such a page….

Stay tuned on my blog, as I  am almost ready with my tool for generating a complete report of a SharePoint farm in a nice html document….

Prevent indexing of lists with MOSS

If you ever need to prevent indexing your lists in your MOSS farm by your SSP indexer, then you can achieve this by defining a crawl rule in the SSP > Search Settings > Crawl rules.

Use the following URL for your crawl rule to exclude lists:  *://*/lists/*

Evidently you can change it to have a specific list excluded too [:D]

How To Recover Your SharePoint 2007 Product ID by Bert Johnson

On my post about the SP2 bug, I had a comment by Bert Johnson about a post of his explaining how to recover the SharePoint 2007 Product ID from your system. This is indeed very handy if you do not happen to have it or find it anymore and do not want to bother your customer for it loosing face (again [:D])

Bert wrote a vbs script that decodes the Product ID from the registry key blob data where it resides.

Thanks Bert for sharing this information, which will probably help a lot of us out there.

Subscribe to Bert’s blog with this Feed:{071A5AE9-9B1F-44E7-8AF7-C0BC07CF531D}

The original post can be found at .

Here is the script :

' Extract MOSS 2007 Product ID
' Written by Bert Johnson (PointBridge)

Const HKEY_LOCAL_MACHINE = &H80000002
Set reg=GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\default:StdRegProv")

wscript.echo GetKey("SOFTWARE\Microsoft\Office\12.0\Registration\{90120000-110D-0000-0000-0000000FF1CE}", "DigitalProductId")

Public Function GetKey(path, key)
    Dim chars(24), prodid
    Dim productkey(14)

    reg.GetBinaryValue HKEY_LOCAL_MACHINE, path, key, prodid
    For ib = 52 To 66
        productkey(ib - 52) = prodid(ib)

    'Possible characters in the Product ID:
    chars(0) = Asc("B")
    chars(1) = Asc("C")
    chars(2) = Asc("D")
    chars(3) = Asc("F")
    chars(4) = Asc("G")
    chars(5) = Asc("H")
    chars(6) = Asc("J")
    chars(7) = Asc("K")
    chars(8) = Asc("M")
    chars(9) = Asc("P")
    chars(10) = Asc("Q")
    chars(11) = Asc("R")
    chars(12) = Asc("T")
    chars(13) = Asc("V")
    chars(14) = Asc("W")
    chars(15) = Asc("X")
    chars(16) = Asc("Y")
    chars(17) = Asc("2")
    chars(18) = Asc("3")
    chars(19) = Asc("4")
    chars(20) = Asc("6")
    chars(21) = Asc("7")
    chars(22) = Asc("8")
    chars(23) = Asc("9")

    For ib = 24 To 0 Step -1
        n = 0

        For ikb = 14 To 0 Step -1
            n = n * 256 Xor productkey(ikb)
            productkey(ikb) = Int(n / 24)
            n = n Mod 24

        sCDKey = Chr(chars(n)) & sCDKey
        If ib Mod 5 = 0 And ib <> 0 Then sCDKey = "-" & sCDKey

    GetKey = sCDKey
End Function
Simply save that to a file named “ExtractMOSS2007ProductID.vbs” and run it to recover your key.  Once recovered, re-apply your Product ID through Central Admin, as outlined in KB971620.

How to Ghost back or uncustomize customized Page Layouts

In followup of my previous post, today my favourite Microsoft Premier Support Engineer was asked to provide a way to unghost customized page layouts.
He came up with a little piece of code that does the trick in a C# Console application.

It must be getting clear to some of you that for administering SharePoint a knowledge of .Net development skills is becoming more and more a requirement….

The most important function of this piece of code depends on the method SPFile.RevertContentStream() which is described as: “Returns the file to its original uncustomized state so that its logic becomes cached in memory (also known as “ghosted”) rather than stored in the database.”

So, here it is. The folowing code will uncustomize the customized page layouts.

using System;
using Microsoft.SharePoint;
using Microsoft.SharePoint.Publishing;

namespace GhostLayoutPages
  class Program
    static void Main(string[] args)
      using (SPSite site = new SPSite(args[0].ToString()))
        using(SPWeb web = site.OpenWeb())
          PublishingSite pubSite = new PublishingSite(site);
          PageLayoutCollection pageColl = pubSite.PageLayouts;
          foreach (PageLayout layout in pageColl)
            SPFile currFile = web.GetFile(layout.ServerRelativeUrl);
            Console.WriteLine(“Layout page name: “ + layout.Name);
            Console.WriteLine(“Status before: “ + currFile.CustomizedPageStatus);
            Console.WriteLine(“Status after: “ + currFile.CustomizedPageStatus);

How to find all the customized master pages in a site collection

I got this question today from one of my collegues and needed to find the answer to it. Why did I get this question? Well one of our developper teqms provided a new solution to deploy that replaces the default master pages and the update did not show any difference after deployment. therefore we suspected that the master pages had somehow be customized which causes this behaviour.

My first hunch for finding the answer was SharePoint Designer and my favourite Microsoft Premier Support Engineer confirmed with the following article: Track Customized Master Pages

Basically you need to open the site collection using SharePoint Designer and run the Customized Pages report and apply a filter to show only the customized master pages

Below is the information that describes how to do this as grabbed from the Microsoft article

Run the Customized Pages report

For both Office SharePoint Server 2007 and Windows SharePoint Services 3.0, data for the reports generated by Microsoft Office SharePoint Designer 2007 is saved on the server on which the site is hosted. Server administrators can grant or deny access to these reports. If the reports generated come back empty, contact your server administrator for assistance. You must have at least Web Designer permissions on the server to open the site and run reports.

When you are working with an Office SharePoint Server 2007 or Windows SharePoint Services 3.0 site, you can easily use Office SharePoint Designer 2007 to run site reports that collect a variety of information about your site’s health, usage, and potential problems. To run a Customized Pages report:

  1. Open the Web site for which you want to run the report in Office SharePoint Designer 2007.
  2. On the Site menu, point to Reports, point to Shared Content, and then click Customized Pages.The report opens with all of the pages in the site listed, and the Customized column indicates whether content has been customized for that page. Note   A page is considered customized only if it is included in the original site definition. New pages created from a master page, new blank ASPX pages, and custom list forms that you create are not considered customized pages.


Filter the report to show only master pages

After you run the Customized Pages report, you may want to narrow it down to include only those pages in the site that are master pages, as shown in the following illustration.

  • To limit the results to master pages only, click the arrow next to the Type column heading, and then click master.

Filter the report to show only customized master pages

You can narrow the results even further to list only customized master pages, as shown in the following illustration.

  1. Click the arrow next to the Type column heading, and then click master.
  2. Click the arrow next to the Customized column heading, and then click Yes.

The report now lists only master pages that have been customized.

 Note   To remove any filter, click the arrow next to the column heading, and then click (All).

Using SQL Aliases with SharePoint by Thomas Vochten

Thomas Vochten, a former colleague of mine, wrote about an interesting way to create and configure your SharePoint farm to take into account any possible changes in your backend SQL infrastructure by using SQL aliases on your MOSS servers and therefore adding the possibility to change your backend SQL server transparently to your SharePoint configuration.

On his blog, he wrote:

“I recently found out about SQL Aliases and how to use them in combination with SharePoint installations. It enables you to define local alias name to connect to with a SQL Client, so you can change the actual connection later on. This may come in handy when switching over to your mirror database server, when moving servers, when virtualizing you database server etc. “

Furthermore he describes the actual steps to configure this. I am not adding those steps to this blog post, to have you go look at the original post instead [8-|]

I also checked with my favorite Premier support Engineer form Microsoft to check if this is supported and he confirms it is. He aslo confirmed seeing this more and more for use with Excel Services and failover scenarios as suggested by Thomas.

**** Update ****
Also worth mentionning is Thomas’s comment on my question:

I wrote: “Just to be clear: this needs to be configured on the MOSS servers locally, right, and not on the SQL box? And if so, then it would need to be configured on all MOSS servers part of the farm, too, right? “

Thomas replied: “Indeed, it needs to be configured on every MOSS server. You could also do this after MOSS is already installed: configure the alias exactly as your existing connection, and change it when needed.”

Thanks Thomas for sharing.

SPS2003 Add Link to Site not working

Why might this be relevant to a MOSS admin. Well, you might be busy upgarding a SharePoint Portal Server 2003 environment to MOSS using the gradual approach, like I am. Off course you would test thjis on a test farm and reproduce your production environment in a somewhat representative way. In my case a imported only a couple of production sites in my test environment, which could be considered as logical.

Now, the thing is that I tried crawling the SPS content with my new MOSS farm and the crawl uses the Site Directory on the SPS Portal to anmalyze which sub sites it needs to crawl. Clearly the Site Directory was not reflecting teh istes I had on my test environment. So I cleaned out the Site Directory and wanted to add Links to the actual sites on the SPS application.Guess what, I was unable to. Apparently this is due to SP2 for SharePoint Portal Server 2003.

Thanks to this blog post I found the solution:

1. Open this file in a text editor:
C:\Program Files\Common Files\Microsoft Shared\web server extensions\60\TEMPLATE\[LCID]\SPSSITES\LISTS\SITESLST\NewForm.aspx
(Replace [LCID] with your locale identifier, 1033 for English)

2. Find this code fragment:

<SPSWC:InputFormButtonSection runat=”server”>
<SPSWC:InputFormButtonAtBottom ID=”ButtonOk” runat=”server”
<SPSWC:InputFormButtonAtBottom ID=”ButtonCancel” runat=”server”
TextLocId=”Page_CancelButton_Text” visible=”false” />

3. Replace it with this code fragment:

<SPSWC:InputFormButtonSection runat=”server”>
<!– Workaround for WIN2003SP2 issue:
<input type=”button” value=”         OK         ”
onclick=”document.forms[0].submit()” />
<!– <SPSWC:InputFormButtonAtBottom ID=”ButtonOk” runat=”server”
TextLocId=”Page_OkButton_Text”/> –>
<!– End workaround –>
<SPSWC:InputFormButtonAtBottom ID=”ButtonCancel” runat=”server”
TextLocId=”Page_CancelButton_Text” visible=”false” />

4. Thats it;-)

Short overview of MOSS new installation order with Language Packs

Just wanted to add this to my blog, because I have been asked this twice already last week. The order below is the one I use when I have to install Language Packs. Basically I prefer installing in the same order as the updates have been released. In Belgium we are customed to install 3 languages: English, Dutch and French. Hence this post

First of all install the prerequisite software for Windows Server 2003:

IIS 6.0
Asp.Net 2.0
.Net Framework 3.0

Then start the installation of MOSS and updates:

Install MOSS (English and without SP1)
Install WSS language pack French x86 x64
Install MOSS language pack French x86 x64
Install WSS language pack Dutch x86 x64
Install MOSS language pack Dutch x86 x64
install WSS 3.0 SP1  x86 x64
install Moss 2007 SP1 x86 x64
Install WSS SP1 language pack French x86 x64
Install MOSS SP1 language pack French x86 x64
Install WSS SP1 language pack Dutch x86 x64
Install MOSS SP1 language pack Dutch x86 x64
Install Post-SP1 WSS Infrastructure update x86 x64
Install Post-SP1 MOSS infrastructure update x86 x64

I have added the link to the MS download site for each individual update as requested by a colleague of mine.

Remember that you do not need the Configuration Wizard at each step. Some of the updates automatically start the wizard. Just simply cancel it out and continue installing the rest of the updates. What I always try to keep in mind is to install the updates for WSS first and then continue withthe MOSS counterpart.

Another little thing to remember is that you can get the language packs form the Microsoft download site for free.

Change the default 10 MB limit for saving a site as template

I bumped upon this 10 MB limit today when trying to save a site as a template. Did some research on the net and found that you can change this limit through the following stsadm command:

stsadm -o setproperty -pn max-template-document-size -pv 524288000

This will set a 500 MB limit instead, which is apparently the maximum value you can specify.