SharePoint 2010 SP1 – released!

SP1 obsahuje všechny dosavadní kumulativní opravy, navíc však klíčové novinky:[more]

  • Koš pro weby – pokud odstraníte celý web, je možné ho nyní vrátit zpět (dříve se kompletně nenávratně odstranil včetně všech dat) – a že to byl častý problém Obličej s očima v sloup
  • Zásadně vylepšená podpora pro prohlížeč Google Chrome & Office Web Apps
  • Storage Metrics – zobrazení alokace dostupného prostoru (v SP2010 byla tato funkce odstraněna, již je opět zpět)
  • RBS (Remote Blob Storage) – Vzdálené úložiště podporuje pro zajištění vyšší spolehlivosti stínové kopie.
  • Powershell cmdlet (Move-spsite) – přesun webové kolekce z jedné databáze do druhé bez přesunu samotných dat (v případě využití RBS)

SP2010 Branding Tip Series

Randy Drisgill:

Nelze modifikovat nastavení IIS WAMREG admin Service – nastavení DCOM je zašednuté/disabled na Windows Server 2008 R2

Problém je v tom, že aktuálně přihlášený uživatel nemá přístup k danému klíči v registrech systému.

Konkrétně jde o klíč v registrech:

HKEY_CLASSES_ROOT\AppID\{61738644-F196-11D0-9953-00C04FD919C1}

Aby jste tedy mohli změnit nastavení konkrétního DCOM objektu, je potřeba provést změnu nastavení v registrech a tento klíč přiřadit vlastníkům ze skupiny Administrators.

Pokud nyní zavřete správu DCOM objektů a znovu otevřete, již bude možné modifikovat nastavení IIS WAMREG admin Service DCOM objektu.

SharePoint Search Crawler indexuje na publishing portálu kompletně celou stránku–jak indexovat pouze obsah bez navigace a ostatních rušivých elementů

Search Crawler na publishing portálu indexuje vždy kompletní stránku, tak jak dostane HTML, tak ho uloží do své databáze. To je ovšem problém, neboť následně při vyhledávání vyhledává texty i v navigaci webu nebo hlavičce a patičce. Tyto elementy jsou ale ve většině případů pro všechny stránky na portále stejné, uživatel tak dostává nerelevantní výsledky (navíc stále stejné):

image

Neexistuje možnost, jak automaticky donutit Search Server, aby toto chování změnil a například ignoroval stále stejné elementy na stránce, případně jinak pomocí tagu vynechával zvolené oblasti v master page.

Udělal jsem si proto malého pomocníka, který se vloží do masterpage v podobě:

[more]

<DevIT:SearchCrawlTrimmedControl runat="server" SearchAccount="MySearchAccount">

zde vlozte menu, header, footer... vse co chcete skryt pred indexerem

</DevIT:SearchCrawlTrimmedControl>

Kde uvnitř ovládacího prvku SearchCrawlTrimmedControl jsou všechny elementy, které chci skrýt před indexerem obsahu. Tato třída pak následně podle přistupujícího účtu skryje nebo zobrazí vybrané elementy.

/// <summary> 
/// Ovladaci prvek pro skyti vsech nepotrebnych veci v masterpage pri indexovani - aby se indexoval pouze samotny obsah stranky 
/// <DevIT:SearchCrawlTrimmedControl runat="server">  
/// <!-- zde vlozte menu, header, footer... vse co chcete skryt pred indexerem --> 
/// </DevIT:SearchCrawlTrimmedControl> 
/// </summary> 
public class SearchCrawlTrimmedControl : Control 
{ 
    public string SearchAccount 
    { 
        get { 
            string ret = ViewState["SearchAccount"] as string; 
            if (string.IsNullOrEmpty(ret)) 
                return "spsearch"; 
            return ret; 
        } 
        set { ViewState["SearchAccount"] = value; } 
    }

    protected override void Render(HtmlTextWriter writer) 
    { 
        bool render = true; 
        SPUser cu = SPContext.Current.Web.CurrentUser; 
        if (cu != null) 
        { 
            if (cu.LoginName.ToLower().EndsWith(SearchAccount)) 
            { 
                render = false; 
            } 
        } 
        if (Context.Request != null && Context.Request.UserAgent != null && 
            Context.Request.UserAgent.ToLower().Contains("robot")) 
        { 
            render = false; 
        } 
        if (render) 
        { 
            base.Render(writer); 
        } 
        else 
        { 
        } 
    } 
}

An error occurred during the processing of /_catalogs/masterpage/MyCustom.master. Code blocks are not allowed in this file.

Vložení server side kódu přímo do masterpage nebo do stránek předlohy je nutné povolit vložením následující direktivy do souboru web.config:

