Zjištění zapomenutého hesla aplikačního poolu IIS

V SharePointu 2007 byla v objektu SPApplicationPool vlastnost Password, od verze 2010 je však již označená jako deprecated, heslo se však zpětně dá zjistit příkazem z command line:

 

cmd.exe /c $env:windir\system32\inetsrv\appcmd.exe list apppool „apppoolname“ /text:ProcessModel.Password

 

Stále tedy platí, nezadávejte nikdy a nikde 2x stejné heslo, nikdy nevíte, kdy a kdo ho je schopen přečíst.

 

Zdroj: http://blah.winsmarts.com/2014-5-Find_an_Application_Pool-and-rsquo;s_password.aspx

SharePoint 2013–nasazení farm solution pro SP2013 v compatibility módu 2010

SharePoint 2013 v kolekcích webů vytvořených nebo migrovaných v compatibility módu 2010, automaticky skrývá všechny features z WSP farm řešení pro verzi 2013. Pokud tedy provádíte upgrade, připojíte starou kolekci webů 2010, nainstalujete nové farm balíčky pro podporu SP2013 a chcete ponechat kolekci ve vzhledu 2010, alespoň do dokončení nutných úprav, feature z nových balíčků neuvidíte. Aby bylo možné aktivovat nové feature na starém UI, je potřeba provést retract balíčku ze všech webových aplikací a znovu provést deploy s atributem CompatibilityLevel:

[more]

Add-SPSolution „c:\DEV\DevIT.SharePoint.FBASuite\DEV2013-SQL\Builds\DevIT.SharePoint.FBASuite.wsp“
Install-SPSolution -Identity DevIT.SharePoint.FBASuite.wsp -WebApplication http://srvdev:555 -GACDeployment CompatibilityLevel {14,15}

 

Tím dojde k automatickému zkopírování všech potřebných souborů z WSP do obou klíčových složek SharePointu:

Pro verzi 2013:

c:\Program Files\Common Files\microsoft shared\Web Server Extensions\15\TEMPLATE\FEATURES\

Pro verzi 2010:

c:\Program Files\Common Files\microsoft shared\Web Server Extensions\14\TEMPLATE\FEATURES\

 

Nyní je feature viditelná i v kolekci webů UI verze 2010.

SharePoint domény k prodeji: sharepoint-extranet.com + sharepoint-forms-authentication.com

Aktuálně nabízím k prodeji dvě domény s SharePoint tématikou, které už dosloužily svým původním účelům:

 

  1. sharepoint-extranet.com
  2. sharepoint-forms-authentication.com

 

Pokud budete mít kdokoliv zájem, neváhejte mě kontaktovat na emailu novotny@pavelnovotny.info

Vyvolávací cena je pouze 1.000 EUR / doména.

SharePoint+SPServices: Jednoduchá kontrola unikátnosti IČ společnosti s možností uložení i v případě duplicity

SharePoint verze 2010 a novější obsahuje v definici sloupce volbu Vynutit jedinečné hodnoty – tato volba zajistí, že pokud máte například seznam dodavatelských společností a chcete vynutit jejich unikátnost pomocí sloupce IČ, můžete jednoduchým zatržením volby funkci aktivovat. Funkce má však několik much a pro tento způsob kontroly se zrovna nehodí, problémy jsou minimálně dva:

  • Co pokud chci jenom kontrolu s možností uložení? Později budu chtít například ukládat i pobočky společností se stejným IČ?
  • Co když uživatel v jednom případě vyplní formát jako 28708636 a druhý jako 287 08 636?

[more]

V tomto případě je už nutné sáhnout po kustomizaci pomocí javascriptu a vytvořit malý script, který sjednotí formát, ořeže nepovolené znaky a ve finále i zkontroluje duplicitu IČ s možností uložení.

Pro příklad jsem použil volně dostupnou javascript knihovnu SPServices na http://spservices.codeplex.com/, která obsahuje spoustu užitečných funkcí pro každodenní použití, za zmínku určitě stojí kaskádové seznamy, zobrazení souvisejících informací z lookupu, našeptávač (autocomplete), filtr dropdownu, vyplnění defaultních hodnot atd., více přímo v dokumentaci http://spservices.codeplex.com/documentation

Prerequisity jsou rovněž popsány v dokumentaci, je potřeba jQuery a SPServices scripty nahrát do knihovny SharePoint a přidat reference do masterpage, případně do samotné stránky formuláře, více v detailní dokumentaci na CodePlexu.

<script language="javascript" type="text/javascript" src="/jQueryLibraries/jquery-1.11.0.min.js"></script>

<script language="javascript" type="text/javascript" src="/jQueryLibraries/jquery.SPServices-2014.01.min.js"></script>

Pak už jen vložit následující script na stránku formuláře, kde chcete provádět kontrolu:

