Das Erweitern des Tools “stsadm.exe” zum Verwalten des MOSS 2007 ist mit .NET nicht sehr aufwändig. Es muss eine Klasse geschrieben werden, welche die “ISPStsadmCommand” Schnittstelle implementiert. Die Assembly in der sich die Klasse befindet muss Signiert werden und anschließend muss eine XML Konfigurationsdatei, die eine Verbindung mit dem stsadm-Command herstellt, geschrieben werden.
Dieses Beispiel ist in der Lage, eine Seite rekursiv zu löschen, da das “deleteweb” Command ist nicht in der Lage ist, ein SPWeb mit Unterseiten zu löschen.
/// <summary>
/// Klasse für die Schnittstelle ISPStsadmCommand zum Bereitstellen des stsadm Befehls.
/// </summary>
public class RDeleteWeb : ISPStsadmCommand
{
#region ISPStsadmCommand Members
/// <summary>
/// Anzeigen der Hilfe
/// </summary>
public string GetHelpMessage(string command)
{
StringBuilder res = new StringBuilder();
Assembly asm = Assembly.GetAssembly(this.GetType());
res.AppendLine("Thomas Mentzel - (C) 2007 Softwareküche");
res.AppendLine("STSADM Extensions Version " + asm.ToString());
res.AppendLine();
res.AppendLine("usage:");
res.AppendLine(" -url <URL>");
res.AppendLine("");
return res.ToString();
}
/// <summary>
/// Einstiegspunkt üfr das STSADM
/// </summary>
public int Run(string command, System.Collections.Specialized.StringDictionary keyValues, out string output)
{
Assembly asm = Assembly.GetAssembly(this.GetType());
output = "Thomas Mentzel - (C) 2007 Softwareküche";
output += "STSADM Extensions Version " + asm.ToString();
//Wenn kein Parameter, dann Infofenster
if (keyValues.Count <= 1)
{
output = GetHelpMessage(command);
return 0;
}
// Nur Command "RemoveInheritedPermissions" durchführen
if (String.Compare(command, "RDeleteWeb", true) == 0)
{
output += DoRDeleteWeb(keyValues);
return 0;
}
else
{
throw new InvalidOperationException("Funktion wird nicht unterstützt. " + command);
}
}
#endregion
#region DoRDeleteWeb
/// <summary>
/// Recursive deletes then web and all subwebs.
/// </summary>
private string RDeleteAWeb(SPWeb web)
{
StringBuilder res = new StringBuilder();
res.AppendLine("Deleting " + web.Url);
if (web.Webs.Count > 0)
{
foreach (SPWeb subweb in web.Webs)
{
res.Append(RDeleteAWeb(subweb));
}
}
web.Delete();
return res.ToString();
}
/// <summary>
/// Recursive deletes then web and all subwebs.
/// </summary>
private string DoRDeleteWeb(System.Collections.Specialized.StringDictionary keyValues)
{
SPSite site = new SPSite(keyValues["url"]);
SPWeb web = site.OpenWeb();
StringBuilder res = new StringBuilder();
res.AppendLine(RDeleteAWeb(web));
return res.ToString();
}
#endregion
}
Der nächste Schritt ist das Erzeugen einer signierten Assembly und das Erzeugen der XML Datei mit folgender Beispieldaten:
<?xml version="1.0" encoding="utf-8" ?>
<commands>
<command class="StsadmCommand.RDeleteWeb, StsadmCommand, Version=1.0.0.0, Culture=neutral, PublicKeyToken=affe000020021980" name="RDeleteWeb" />
</commands>
Der .NET Reflector hilft dabei, die vollständigen Assembly-Informationen auszulesen.
Schließlich muss die Assembly nach “%CommonProgramFiles%Microsoft SharedWeb Server Extensions12bin” und das XML nach “%CommonProgramFiles%Microsoft SharedWeb Server Extensions12conf” kopiert werden.
Nun sollte beim Aufruf von “stsadm.exe” ohne Parameter eine Liste die Operation des “stsadm.exe” inklusive “rdeleteweb” erscheinen.
