Pavel Novotný

.NET Framework, SharePoint, Dynamics CRM, RC Helicopters, Honda VFR CrossRunner

MOSS: nastavení práv pro guest uživatele u publishing site

Aby nemohl anonymní uživatel přistupující k publishing site portálu prohlížet všechny listy, formuláře, položky ve standardních formulářích listů WSS, je potřeba pro příslušnou site nastavit práva pro uživatele guest. Nastavit práva je samozřejmě možné přes administraci, lepším a spolehlivějším řešením je určitě takové nastavení provést při aktivaci feature našeho projektu /omezující lidskou chybu/.

internal static void LockDownViewFormPages(SPWeb web)
{
    RunWithWebCulture(web, delegate
    {
        ConfirmNotCentralAdminWebApp(web);
        SPRoleDefinition byType = web.RoleDefinitions.GetByType(SPRoleType.Guest);
        byType.BasePermissions = SPBasePermissions.BrowseDirectories |
                                 SPBasePermissions.Open |
                                 SPBasePermissions.OpenItems |
                                 SPBasePermissions.ViewPages;
        byType.Update();
    });
}

Takto to lze samozřejmě použít i v "pouhém" WSS pro jiné účely/skupiny uživatelů.

Poznámka: SPBasePermissions.BrowseDirectories je potřeba, jinak nejde zjistit default stránka pomocí "PublishingWeb.DefaultPage"

WSS: Hromadné odstranění záznamů v listu

Pokud jste někdy potřebovali kompletně vyprázdnit list/knihovnu dokumentů, určitě jste rychle narazili, stejně jako já, na neexistenci takové funkce. Samozřejmě je možné mazat jednotlivé záznamy v iteraci, to je ale velice časově nákladná operace, kterou nejde použít ani na desítkách záznamů :( Smazání jednoho záznamu trvá klidně i 500ms, 1000 záznamů by se tedy mazalo 5-10 minut.

Nakonec jsem našel trošku krkolomné řešení, které je však řádově rychlejší než mazání v iteraci. Základem celé akce je složení velkého XML balíku hromadného příkazu pro smazání jednotlivých záznamů v jednom volání. Vtip je v tom, že i když toto řešení také iteruje celým seznamem v listu, property ID je u SPListItem už přednačtena v cache Sharepointu, ten tedy nemusí pro každou iteraci sahat do DB, složení tak může proběhnout rychle. Výsledný balík se už jen předhodí enginu WSS, který jej interně zpracuje. Po ukončení ještě v mém případě volám vyprázdnění koše aktuálně přihlášeného uživatele, to samozřejmě není nutné a může být v některých případech i kontraproduktivní při volání pod "real-life" uživatelem.

Pokud existuje lepší cesta, určitě bych se nechal rád inspirovat :)

private static void BatchListItemsDelete(SPList spList)
{
    StringBuilder sbDelete = new StringBuilder();
    sbDelete.Append("<?xml version=\"1.0\" encoding=\"UTF-8\"?><Batch>");
    string command = "<Method><SetList Scope=\"Request\">" + spList.ID +
        "</SetList><SetVar Name=\"ID\">{0}</SetVar><SetVar Name=\"Cmd\">Delete</SetVar></Method>";

    foreach (SPListItem item in spList.Items)
        sbDelete.Append(string.Format(command, item.ID.ToString()));

    sbDelete.Append("</Batch>");

    spList.ParentWeb.ProcessBatchData(sbDelete.ToString());
    spList.ParentWeb.RecycleBin.DeleteAll(); 
}

Kniha zdarma: Virtualizační řešení (MS Press)

"V jednotlivých kapitolách se dočtete o typech virtualizace a pak samozřejmě o každé z nich zvlášť. Těšit se můžete na informace o Hyper-V, SC Virtual Machine Manageru, aplikační virtualizaci APP-V, prezentační virtualizaci za pomoci Terminal Services, desktopové virtualizaci MED-V a VDI, plus samozřejmě spoustu tipů a rad na stavbu virtualizačních řešení přesně pro vaše potřeby!"

http://csna01.libredigital.com/?urmvs17u33

http://blogs.technet.com/technetczsk/archive/2009/02/04/ms-press-zdarma-kniha-virtualizacni-reseni.aspx