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