$("input[title='IČ']").bind('keypress', function (event) {
    var regex = new RegExp("^[a-zA-Z0-9]+$");
    var key = String.fromCharCode(!event.charCode ? event.which : event.charCode);
    if (!regex.test(key)) {
        event.preventDefault();
        return false;
    }
});

$("input[title='IČ']").bind("change", function () {
    var input = $(this),
        text = input.val().replace(/[^a-zA-Z0-9-_\s]/g, "");
    if (/_|\s/.test(text)) {
        text = text.replace(/_|\s/g, "");
    }
    input.val(text);
});

$().SPServices.SPRequireUnique({
    columnStaticName: "ICSpolecnosti",
    duplicateAction: 0,
    ignoreCase: true,
    initMsg: "IČ musí být unikátní.",
    initMsgCSSClass: "ms-vb",
    errMsg: "Společnost se zadaným IČ již existuje!",
    errMsgCSSClass: "ms-formvalidation",
    showDupes: false,
    completefunc: null
});

Výsledek:

image

Script lze samozřejmě jednoduše upravit tak, aby mimo zobrazení upozornění, byl uživatel při uložení záznamu také vyzván dialogem k potvrzení, že je si vědom duplicity a zda opravdu chce nový záznam s tímto IČ opravdu založit.

Psaní příspěvků na blog pomocí Microsoft Word 2013

Teprve dnes jsem náhodně objevil zajímavou funkci MS Word 2013 o které jsem neměl vůbec tušení, totiž psaní článků a jejich publikace přímo na blog, vše rovnou z Wordu. Do teď jsem používal Windows Live Writer, víceméně ze setrvačnosti, ani mě nenapadlo hledat nic jiného, pro moje potřeby je dostačující, ale…. za zkoušku to stojí.

Microsoft Word 2013 umí pracovat s několika typy blogů nativně:

  • Blogger
  • Blog na SharePointu
  • Telligent Community
  • TypePad
  • WordPress

Ano, můj BlogEngine.NET v seznamu podporovaných blogů není, o to více mě překvapilo, že MS přidal volbu Další, kde je možné zvolit přímo API pomocí kterého komunikuje s blogem a na výběr je i standard MetaWebLog, který BlogEngine podporuje.

   

Popořadě, po spuštění Wordu je k dispozici šablona Příspěvek na blog:

   

Po vytvoření nového dokumentu se v ribbonu objeví nová záložka Příspěvek na blog:

   

Přidal jsem účet pomocí Spravovat účty a Nový

Po pokračování s volbou typu blogu Další jsem se dostal na stránku výběru API, kde API zůstává pro BlogEngine.NET natavené na MetaWebLog, adresa URL webu musí být vašeho webu + suffix služby, tedy metaweblog.axd, konkrétně:

Po potvrzení je účet zobrazen v seznamu a můžete jednoduše začít publikovat svoje články!

A zde je výsledek, první článek z Wordu!

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)

Enumerace všech kolekcí webů a vypsání stavu zámku (site collection lock)

Vstupní parametry:

  • nejsou

 

Příklad:

.\CheckSiteCollectionsLock.ps1

 

<#
   .Synopsis
	Enumerate all site collections and write out lock status
   .Example
   .\CheckSiteCollectionsLock.ps1
   .Notes
	NAME: .\CheckSiteCollectionsLock.ps1
	AUTHOR: novotny@devit.cz
   .Link
	http://www.devit.cz
#>

Add-pssnapin Microsoft.SharePoint.Powershell -ErrorAction silentlycontinue

$webApps = Get-SPWebApplication | foreach {
	write-host "Web App: " $_.Url
	
	$sites = $_.Sites | foreach {
		write-host "   $($_.RootWeb.Url) ($($_.RootWeb.Title)): " -foregroundcolor Green -NoNewline
		
		if ($_.ReadOnly -eq $false -and $_.ReadLocked -eq $false -and $_.WriteLocked -eq $false) { 
			write-host "Unlocked" -foregroundcolor Green
		}
		else {
			if ($_.ReadOnly -eq $false -and $_.ReadLocked -eq $false -and $_.WriteLocked -eq $true) { 
				write-host "Adding Content Prevented" -foregroundcolor Red
			}
		    elseif ($_.ReadOnly -eq $true -and $_.ReadLocked -eq $false -and $_.WriteLocked -eq $true) { 
				write-host "Read-only" -foregroundcolor Red
			}
		    elseif ($_.ReadOnly -eq $null -and $_.ReadLocked -eq $null -and $_.WriteLocked -eq $null) { 
				write-host "No Access" -foregroundcolor Red
			}
			
			if ($_.lockissue -ne $null) {
		          write-host "      Message: $($_.LockIssue)" -BackgroundColor Red
			}
		}
	 }
 }

 

CheckSiteCollectionsLock.ps1 (1,27 kb)

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()