Sharepoint и FBA: создание пользователей из PowerShell. Часть 2

Этап второй. Включение пользователя в Sharepoint.

На этом “грабли” FBA не заканчиваются, а только начинаются. Для того. чтобы включить пользователя в Sharepoint, необходимо выполнить два действия:

  1. Вызвать метод класса SPWeb EnsureUser(string login)
  2. Добавить пользователя в какую-нибудь группу.

Проблемы у вас начнутся, как только вы попытаетесь подключиться к сайту Sharepoint с включенным FBA — API не обладает средствами авторизации для работы с Sharepoint с помощью FBA. И если вы просто подключитесь к сайту и вызовите метод EnsureUser, вы получите ошибку “Exception calling "EnsureUser" with "1" argument(s): "Attempted to perform an unauthorized operation."”. И вот тут начинается магия .NET и API Sharepoint. Решение с HttpContext я честно подсмотрел в инете. Подключение к сайту Sharepoint с включенным FBA будет работать вот так и только так:

   1: [System.Reflection.Assembly]::LoadWithPartialName("Microsoft.Sharepoint") | Out-Null
   2:  
   3: [Microsoft.Sharepoint.SPSecurity]::RunWithElevatedPrivileges({ 
   4:  
   5: [Microsoft.Sharepoint.SPSite]$site = new-object Microsoft.Sharepoint.SPSite("http://fbasite")
   6: [Microsoft.Sharepoint.SPWeb]$web = $site.RootWeb
   7: if($web)
   8: {
   9:     $web.AllowUnsafeUpdates = $True
  10:     if (![System.Web.HttpContext]::Current)
  11:     {
  12:         $request = new-object System.Web.HttpRequest("", $web.Url, "");
  13:         $writer = new-object System.IO.StringWriter
  14:         $response = new-object System.Web.HttpResponse($writer)
  15:         [System.Web.HttpContext]::Current = new-object System.Web.HttpContext($request, $response);
  16:         [System.Web.HttpContext]::Current.Items["HttpHandlerSPWeb"] = $web;
  17:     }
  18:  
  19:     [string]$fullName = "Иванов иван Иванович"
  20:     [string]$username = "CustomSQLMembershipProvider:TestLogin"
  21:         
  22:     [Microsoft.Sharepoint.SPUser]$curUser = $web.EnsureUser($username);
  23:  
  24:     if ($curUser)
  25:     {
  26:        $curUser.Name = $fullName;
  27:        $curUser.Update();
  28:        $web.SiteGroups["Посетители"].AddUser($curUser);
  29:     }
  30:     
  31:     $web.AllowUnsafeUpdates = $False
  32:     
  33:     $web.Dispose()
  34:     $site.Dispose()
  35: }
  36: })

Обратите внимание на строки 10-17 – тут  мы создаем текущий контекст для работы с FBA, иначе вызов метода UnsureUser вызовет ошибку. Кроме этого, весь код работы с API Sharepoint выполнен внутри метода  RunWithElevatedPrivileges – это необходимо даже в том случае, если вы работаете из под учетной записи администратора фермы Sharepoint. Кроме того, обратите внимание в каком виде необходимо передавать логин методу UnsureUser – с обязательным указанием имени провайдера.

Замечание: Еще одним способом является создание альтернативного узла IIS, который затем будет включен в SharePoint и настроен на тот же сайт, что и узел с FBA. В этом случае вы можете подключаться к этому альтернативному узлу по средствам Windows-аутентификации, но такая настройка мягко скажем не тривиальна.

В итоге у меня получился вот такой скриптик, который выполняет все необходимые действия по добавлению пользователей в Sharepoint с включенным FBA:

[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.Sharepoint") | Out-Null
[System.Reflection.Assembly]::LoadWithPartialName("System.Web") | Out-Null
#====================================================================================
function Get-MembershipProvider([string]$ProviderName)
{
if($ProviderName)
{
#Находим провайдер по имени
return [System.Web.Security.Membership]::Providers[$ProviderName]
}
else
{
#Если имя не было указано, возвращаем провайдер по умолчанию
return [System.Web.Security.Membership]::Provider
}
}
#====================================================================================
function Create-ProviderUser($login, $password, $mail)
{
#проверяем, "подан ли на вход" провайдер
$provider = $input | select -First 1
if($provider -isnot [System.Web.Security.MembershipProvider])
{
$provider = Get-MembershipProvider
}

$status = 0
$question = "q"
$answer = "a"
$approved = $True
$retStatus = 0
$newUser = $provider.CreateUser($login, $password, $mail, $question, $answer, $approved, $null, [ref]$retStatus)
write-host "Статус создания пользвоателя а MembershipProvider: $retStatus"

return [System.Web.Security.MembershipUser]$newUser
}
#====================================================================================
function Create-SharepointUser([string]$SiteUrl,[System.Web.Security.MembershipUser]$User, [string]$FullName, [string]$GroupName)
{
[Microsoft.Sharepoint.SPSecurity]::RunWithElevatedPrivileges({
[Microsoft.Sharepoint.SPSite]$site = new-object Microsoft.Sharepoint.SPSite($SiteUrl)
[Microsoft.Sharepoint.SPWeb]$web = $site.RootWeb
if($web)
{
$web.AllowUnsafeUpdates = $True
if (![System.Web.HttpContext]::Current)
{
$request = new-object System.Web.HttpRequest("", $web.Url, "");
$writer = new-object System.IO.StringWriter
$response = new-object System.Web.HttpResponse($writer)
[System.Web.HttpContext]::Current = new-object System.Web.HttpContext($request, $response);
[System.Web.HttpContext]::Current.Items["HttpHandlerSPWeb"] = $web;
}

[Microsoft.Sharepoint.SPUser]$curUser = $web.EnsureUser($User.UserName);
if ($curUser -is [Microsoft.Sharepoint.SPUser])
{
$curUser.Name = $FullName
#После вызова метода Update может выскочить ошибка "Unable to cast object of type 'System.Management.Automation.PSObject' to type 'Microsoft.SharePoint.SPWeb'."
#При этом всё работает. Причину и решение я не нашел.
try{ $curUser.Update();}catch{}
[Microsoft.Sharepoint.SPGroup]$group = $web.SiteGroups[$GroupName]
$group.AddUser($curUser)
}

$web.AllowUnsafeUpdates = $False

$web.Dispose()
$site.Dispose()
}
})
}
#====================================================================================

#собственно код создания
$provider = Get-MembershipProvider "AtlantisSQLMembershipProvider"
$login = "TestLogin2"
$password = "!@#_s123QWE"
$email = "my@mail.local"
$user = $provider | Create-ProviderUser $login $password $email

if($user)
{
Create-SharepointUser http://fbasite $user "Иванов Иван Иванович" "Посетители"
}

Реклама

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s

%d такие блоггеры, как: