Pavel Novotný

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

PowerGUI: Get-SPWeb : Microsoft SharePoint is not supported with version 4.0.30319.1 of the Microsoft .Net Runtime.

Po aktualizaci používá PowerGUI (http://www.powergui.org) standardně .NET Framework 4.0, ten ale není podporován pro práci s SharePointem 2010, podporován je pouze a jen 2.0 (3.5), jinak při práci s API vznikají výjimky:

Get-SPWeb : Microsoft SharePoint is not supported with version 4.0.30319.1 of the Microsoft .Net Runtime.

 

Přímo v nástroji PowerGUI nelze verzi .NET Frameworku změnit, je potřeba upravit konfigurační soubor aplikace:

  1. Otevřít cestu C:\Program Files (x86)\PowerGUI
  2. Najít a otevřít soubor ScriptEditor.exe.config v poznámkovém bloku
  3. Odmazat nebo zakomentovat řádek <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0" />
  4. Po uložení a restartu aplikace se defaultně použije .NET Framework 2.0 (respektive s nástavbou na 3.5)

Zamknutí/odmknutí všech kolekcí webů ve webové aplikace najednou

Vstupní parametry:

  • webAppUrl – URL adresa webové aplikace
  • lockState
    • ReadOnly = zamčení pouze pro čtení
    • Unlock = odemčení zpět pro editaci

 

Příklad:

.\SetLockStateInAllSiteCollections.ps1 -webAppUrl http://srvdev:81/ -lockState ReadOnly

 

<#
   .Synopsis
	Sets/removes all site collection lock in web application
   .Example
   .\SetLockStateInAllSiteCollections.ps1 -webAppUrl http://srvdev:81/ -lockState ReadOnly
   .\SetLockStateInAllSiteCollections.ps1 -webAppUrl http://srvdev:81/ -lockState Unlock
   .Notes
	NAME: SetLockStateInAllSiteCollections.ps1
	AUTHOR: novotny@devit.cz
   .Link
	http://www.devit.cz
#>

param (
	[Parameter(Mandatory=$True)]
    [string]$webAppUrl,
	[Parameter(Mandatory=$True)]
    [string]$lockState
)

Add-PSSnapin Microsoft.SharePoint.PowerShell -erroraction SilentlyContinue

$webApp = Get-SPWebApplication $webAppUrl
$allSites = $webApp | Get-SPSite

foreach ($site in $allSites)
{
    Write-Host "Setting " -nonewline
    Write-Host $site.url -nonewline
    Write-Host " to $lockState..." -nonewline
    Set-SPSiteAdministration -LockState $lockState -Identity $site.url
    Write-Host "[OK]" -foregroundcolor green
}

SetLockStateInAllSiteCollections.ps1 (952,00 bytes)

Spuštění workflow na všech položkách/dokumentech pomocí PowerShellu

Vstupní parametry:

  • siteUrl – URL adresa na web kde se nachází seznam
  • listTitle – název seznamu
  • workflowName – název workflow (asociace)
  • workflowCulture – v jakém jazyce je název WF (default en-US)
  • restartIfRunning – pokud WF běží, zastaví se (default je NE, vynechá se zpracování)

 

Příklad:

.\StartListWorkflowOnAllItems.ps1 -siteUrl http://srvdev:81/ -listTitle "Documents" -workflowName "Approval WF" -restartIfRunning $true

 

StartListWorkflowOnAllItems.ps1 (2,62 kb)

 

<# 
   .Synopsis 
    Start workflow on all items in list or document library
   .Example
   .\StartListWorkflowOnAllItems.ps1 -siteUrl http://srvdev:81/ -listTitle "Documents" -workflowName "Approval WF" -restartIfRunning $true
   .Notes 
    NAME: StartListWorkflowOnAllItems.ps1
    AUTHOR: novotny@devit.cz
   .Link 
    http://www.devit.cz
#> 

param (
    [Parameter(Mandatory=$True)]
    [string]$siteUrl,
    [Parameter(Mandatory=$True)]
    [string]$listTitle,
    [Parameter(Mandatory=$True)]
    [string]$workflowName,
    [string]$workflowNameCulture = "en-US",
    [boolean]$restartIfRunning = $true
)

Add-PSSnapin Microsoft.SharePoint.PowerShell -ErrorAction SilentlyContinue
[void][System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SharePoint") 

$web = Get-SPWeb -Identity $siteUrl

Write-Host "Opening site '$($web.Title)'"

$manager = $web.Site.WorkFlowManager

$list = $web.Lists[$listTitle]
if ($list -eq $null) {
    Write-Host "Unable to find list '$listTitle'" -ForegroundColor Red
    return
}
 
$assoc = $list.WorkflowAssociations.GetAssociationByName($workflowName, $workflowNameCulture)
if ($assoc -eq $null) {
    Write-Host "Unable to find WF association '$workflowName' for culture '$workflowNameCulture'" -ForegroundColor Red
    return
}
 
$data = $assoc.AssociationData
$items = $list.Items

Write-Host "Starting workflows in list '$($list.Title)'"
foreach($item in $items)
{
    $itemName = $item.Title
    if ($item.FileSystemObjectType -eq [Microsoft.SharePoint.SPFileSystemObjectType]::File) {
        $itemName = $item.File.Name
    }

    Write-Host "Starting on ID:$($item.ID) - '$itemName'"
    try {
        $runningWf = $null

        foreach($wf in $item.Workflows) {
            if ($wf.AssociationId -eq $assoc.Id -and ($workflow.InternalState -ne 'Completed' -and $workflow.InternalState -ne 'Cancelled')) {
                $runningWf = $wf
                break
            }
        }

        if ($restartIfRunning -eq $false -and $runningWf -ne $null) {
            Write-Host "   Already Running... Skipping" -ForegroundColor Green
            continue
        }

        if ($runningWf -ne $null) {
            Write-Host "   Stopping existing WF" -ForegroundColor Green
            [Microsoft.SharePoint.Workflow.SPWorkflowManager]::CancelWorkflow($runningWf)
        }
        
        $wf = $manager.StartWorkFlow($item, $assoc, $data, $true)
        Write-Host "   OK" -ForegroundColor Green
    }
    catch [System.Exception] {
        Write-Host "   ERROR:" $_ -ForegroundColor Red
    }
}
  
$manager.Dispose()
$web.Dispose()

Ladění SharePoint auto-hosted apps - The breakpoint will not currently be hit. No symbols have been loaded for this document

Pro ladění projektu na šabloně SharePoint 2013 auto-hosted je nutné vždy v solution projektu Visual Studia nastavit více projektů pro spuštění, jinak se VS nepodaří chytit správný proces a hlásí chybu chybějících symbolů “The breakpoint will not currently be hit. No symbols have been loaded for this document”

 

  • pravý klik na solution/řešení projektu
  • Set StartUp Projects
  • Multiple startup projects
  • u SP projektu i u projektu webové části nastavte Action na hodnotu Start

 

Ztracené 2 hodiny hledání problému s PDB  Obličej s očima v sloup

Překlad odkazů dle AAM – SharePoint

SharePoint automaticky překládá všechny odkazy dle aktuální zjištěné URL zóny z HttpRequestu, je jedno zda máte odkazy přímo ve webpart stránce, ve sloupci typu Hypertextový odkaz, případně přímo v richtextu, SharePoint se vždy při renderingu podívá, zda odkaz není definován v AAM a pokud ano, automaticky ho přeloží na tvar přístupný aktuálně přihlášenému uživateli. Je to funkce logická a žádaná, neboť je jedno, zda vložíte do textu odkaz z intranetové či extranetové zóny (url adresy SP portálu), všichni uživatelé budou mít odkazovaný obsah dostupný vždy.
Stejné chování je potřeba přenést i do vlastně vyvinutých funkcí, webpart, aplikačních stránek – protože tam to SharePoint sám o sobě neumí. Převod je sám o sobě velice jednoduchý, základem je objekt SPSite, který je ale nutné buď převzít z kontextu SPContext.Current.Site nebo ho inicializovat pomocí aktuální Url adresy HttpRequestu – tedy tak, aby došlo k inicializaci objektu SPSite ve správné zóně (SPUrlZone), nelze tedy tento objekt inicializovat pomocí GUID, kde se informace o zóně ztratí.
Pro překlad odkazu mám triviální rozšíření objektu SPSite:
 
public static string TranslateUrlByAAM(this SPSite site, string url) 
{ 
    if (site == null) 
        throw new ArgumentNullException("site"); 
    if (string.IsNullOrEmpty(url)) 
        return url;

    Uri originalUri = new Uri(url); 
    Uri translateUri = SPFarm.Local.AlternateUrlCollections 
        .RebaseUriWithAlternateUri(originalUri, site.Zone); 
    if (translateUri == null) 
        return url; 
    return translateUri.ToString(); 
}
 
Analogicky regex pro replace url odkazů v html textu.

Optimalizace paměti SharePointu 2013

Provozovat SharePoint 2013 na jednom stroji v defaultní konfiguraci je téměř nemožné, minimálně na stroji s 12GB operační paměti je to nepoužitelné. Jasně, pro produkci je to nesmysl a dle Microsoftu nesprávná konfigurace HW (jenže v ČR to tak veselé není, hlavně díky ceně licencí – dle mého odhadu, 60% zákazníků používá single server, u zákazníků s Foundation je to 99.99%). Můj konkrétní problém je však samozřejmě na vývojovém serveru, kde to nechci provozovat na x strojích, ale chci to mít vše all-in-one, aby se to dalo snadno zálohovat, provádět snapshoty atd.

Více...

SharePoint: návod jak zjistit ve které knihovně je nejvíce položek/dokumentů

Stačí nad obsahovou databází SharePointu vykonat dotaz:

select webs.Title,webs.FullUrl, tp_Title,tp_ServerTemplate,UserDataCount,DocsCount
from AllLists left outer join
(select tp_ListId, COUNT(*) as UserDataCount from AllUserData
group by tp_ListId ) E On E.tp_ListId = AllLists.tp_ID
left outer join
(select ListId, COUNT(*) as DocsCount from dbo.Docs
group by ListId ) P ON AllLists.tp_ID = P.ListId
left outer join Webs ON AllLists.tp_WebId = Webs.id
order by DocsCount desc

výsledek:

image