Redirecting to new URL with IIS

In IIS there is a trick for redirecting requests to a new URL including original path and query string. This trick worked on IIS 6. Today I tried this with IIS 7.5 on Windows Server 2008 R2. It’s still working!!!

 

Demo:

1. You have an SharePoint with host header “sharepoint.local” and a Shared Documents library with a single document. This link will open the document properties view form:

http://sharepoint.local/Shared%20Documents/Forms/DispForm.aspx?ID=1&Source=http%3A%2F%2Fsharepoint%2Elocal%2FShared%2520Documents%2FForms%2FAllItems%2Easpx&RootFolder=%2FShared%20Documents&ContentTypeId=0x010100293CE4623453F044AE694E186F090B7C&IsDlg=1

2. Now you create a IIS redirect for “http://sharepoint-redirect.local”:

Therefore you create a new web application in IIS:

image

Now you add “Http Redirect” functionality to the web application:

image

image

Click “Apply” after configuration.

3. If you test it in the browser with URLs like http://sharepoint-redirect.local/Shared%20Documents it works as expected. You get http://sharepoint.local/Shared%20Documents

4. But if you try the link from above you get an unexpected result:

http://sharepoint-redirect.local/Shared%20Documents/Forms/DispForm.aspx?ID=1&Source=http%3A%2F%2Fsharepoint%2Elocal%2FShared%2520Documents%2FForms%2FAllItems%2Easpx&RootFolder=%2FShared%20Documents&ContentTypeId=0x010100293CE4623453F044AE694E186F090B7C&IsDlg=1

redirected to:

http://sharepoint.local/SitePages/Home.aspx

5. If you uncheck (and “Apply”) the following checkbox in the HTTP Redirect settings of the web application it looks a little bit better:

image

 

http://sharepoint-redirect.local/Shared%20Documents/Forms/DispForm.aspx?ID=1&Source=http%3A%2F%2Fsharepoint%2Elocal%2FShared%2520Documents%2FForms%2FAllItems%2Easpx&RootFolder=%2FShared%20Documents&ContentTypeId=0x010100293CE4623453F044AE694E186F090B7C&IsDlg=1

redirected to:

http://sharepoint.local/Shared%20Documents/Forms/DispForm.aspx

The URL is correct but the query string is missing. So the form is empty:

image

6. Now the “old” IIS trick for HTTP Redirect:

Use tokens $S$Q in the redirect URL!

$S = Path

$Q = Query String

image

Now it HTTP Redirect works as expected!

http://sharepoint-redirect.local/Shared%20Documents/Forms/DispForm.aspx?ID=1&Source=http%3A%2F%2Fsharepoint%2Elocal%2FShared%2520Documents%2FForms%2FAllItems%2Easpx&RootFolder=%2FShared%20Documents&ContentTypeId=0x010100293CE4623453F044AE694E186F090B7C&IsDlg=1

redirected to:

http://sharepoint.local/Shared%20Documents/Forms/DispForm.aspx?ID=1&Source=http%3A%2F%2Fsharepoint%2Elocal%2FShared%2520Documents%2FForms%2FAllItems%2Easpx&RootFolder=%2FShared%20Documents&ContentTypeId=0x010100293CE4623453F044AE694E186F090B7C&IsDlg=1/Shared%20Documents/Forms/DispForm.aspx

 

image

For MCTs: Classroom Setup Tools for MS Learning Hyper-V machines

(Download link below!)

If you set up a MS Learning Classroom with Hyper-V and the images provided by MS at the MCT download page you need to deploy the VHD files (and the other VM files of course) to “C:ProgrammeMicrosoft Learning<…>”

The last days I set up a new Hyper-V server at my office:

  • 128GB SSD => system
  • 2TB HDD => machines
  • 32GB RAM

I want to store the MS Learning machines on “D:” (=> 2TB).

The MS Learning machines have differential VHDs that are based on a couple of “Base VHDs”. In all differential VHD files there are references to the location of the original file:

image

Furthermore there are to files for every machine that contain config and export/import informations. This files have absolute file location references too.

Because this MS Learning machines are not productive Hyper-V machines I decided to manipulate a neseccary files to be able to store the machines on another drive. Manipulating this files is not supported!!!

My package contains 4 PowerShell scripts:

1. “Unpack”

image

This script allows you to decompress all compressed MS Learning machines in a folder to a destination folder.

To run the script you need to have “unrar.exe” in the same directory as the script. Download and execute this file ftp://ftp.rarlab.com/rar/unrarw32.exe. This is an self extracting archive that contains “unrar.exe”.

You only need to manipulate the “$list” variable: specify all source directories and destination directories you need to extract.

In my case this is the result:

image

2. “Patch”

This script manipulates all neseccary files.

You need to have them all in a dedicated directory. In my case everything is located under “I:Learning”. This directory is the entry point for the other scripts. In this directory all base and differential VHDs must be located.

“Patch” modifies:

  • config.xml => replace VHD paths
  • <machine-guid>.exp => replace VHD paths
  • <name>.vhd / <name>.avhd => replace VHD paths

