Биты и байты.

Биты и байты.

четверг, 8 сентября 2016 г.

Полезные скрипты для Sharepoint на Powershell

Для тех кто хочет почувствовать настоящим админом, в  SharePoint есть интеграция с Powershell.  
Всегда полезно иметь под рукой набор скриптов, которые решил собрать в одном месте..

Для изучения команд SharePoint  на первом этапе будем пользоваться  средой  PowerShell ISE,  нереально полезная оболочка для начинающих!!
Эта среда позволяет в наглядном виде получать описания команд ,а также при необходимости сохранять целые сценарии.
Запускаем  PowerShell ISE и добавляем  командлет SharePoint в консоли.

Add-PSSnapin Microsoft.Sharepoint.Powershell

Можно также встретить в скриптах более продвинутый вариант

If ((Get-PSSnapIn -Name Microsoft.SharePoint.PowerShell -ErrorAction SilentlyContinue) -eq $null
{ Add-PSSnapIn -Name Microsoft.SharePoint.PowerShell




Веб приложения и список сайтов

$webApp = Get-SPWebapplication 'http://london'

foreach($spSite in $webApp.Sites)
{
if ($spSite.HostHeaderIsSiteName)
{ Write-Host $spSite.Url 'is host-named' }
else
{ Write-Host $spSite.Url 'is path based' }
}


Результат


Коллекции сайтов могут быть 2х типов, сайт на основе пути (http://london/sites/demosite  по пути веб приложения создаются под сайты), и сайт на основе имени узла ( http://portal.contoso.com любое красивое имя для сайта )
Подробно на сайте Майкрософт
Сайты на основе имени узла создаются  только через Powershell, пример создания


New-SPSite 'http://portal.contoso.com' -HostHeaderWebApplication (Get-SPWebApplication 'http://london') -Name 'Portal' -Description 'Portal site' -OwnerAlias 'contoso\administrator' -language 1033 -Template 'STS#0'

New-SPSite 'http://bi.contoso.com' -HostHeaderWebApplication (Get-SPWebApplication 'http://london') -Name 'BI' -Description 'BI site' -OwnerAlias 'contoso\administrator' -language 1033 -Template 'BICenterSite#0'

Доступные шаблоны можно посмотреть командой

Get-SPWebTemplate

Небольшое видео  по настройке сайтов на основе имени


Список установленных компонентов

Get-SPFeature -Limit ALL | Where-Object {$_.Scope -eq "SITE"}

#Поиск по названию
Get-SPFeature -Limit ALL | Where-Object {$_.DisplayName -like "*Access*"}

Список доступных шаблонов сайтов

Get-SPWebTemplate | where {$_.Title -match "business"}

Список запущенных служб

Get-Service | Where-Object {$_.DisplayName -like "Sharep*"}

Теущая версия фермы с

(get-spfarm).buildversion


Конвертация сайтов на основе пути в сайты на основе имени

Backup-SPSite http://server_name/sites/site_name -Path C:\Backup\site_name.bak
Remove-SPSite –Identity http://server_name/sites/site_name –Confirm:$False 
Restore-SPSite http://www.example.com -Path C:\Backup\site_name.bak -HostHeaderWebApplication http://server_name


Создать новый сайт

New-SPWeb -Url http://portal.contoso.com/TestSite -AddToQuickLaunch -AddToTopNav -Name TestSite -Template STS#0 -UseParentTopNav


Создать список на сайте

$w= Get-SPWeb  -Identity http://portal.contoso.com/TestSite  
$w.Lists.Add("Project Tasks","" , "Tasks")


Экспорт сайтов, библиотек, списков

Export-SPWeb -identity "http://dev.contoso.com" –path "C:\Export_dev_contoso.cmp" -includeUserSecurity –Force

Export-SPWeb -identity "http://dev.contoso.com" -ItemUrl "/Contracts" -path "C:\Export_Contracts.cmp" -includeUserSecurity –Force

Импорт сайтов, библиотек, списков из cmp файла  (Content migration package)

Import-SPWeb -identity "http://dev.contoso.com" -path "c:\Export_contracts.cmp"

Сделать Бэкап фермы, сайта

Backup-SPFarm -BackupMethod Full -Directory E:\FarmBackup\2016_09_01 –Force

Backup-SPSite http://london/sites/demosite -Path C:\Backup\site_name.bak

Восстановить удаленный сайт
Get-SPDeletedSite | select Path , siteid
Restore-SpDeletedSite –Identity 4bff0c0e-4d56-4fec-8174-a60a16daeaac)


Включить расширенное логирование
Set-SPLogLevel -TraceSeverity VerboseEx -EventSeverity Verbose
Merge-SPLogFile -Path "C:\FarmMergedLog.log" -Overwrite -StartTime (Get-Date).AddMinutes(-15)

#детальное описание ошибки по correlation ID
Merge-SPlogfile –Path c:\log.log –Correlation ba05e237-0680-403a-b9f6-e49f96ac55d4


Отключаем расширенное логирование
Clear-SPLogLevel

Список баз контента 
Get-SPDatabase | ?{$_.type -like "*business*"}

Подготовить базу для обновления 
(Get-SPDatabase | ?{$_.type -like "*business*"}).Provision()

Проверить базу данных контента на ошибки

Test-SPContentDatabase -name WSS_Content –webapplication http://london

Обновление конфигурации  исправление ошибок обновления

1. Запускать в командной строке под администратором
2. Меняем путь на  C:\Program Files\Common Files\microsoft shared\Web Server Extensions\15\BIN
3. Для исправления ошибок  патчей  PSConfig.exe -cmd upgrade -inplace b2b -force -cmd applicationcontent -install -cmd installfeatures

Создать список и элемент списка

$w = Get-SPWeb "http://portal.contoso.com/Testsite"
$w.ListTemplates | Select name , type , type_client, Description
$l = $w.Lists.Add("Project A Tasks" , "" , "Tasks")
$l = $w.Lists.Add("Test Survey" , "" , "Survey")
$list = $w.Lists["Project A Tasks"]
$newItem = $list.AddItem()
$newItem["Title"] = "Task 4"
$newItem["Due Date"] = "6/20/2015 11:27 AM"
$newItem["% Complete"] = 500
$newItem.Update()

Подробно как изменять столбцы любого типа на сайте МС
#список столбцов
$l.Fields | select Title , Type , StaticName


Создать библиотеку и загрузить файл


$DocLibName = "Files 2016"
$lib = $w.Lists.Add($DocLibName,"", $w.ListTemplates["Document Library"])

$file = Get-ChildItem "C:\Shared\day2.docx"
$folder = $w.GetFolder($DocLibName )
$files = $folder.Files

$timestamp = Get-Date -UFormat "%Y%m%d_%H%M%S"
$fileName = [io.path]::GetFileNameWithoutExtension($file)
$ext = [io.path]::GetExtension($file)
#имя файла должно быть уникальным
$f =$files.Add($DocLibName+ "/" + $fileName+ "_"+$timestamp+$ext,$file.OpenRead(),$false)
#обновить значение поля
$f.Properties["TestColumn"] = "ABC"
$f.Update()

Update()
#Обновялет элемент в базе данных
#Обновляет поля "Modified" и "Modified by" .
#Создает новую версию

Systemupdate()
#Обновялет элемент в базе данных
#НЕ обновляет поля "Modified" и "Modified by" .
#НЕ создает новую версию
#Запускает системные обработчики

UpdateOverwriteVersion()
#Обновляет элемент но не созлает новую версию.
#Обновялет поля  "Modified" и "Modified by" .

Загрузить файл с удаленной машины

Добавить столбец в список и  представление  

$w = Get-SPWeb "http://portal.contoso.com/Testsite"
$DocLibName = "Files 2016"
$lib = $w.Lists[$DocLibName]
$spFieldType = [Microsoft.SharePoint.SPFieldType]::Text
$lib.Fields.Add("TestColumn",$spFieldType,$false)
$lib.Update()

$v = $lib.Views["All Documents"]
$spField = $lib.Fields["TestColumn2"]
$v.ViewFields.Add($spField)
$v.Update()


Создать группу на сайте  

$groupName = "Files 2016 Visitors"
#создаем группу на сайте
$group  = $w.SiteGroups.Add($groupName, $w.EnsureUser("contoso\administrator") , $w.EnsureUser("contoso\administrator") , "Read Only Group")

Выдать уникальные права на  сайт,  библиотеку или список  
#прекратить наследование прав
$w.BreakRoleInheritance($true)
$lib.BreakRoleInheritance($true)
$list.BreakRoleInheritance($true)

#создаем назначение ролей, связываем группу и роль
$roleAssignment = new-object Microsoft.SharePoint.SPRoleAssignment($group
# $w.RoleDefinitions | select name, description,basepermissions
$roleDefinition = $w.RoleDefinitions["Read"]
#добавляем роль к назначению
$roleAssignment.RoleDefinitionBindings.Add($roleDefinition)
#Выдаем права например на сайт или на библиотеку
$w.RoleAssignments.Add($roleAssignment)
$lib.RoleAssignments.Add($roleAssignment)
$list.RoleAssignments.Add($roleAssignment)

$lib.Update()
$list.Update()

Пример готовой функции

Добавить пользователя в группу   

$user=$w.EnsureUser("contoso\chen")
#Get group object
$group=$w.SiteGroups[$groupName]
#add user to group
$group.AddUser($user)

#Получить список пользователей из AD
Import-Module activedirectory
Get-ADUser -Filter {Enabled -eq "True"} | Select-Object SamAccountName,Name,Surname,GivenName | Format-Table

Обновить поле списка
$w = Get-SPWeb "https://sp"
$l = $w.Lists["План по оцифровке"]
foreach($item in $l.Items) { 
$item["Дата выполнения"] = $item["Дата выдачи"]  
$item.Update()}

Получить элементы списка

$w = Get-SPWeb "http://portal.contoso.com/Testsite"
$l = $w.Lists["Project A Tasks"]
foreach($item in $l.Items) {"Title: {0}  Due date: {1} , Created: {2} "  -f $item["Title"] , $item["Due Date"] ,  $item["Created By"] }


$L.Items  | select  Title, @{Label=”DueDate”;Expression={$_[“DueDate”]}} , @{Label=”PercentComplete”;Expression={$_[“PercentComplete”]}} |  Export-Csv -path $path

#Экспортировать  элементы списка в CSV
$path ="C:\Shared\Tasks_export.csv"
$list = $w.Lists["Project A Tasks"]
$list.Items | select Title , "Due Date" |  Export-Csv -path $path

Получить элементы списка используя CAML запрос

If ((Get-PSSnapIn -Name Microsoft.SharePoint.PowerShell -ErrorAction SilentlyContinue) -eq $null
{ Add-PSSnapIn -Name Microsoft.SharePoint.PowerShell }

$w = Get-SPWeb "http://portal.contoso.com/Testsite"
$l = $w.Lists["Project A Tasks"]
$query = New-Object Microsoft.SharePoint.SPQuery
$query.Query  = "<Where><Gt><FieldRef Name=""PercentComplete""></FieldRef><Value Type=""number"">0.05</Value></Gt></Where>"
$query.ViewFields = "<FieldRef Name=""Title"" /><FieldRef Name=""PercentComplete"" /><FieldRef Name=""Modified"" /><FieldRef Name=""DueDate"" /><FieldRef Name=""Editor"" /><FieldRef Name=""Priority"" />"
$query.ViewAttributes = "Scope=""Recursive"""
$query.RowLimit = 0
$ListItems = $l.GetItems( $query)
foreach($item in $ListItems) {"Title: {0}  Due date: {1} , Priority: {2}  ,PercentComplete:{3} ,   Editor: {4}"  -f $item["Title"] , $item["Due Date"] ,  $item["Priority"] ,   $item["PercentComplete"] ,  $item["Editor"]   }



Для подготовки CAML запроса можно использовать утилиту SP CAML Query Helper 2013

Загрузить список из  csv файла

$w = Get-SPWeb "http://portal.contoso.com/Testsite"
$list  = $w.Lists["Project A Tasks"]
$tblData = Import-CSV "C:\Shared\Tasks.csv"
foreach ($row in $tblData)
{
   "Adding entry for "+$row."Title".ToString()
   $newItem = $list.AddItem()
   $newItem["Title"] = $row."Title".ToString()
   $newItem["Due Date"] = $row."Due Date".ToString()
   $newItem["% Complete"] = $row."PercentComplete".ToString()
   $newItem.Update()
}


#Получить таблицу из базы
$SqlConnection = New-Object System.Data.SqlClient.SqlConnection
$SqlConnection.ConnectionString = "Server=$server;Database=$database;Integrated Security=True"
$SqlCmd = New-Object System.Data.SqlClient.SqlCommand
$SqlCmd.CommandText = " sp_helpdb"
$SqlCmd.Connection = $SqlConnection
$SqlCmd.CommandTimeout = 0
$SqlAdapter = New-Object System.Data.SqlClient.SqlDataAdapter
$SqlAdapter.SelectCommand = $SqlCmd
$DataSet = New-Object System.Data.DataSet
$SqlAdapter.Fill($DataSet)
$SqlConnection.Close()
$tblData = $DataSet.Tables[0]

Как сохранить элемент в таблицу

Удалить элементы списка


$w = Get-SPWeb "http://portal.contoso.com/Testsite"
$l = $w.Lists["Project A Tasks"]
$query = New-Object Microsoft.SharePoint.SPQuery
$query.Query  = "<Where><IsNull><FieldRef Name=""Title""></FieldRef></IsNull></Where>"
$query.ViewFields = "<FieldRef Name=""ID"" /><FieldRef Name=""GUID"" /><FieldRef Name=""Title"" /><FieldRef Name=""PercentComplete"" /><FieldRef Name=""Modified"" /><FieldRef Name=""DueDate"" /><FieldRef Name=""Editor"" /><FieldRef Name=""Priority"" />"
$query.ViewAttributes = "Scope=""Recursive"""
$query.RowLimit = 0
$ListItems = $l.GetItems( $query)

for ($x=$ListItems.Count-1;$x -ge 0; $x--)
{
  Write-Host("DELETED: " + $listItems[$x].Item("ID"))
  $listItems[$x].Delete()
}

Реактивировать RBS 
$cdb = Get-SPContentDatabase –WebApplication http://sharepoint/\
$rbss = $cdb[0].RemoteBlobStorageSettings
$rbss.Enable()



Управление оповещениями 
Подробно тут
Настройка собственных шаблонов оповещений

$SPweb = Get-SPWeb "https://sharepoint.com"

foreach($alert in $SPweb.Alerts) {if ($alert.Title -eq 'Документы оповещения') {write-host $alert.Title}}

$SPweb.Alerts | Export-Csv C:\temp2\alerts.csv -encoding utf8

    $SPlist = $SPweb.lists["Документы"]
    $IDS = ""
    foreach($alert in $spweb.alerts)
    {
        if($alert.ListID -eq $SPlist.ID -and $alert.Title -eq 'Документы')
        {
        $IDS += $alert.ID.tostring() + "|"
        }
        write-host -nonewline "*"
    }
    write-host "deleting..."
    foreach($s in $IDS.Split("|"))
    {
    write-host -nonewline "*"
    write-host [GUID]$s
   # $spweb.alerts.delete([GUID]$s)
    }

Найти списки с анонимным доступом 
$site = Get-SPSite "https://sp"
foreach ($web in $site.AllWebs) {foreach($list in $web.lists) {if ($web.AnonymousState.tostring() -eq "Enabled" -and $list.AnonymousPermMask.tostring() -ne "OpenWeb" -and $list.AnonymousPermMask.tostring() -ne "EmptyMask" -and $list.Title -ne "TaxonomyHiddenList" ) {write-host $web.Url ,$list.Title , $list.AnonymousPermMask.tostring() ,$web.AnonymousState.tostring(),$web.AllowAnonymousAccess.tostring() ,$web.AnonymousPermMask64.tostring()  }}}


Проверить SSID пользователя  
$domain = "domain";
$user_name = "user1";
$application = "https://sharepoint.com";

$userID = $domain + "\" + $user_name;
$SPuser = Get-SPUser -Identity $userID -Web $application
$objUser = New-Object System.Security.Principal.NTAccount($domain, $user_name) 
$strSID = $objUser.Translate([System.Security.Principal.SecurityIdentifier]) 

Write-Host '----------------------------------'

$SPuser.sid
$strSID.Value


Создать группу на основе группы AD  

$SiteCollection = "http://site/sitecollection"
$ADGroupName = "domain\adgroup"
$SPGroupName = "My Test Group A1"
$SPGroupDescription = "Test Group A1’s Description"
$SPGroupPermission = "Read"

#Start of script
$site = Get-SPWeb $SiteCollection

#Check if the group already exists
if ($site.SiteGroups[$SPGroupName] -eq $null)
{

#Ensure Group/User is part of site collection users beforehand and add them if needed
$site.EnsureUser($ADGroupName)

# Get the AD Group/User in a format that PowerShell can use otherwise there will be a string error
$ADGroupSPFriendly = $site | Get-SPUser $ADGroupName

#Create the SharePoint Group – Group Name, Group Owner, Group Member, Group Description. Can’t add AD group yet…
$NewSPGroup = $site.SiteGroups.Add($SPGroupName, $site.CurrentUser, $site.CurrentUser, $SPGroupDescription)
$site.AssociatedGroups.Add($site.SiteGroups[$SPGroupName]);
$NewSPAccount = $site.SiteGroups[$SPGroupName]

#Assign the Group permission
$GroupAssignment = New-Object Microsoft.SharePoint.SPRoleAssignment($NewSPAccount)
$GroupRole = $site.RoleDefinitions[$SPGroupPermission]
$GroupAssignment.RoleDefinitionBindings.Add($GroupRole)
$site.RoleAssignments.Add($GroupAssignment)

#Add the AD Group/User to the group, can’t be done during group creation when using Powershell otherwise errors so is done now.
Set-SPUser -Identity $ADGroupSPFriendly -Web $SiteCollection -Group $SPGroupName
}
$site.Dispose()
}

About