Записи с меткой «Powershell»

do-not-repeat-it-in-production_demotivator

Одна из документированных, но малоизвестных фозможностей SharePoint — восстановление случайно удалённой сайт-коллекции.

Если с сайтами-вебами всё относительно понятно и у нас есть два «форпоста» в виде корзины сайт-коллекции (http://server/_layouts/15/AdminRecycleBin.aspx?View=2 ),

и корзины Central Administration, то в случае удаления корневой коллекции которая их все и содержит — в корзине CA не будет ничего. А удаляется она так же просто, и из веб-интерфейса вообще никак не восстанавливается 🙂

connection_close

Теоретически создателям было бы неплохо добавить какую-нибудь ‘проверку-защиту от дурака’, как например сделано на GitHub-е:

Github_Are_You_sure.png

Но скорее всего её уже не впихнуть в существующую архитектуру да и вообще — это не наши методы 🙂

Как обычно — сначала создав нам проблему, SharePoint потом предлагает её решение: удалённая сайт-коллекция остаётся сидеть в объекте доступном по Get-SPDeletedSite:

Get-SPDeletedSite

Зная его SiteId, можно восстановить коллекцию сайтов обратно через Restore-SPDeletedSite:

Add-PSSnapin Microsoft.SharePoint.PowerShell -ErrorAction SilentlyContinue
Get-SPDeletedSite
Restore-SPDeletedSite -Identity 8be8d8d4-a8c5-4eda-91cd-0c27b79a050d

p.s.: И да — при желании SharePoint спешит на помощь к особо упорным желающим убить ферму, и предоставляет коммандлет Remove-SPSite, который «cannot be undone» уже и в Powershell 🙂

 

 

 

 

Реклама

iLoveSharepoint Power Webpart для Sharepoint 2010 позволяет вставлять скрипты на Powershell прямо в страницы портала.

Так как за powershell-ом лежит практически весь .NET(и не только), то это позволяет создавать интересные решения, без открытия студии и развёртывания wsp.

Для иллюстрации создадим какую-нибудь функцию на Powershell, к примеру будем приветствовать юзера в зависимости от времени суток. Имя текущего пользователя выведем в дружественном формате.

# подключим SharePoint безопасным образом
$sharePointSnapin = Get-PSSnapin | Where-Object { $_.Name -eq  "Microsoft.SharePoint.PowerShell"}
if($sharePointSnapin -eq $null)
{
    Add-PSSnapin Microsoft.SharePoint.PowerShell    
}


# поздороваемся с пользователем, в зависимости от времени суток
Function GetGreeting()
{
    # текущее время
    $actualtime = (Get-Date).TimeOfDay;

    # выберем интервал
    $evening = New-TimeSpan -Hours 17 -Minutes 30 -Seconds 0
    $morning = New-TimeSpan -Hours 8 -Minutes 0 -Seconds 0
    $dinner = New-TimeSpan -Hours 11 -Minutes 0 -Seconds 0
    $night = New-TimeSpan -Hours 22 -Minutes 0 -Seconds 0
    
    if ($actualtime -ge $morning -and $actualtime -le $dinner)
    {
        return "Доброе утро";
    }
    if ($actualtime -ge $dinner -and $actualtime -le $evening)
    {
        return "Добрый день";
    }
    if ($actualtime -ge $evening -and $actualtime -le  $night)
    {
        return "Добрый вечер";
    }
    if ($actualtime -ge  $night -or $actualtime -le  $morning)
    {   
	    # дикий случай, но допустим
        return "Доброй ночи :)";
    }
}


# для получения Display Name можно каждый раз делать запрос к домен-контроллеру, 
# но так как формат имени в домене имеет стандартный вид "Домен\Имя.Фамилия",
# то выведем friendly-имя прямо тут же в вебчасти
Function GetDisplayName($name)
{
    if($name -match "\\")
    {
        $name = $name.remove(0, $name.LastIndexOf('\')+1);
    }
    if($name -match ".")
    {
        $name = $name.replace("."," ");
    }
           
    return $name
}

# соберём всё вместе
$hello = (GetGreeting)+ ", " + (GetDisplayName -name ([Environment]::UserName))


# вывод html
function Render($writer)
{
    $writer.Write("<h1>$hello</h1>")
}

Результат работы такого кода:

image

Таким образом мы получаем динамическое поведение в Sharepoint, но без создания «полновесного» решения с кодом