First the “Patch” script scans the root path (e.g. “I:Learning”) and all sub directories. It saves all VHD file names.

The next steps are to open the files specified above and replace all VHD paths (“c:program files…”) with the correct paths (“I:Learning…”).

For “config.xml” und “<machine-guid>.exp” the script creates backup files with the same name and additional “.bak” extension. If you run the script twice the backup will be restored before processing.

For “<machine-guid>.exp” another file will be creates: “<machine-guid>.exp.ik”. This file is used later for patching the virtual machine in Hyper-V.

3. “ImportVMs”

This script imports the MS Learning Machines to Hyper-V using WMI (see http://social.technet.microsoft.com/Forums/en-US/winserverClustering/thread/a4e0d12d-534c-41f6-8038-4e8a7dbbba15).

image

It imports every machine found in the sub directories of the given machine root: “I:Learning”

4. “mountVHDs”

You maybe need to mount the VHDs after importing.

This is a part of the “Classroom Setup Guide” for one training:

image

In my case this happens for all machines!!! – In case of course no. “10174” (SharePoint Config and Admin) you would have to pathc 15 machines with about 20 VHD files. You would have to repeat mounting the VHDs on every classroom machine!!! – NO WAY!

image

While importing the machines you get this event log entries in the Hyper-V VMMS/Admin event log:

  1. Import task failed to fix up connection information for connection ‘I:Learning10174Drives10174A-SP2010-WFE1-FINALVirtual Hard Disks10174A-SP2010-WFE1-FINAL.vhd’. (Event Id 18430)
  2. Import task failed to fix up connection information for connection ‘I:Learning10174Drives10174A-SP2010-WFE1-FINALVirtual Hard Disks10174A-SP2010-WFE1-Allfiles-diff.vhd’. (Event Id 18430)
  3. ‘10174A-SP2010-WFE1-FINAL’: The file name ” is invalid. You cannot use the following names (LPTn, COMn, PRN, AUX, NUL, CON) because they are reserved by Windows. (Virtual machine ID FE26F0D1-B18C-440D-8CB6-792DBB6E1A5B) (Event Id 12634)
  4. ‘10174A-SP2010-WFE1-FINAL’ failed to add device ‘Microsoft Virtual Hard Disk’. (Virtual machine ID FE26F0D1-B18C-440D-8CB6-792DBB6E1A5B) (Event Id 14140)
  5. Failed to import correctly the device ‘{ResourceType=21, OtherResourceType="<null>", ResourceSubType="Microsoft Virtual Hard Disk"}’ for ‘10174A-SP2010-WFE1-FINAL’ (Virtual machine ID FE26F0D1-B18C-440D-8CB6-792DBB6E1A5B). Error: Invalid parameter (0x80041008) . (Event Id 18130)
  6. Import completed with warnings. Please check the Admin events in the Hyper-V-VMMS event log for more information. (Event Id 18250)

(This are examples! The paths and names will vary!)

 

image

 

The script “MountVHDs” will modify all machines in Hyper-V. ALL machines!! Be very carefull!! Again: Don’t use the scripts in a production environment!!!

To execute this script you need to install the PowerShell Hyper-V module: http://pshyperv.codeplex.com/

The script opens every machine. Than it searches in the MS Learning Root (“i:learning”) for the file “<machine-guid>.exp.ik”. If there is such a file the script modifies the virtual machine and mounts the VHDs as configured in the “EXP.IK” file.

For me it works perfectly! – Now I can set up my classroom server in few minutes!

Here you can download the scripts: http://pscst.codeplex.com – Please feel free to improve them – and to send me your improvements!!!

Create WSP (Cab) file on SharePoint Server using SharePoint Built-in functionality

SharePoint Server 2010 and Foundation too has a namespace “Microsoft.SharePoint.Utilities.Cab”. In this namespace there are all functions you need to create CAB=WSP files. – I have already used this functionality in a private project: https://blog.kenaro.com/2012/02/29/demo-generating-sandboxed-solutions-through-code-for-sharepoint-2010/

Here is the PowerShell script to create create CAB = WSP files on a SharePoint server:

# Written by Ingo Karstein (https://blog.kenaro.com)
#   v0.1.0.0 / 2012-05-01

$destWSPfilename = "C:UsersAdministratorSourceMyWSP.wsp"
$sourceSolutionDir = [System.IO.DirectoryInfo]"C:UsersAdministratorSourceMyWSP_Content"

##################################

$a = [System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SharePoint")
$ctor = $a.GetType("Microsoft.SharePoint.Utilities.Cab.CabinetInfo").GetConstructors("Instance, NonPublic")[0]

$cabInf = $ctor.Invoke($destWSPfilename );

$mi = $cabInf.GetType().GetMethods("NonPublic, Instance, DeclaredOnly")
$mi2 = $null
foreach( $m in $mi ) {
    if( $m.Name -eq "CompressDirectory" -and $m.GetParameters().Length -eq 4 ) {
        $mi2 = $m;
        break;
    };
}

$mi2.Invoke($cabInf, @( $sourceSolutionDir.FullName, $true, -1,$null ));