[more]

 <SharePoint>
   <SafeMode MaxControls=“200″ CallStack=“false“ DirectFileDependencies=“10″ TotalFileDependencies=“50″ AllowPageLevelTrace=“false“>
     <PageParserPaths>
           
<PageParserPath VirtualPath=“~/*“ CompilationMode=“Always“ AllowServerSideScript=“true“ />
     </PageParserPaths>
   </SafeMode>

Kde VirtualPath může být cesta do knihovny stránek předlohy, nebo v mém případě je možné tuto akci povolit pro celou webovou aplikaci.

SharePoint 2010 + Linq + anonymní uživatel

Při vytváření webové aplikace na SharePoint 2010 s anonymní přístupem jsem narazil jednu z mnoha nedokumentovaných vlastností SharePointu 2010, kdy po zapnutí anonymního přístupu přestal fungovat LINQ a začaly vznikat chyby při snaze přistupovat k seznamům právě pomocí těchto dotazů.

První pokus byl samozřejmě obalit tuto funkci zobrazující navigaci eskalací oprávnění na systémového uživatele pomocí funkce SPSecurity.RunWithElevatedPrivileges, to ale nikam nevedlo a Linq nepřevzal oprávnění.

image

Nebyl jsem samozřejmě první kdo na to narazil, našel jsem jeden post, který to řeší:

[more]

http://jcapka.blogspot.com/2010/05/making-linq-to-sharepoint-work-for.html

Takto:

public static class AnonymousContextSwitch 
    {  
        public static void RunWithElevatedPrivelligesAndContextSwitch( 
                SPSecurity.CodeToRunElevated secureCode) 
        { 
            try 
            { 
                //If there is a SPContext.Current object and there is no known user, 
                // we need to take action 
                bool nullUser = (SPContext.Current != null && 
                       SPContext.Current.Web.CurrentUser == null);

                HttpContext backupCtx = HttpContext.Current; 
                if (nullUser) 
                    HttpContext.Current = null;

                SPSecurity.RunWithElevatedPrivileges(secureCode); 
                if (nullUser) 
                    HttpContext.Current = backupCtx; 
            } 
            catch (Exception ex) 
            { 
                string errorMessage = "Error running code in null http context"; 
                //Use your favourite form of logging to log the error message and exception .... 
            } 
        } 
    }

Toto řešení sice funguje, je ale potřeba si rozhodnout, zda je to na aktuálním projektu bezpečné a co přesně pod tímto oprávněním anonymní uživatel může provádět, pokud pouze číst informace (kde nejsou důvěrné informace řešeny formou oprávnění), tak je to možná pro některé případy použitelné. Lepší způsob ale je buď vůbec LINQ nepoužít (což už u hotového projektu lze jen obtížně), nebo vytvořit nového uživatele v SP s omezeným oprávněním a předávat jeho kontext při inicializaci objektu SPSite, tedy mírně zmodifikovat výše uvedenou třídu AnonymousContextSwitch tak, aby se kontext vytvořil pro tohoto uživatele s nízkým oprávněním.

SharePoint: This page contains content or formatting that is not valid. You can find more information in the affected sections

Tuto pěknou chybu způsobují validátory použité ve vlastní webpartě, chyba vzniká pouze pokud se jedná o stránku pro publikování (publishing page).

SharePoint z neznámého důvodu spustí validace na webpartě při ukládání stránky a nedovolí stránku uložit pokud validace ovládacích prvků neprojde v pořádku. Na tom by nebylo nic divného pokud není specifikovaný atribut ValidationGroup a měla by se kontrolovat logicky celá stránka, ale SharePoint kontroluje validaci i na ovládacích prvcích kde je ValidationGroup specifikovaný.

Na lepší způsob než níže uvedený jsem zatím nepřišel, kdy vypínám validace v případě, že aktuální stránka je v editačním módu:

protected override void CreateChildControls()
{

     // some code

     if (SPContext.Current.FormContext.FormMode == SPControlMode.Edit || 
        SPContext.Current.FormContext.FormMode == SPControlMode.New)

     {
            validator.Enabled = false;
     }

}

SharePoint 2010: The site is too large to save as a template. The size of a template cannot exceed [?] bytes.

Stejně jako jsem psal i pro SharePoint 2007:

http://www.pavelnovotny.info/post/WSS-The-site-is-too-large-to-save-as-a-template-The-size-of-a-template-cannot-exceed-10485760-bytes.aspx

stále funguje příkaz pro zvětšení možné velikosti nahrávané šablony pomocí:

stsadm -o setproperty -propertyname max-template-document-size -propertyvalue 104857600