none
Адресная книга из AD в Sharepoint 2013 RRS feed

  • Вопрос

  • Добрый день, коллеги. Хотелось бы узнать можно ли в SP 2013 на портале в список "Контакты" подгрузить данные из AD. В Настройках сервера есть функционал импорта из AD, но можно ли этот импорт подгрузить в список? Знаю что можно на PS скрипт написать и в портал грузить, но хотелось бы прямое решение. Если бы этот список показывал еще и карточки контактов, было бы круто. 
    19 марта 2015 г. 8:28

Ответы

  • Задачу решил немного другим способом, по скрипту чуть проще получилось:

    Выгружаем пользователей  в csv

    Get-ADUser -Filter {(ObjectClass -eq "user") -and (GivenName -like "*")} -SearchBase "OU=Company,DC=contoso,DC=com" -Properties Surname, GivenName, Name,  Mail, Department, Title, telephoneNumber, mobile | sort-object -property Name | Select Surname, GivenName, Name, Mail,  Department, Title, telephoneNumber, mobile | Export-Csv F:\Contacts.csv -Encoding Unicode -NoTypeInformation 
    add-pssnapin microsoft.sharepoint.powershell
    $web = Get-SPWeb "http://portal02"
    $list = $web.lists["Phonebook"]
    //очищаем список, и обновляем заново
    do {$list.items.delete(0)}
    until ($list.items.Count -eq 0)
    //импортируем данные в адресную книгу
    Import-Csv E:\Import\Contacts.csv | ForEach-Object {
    $item = $list.items.Add()
    $item["ФИО"] = $_.Name 
    $item["Department"] = $_.Company 
    $item["Telephone"] = $_.telephoneNumber 
    $item["Mobile"] = $_.mobile 
    $item["email"] = $_.Mail 
    $item["title"] = $_.Title
    $item.update() 
    }


    • Помечено в качестве ответа AndreySV 23 июня 2015 г. 4:56
    23 июня 2015 г. 4:56
  • Я бы сделал так:

    1. Настроил синхронизацию профилей пользователей

    2. Провел синхронизацию

    3. Вот вам скрипт в помощь:

    cls
    if((Get-PSSnapin | Where {$_.Name -eq "Microsoft.SharePoint.PowerShell"}) -eq $null) {
    	Add-PSSnapin Microsoft.SharePoint.PowerShell;
    }
    function Enumerate-SPUserProfiles($webUrl, $listName)
    {
    	$x= [System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SharePoint")
    	$x= [System.Reflection.Assembly]::LoadWithPartialName("microsoft.sharepoint.portal")
    	$x= [System.Reflection.Assembly]::LoadWithPartialName("Microsoft.Office.Server")
    	$x= [System.Reflection.Assembly]::LoadWithPartialName("System.Web")
    	$sites = Get-SPSite
    	$context = [Microsoft.Office.Server.ServerContext]::GetContext($sites[0])
    	$profileManager = new-object Microsoft.Office.Server.UserProfiles.UserProfileManager($context)
    
    	$web = Get-SPWeb $webUrl
    	$list = $web.Lists[$listName]
    
    	# gets all the user profiles, those that have domain\username as DisplayName are excluded
    	$profileManager.GetEnumerator() | ?{$_.DisplayName -notlike '*\*' -and $_.ProfileType -eq "User" } | foreach-object { Update-PhoneBook $_ $web $list $webUrl } |
    }
    
    function Update-PhoneBook($user, $web, $list, $webUrl)
    {
    	if($user.Item("FirstName") -ne "" -and $user.Item("FirstName") -ne $null)
    	{
    		$spQuery = new-object Microsoft.SharePoint.SPQuery
    		$userName = $user.Item("UserName")
    		$camlQuery = "<Where><Eq><FieldRef Name='UserName' /><Value Type='Text'>$userName</Value></Eq></Where>";
    		$spQuery.Query = $camlQuery
    		$spQuery.RowLimit = 1
    	 	$spListItemCollection = $list.GetItems($spQuery)
    		$domain = (gwmi WIN32_ComputerSystem).Domain
    
    		if($spListItemCollection.Count -ge 1)
    		{
    			Write-Host "Updating $username..."
    			Update-Contact $spListItemCollection[0] $user $domain $webUrl
    		}
    		else
    		{
    			Write-Host "Adding $username..."
    			$contact = $list.items.add();
    			Update-Contact $contact $user $domain $webUrl
    		}
    	}
    }
    
    function Update-Contact($contact, $user, $domain, $webUrl)
    {
    	$lastName = $user.Item("LastName");
    	$contact["Title"] = "$lastName";
    
    	$firstName = $user.Item("FirstName");
    	$contact["FirstName"] = "$firstName";
    
    	$workEmail = $user.Item("WorkEmail");
    	$contact["Email"] = "$workEmail";
    
    	$workPhone = $user.Item("WorkPhone");
    	$contact["WorkPhone"] = "$workPhone";
    
    	$CellPhone = $user.Item("CellPhone");
    	$contact["CellPhone"] = "$cellPhone";
    
    	$office = $user.Item("Office");
    	$contact["Office"] = "$office";
    
    	$department = $user.Item("Department");
    	$contact["Department"] = "$department";
    
    	$userName = $user.Item("UserName");
    	$contact["UserName"] = "$userName";
    
    	$contact.update()
    }

    И используем:

    Enumerate-SPUserProfiles "http://your_site_url" "List_Name"

    Тем самым получим рабочую службу профилей, заработает People Search, диаграмма организации, заполним список контактов.

    19 марта 2015 г. 9:53

  • PS C:\Users\shp_admin> $list=$web.list["Phonebook"]


    Вы пытаетесь обратиться к неизвестному свойству.

    попробуйте

    $list=$web.Lists["Phonebook"]


    мой блог Немного о SharePoint

    18 июля 2016 г. 13:25
    Модератор
  • А теперь дальше: создал тестовый список Test List 

    PS C:\Users\shp_admin> Add-PSSnapin microsoft.sharepoint.powershell
    PS C:\Users\shp_admin> $web=Get-SPWeb "https://***.com"
    PS C:\Users\shp_admin> $list=$web.Lists["Test List"]
    PS C:\Users\shp_admin> do {$list.items.delete(0)} until ($list.items.Count -eq 0)
    все гут
    PS C:\Users\shp_admin> Add-PSSnapin microsoft.sharepoint.powershell
    PS C:\Users\shp_admin> $web=Get-SPWeb "https://***.com"
    PS C:\Users\shp_admin> $list=$web.Lists["Contacts"]
    PS C:\Users\shp_admin> do {$list.items.delete(0)} until ($list.items.Count -eq 0)
    Невозможно вызвать метод для выражения со значением NULL.
    строка:1 знак:5
    + do {$list.items.delete(0)} until ($list.items.Count -eq 0)
    +     ~~~~~~~~~~~~~~~~~~~~~
        + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
        + FullyQualifiedErrorId : InvokeMethodOnNull

    Сам разобрался - Надо обращаться не по имени листа а как указана в контенте сайта:

    PS C:\Users\shp_admin> $list=$web.Lists["Адресная книга"]

    • Изменено Muncubus 19 июля 2016 г. 11:11
    • Помечено в качестве ответа AndreySV 8 августа 2016 г. 6:46
    19 июля 2016 г. 10:54

Все ответы

  • добрый день

    на сколько я знаю, что штатно никак.

    Только с Outlook
    19 марта 2015 г. 8:34
    Модератор
  • с Outlook имеется ввиду адресную книгу Exchange?
    19 марта 2015 г. 8:37
  • Добрый день, через powershell.

    19 марта 2015 г. 8:37
  • С помощью Get-ADUser, Export в csv и последующий импорт в список через PS модуль Sharepoint?
    19 марта 2015 г. 8:43
  • С помощью Get-ADUser, Export в csv и последующий импорт в список через PS модуль Sharepoint?
    Напрямую делать экспорт в список SharePoint минуя csv.
    19 марта 2015 г. 8:46
  • А не подскажите как это сделать? Кстати у меня почему-то консоль SP для powershell не работает( Локальная ферма недоступна.
    19 марта 2015 г. 8:53
  • А не подскажите как это сделать? Кстати у меня почему-то консоль SP для powershell не работает( Локальная ферма недоступна.
    Запустите от администратора
    19 марта 2015 г. 9:05
    Модератор
  • Консоль SP доступна только на самом сервере SP.
    19 марта 2015 г. 9:05
  • Так я с сервера SP и пробовал ее запустить.
    19 марта 2015 г. 9:09
  • или от учетки sp_farm
    19 марта 2015 г. 9:27
    Модератор
  • Запускать из под учетной записи SP_FARM

    19 марта 2015 г. 9:28
  • Может вам просто настроить синхронизацию профилей + использовать People Search? И не надо будет постоянно вручную синхронизировать этот список. Список контактов реже используется.
    19 марта 2015 г. 9:30
  • Сегодня будем с руководством общаться. В старом портале пользователей добавляли в список вручную.

    Спасибо. Сейчас попробую от учетки запустить.

    19 марта 2015 г. 9:32
  • От пользователя spfarm запустилась. Спасибо. А вот теперь кто-нибудь может кто-нибудь подсказать механизм экспорта и командлету для моей задачи? 
    19 марта 2015 г. 9:37
  • Я бы сделал так:

    1. Настроил синхронизацию профилей пользователей

    2. Провел синхронизацию

    3. Вот вам скрипт в помощь:

    cls
    if((Get-PSSnapin | Where {$_.Name -eq "Microsoft.SharePoint.PowerShell"}) -eq $null) {
    	Add-PSSnapin Microsoft.SharePoint.PowerShell;
    }
    function Enumerate-SPUserProfiles($webUrl, $listName)
    {
    	$x= [System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SharePoint")
    	$x= [System.Reflection.Assembly]::LoadWithPartialName("microsoft.sharepoint.portal")
    	$x= [System.Reflection.Assembly]::LoadWithPartialName("Microsoft.Office.Server")
    	$x= [System.Reflection.Assembly]::LoadWithPartialName("System.Web")
    	$sites = Get-SPSite
    	$context = [Microsoft.Office.Server.ServerContext]::GetContext($sites[0])
    	$profileManager = new-object Microsoft.Office.Server.UserProfiles.UserProfileManager($context)
    
    	$web = Get-SPWeb $webUrl
    	$list = $web.Lists[$listName]
    
    	# gets all the user profiles, those that have domain\username as DisplayName are excluded
    	$profileManager.GetEnumerator() | ?{$_.DisplayName -notlike '*\*' -and $_.ProfileType -eq "User" } | foreach-object { Update-PhoneBook $_ $web $list $webUrl } |
    }
    
    function Update-PhoneBook($user, $web, $list, $webUrl)
    {
    	if($user.Item("FirstName") -ne "" -and $user.Item("FirstName") -ne $null)
    	{
    		$spQuery = new-object Microsoft.SharePoint.SPQuery
    		$userName = $user.Item("UserName")
    		$camlQuery = "<Where><Eq><FieldRef Name='UserName' /><Value Type='Text'>$userName</Value></Eq></Where>";
    		$spQuery.Query = $camlQuery
    		$spQuery.RowLimit = 1
    	 	$spListItemCollection = $list.GetItems($spQuery)
    		$domain = (gwmi WIN32_ComputerSystem).Domain
    
    		if($spListItemCollection.Count -ge 1)
    		{
    			Write-Host "Updating $username..."
    			Update-Contact $spListItemCollection[0] $user $domain $webUrl
    		}
    		else
    		{
    			Write-Host "Adding $username..."
    			$contact = $list.items.add();
    			Update-Contact $contact $user $domain $webUrl
    		}
    	}
    }
    
    function Update-Contact($contact, $user, $domain, $webUrl)
    {
    	$lastName = $user.Item("LastName");
    	$contact["Title"] = "$lastName";
    
    	$firstName = $user.Item("FirstName");
    	$contact["FirstName"] = "$firstName";
    
    	$workEmail = $user.Item("WorkEmail");
    	$contact["Email"] = "$workEmail";
    
    	$workPhone = $user.Item("WorkPhone");
    	$contact["WorkPhone"] = "$workPhone";
    
    	$CellPhone = $user.Item("CellPhone");
    	$contact["CellPhone"] = "$cellPhone";
    
    	$office = $user.Item("Office");
    	$contact["Office"] = "$office";
    
    	$department = $user.Item("Department");
    	$contact["Department"] = "$department";
    
    	$userName = $user.Item("UserName");
    	$contact["UserName"] = "$userName";
    
    	$contact.update()
    }

    И используем:

    Enumerate-SPUserProfiles "http://your_site_url" "List_Name"

    Тем самым получим рабочую службу профилей, заработает People Search, диаграмма организации, заполним список контактов.

    19 марта 2015 г. 9:53
  • Есть конечно еще SharePoint AD Information Sync , цена вопроса 1200$, но мною приведенным скриптом вы задачу решите сами, главное правильно настроить User Profile Sync Service.
    19 марта 2015 г. 10:00
  • Если не использовать службу профилей, то тогда решаем через промежуточную выгрузку в файл:

    1. Выгружаем профили:

    Запускаем консоль (обычную или Active Directory)
    
    Можно запустить PowerShell ISE
    
    Выполняем команду import-module ActiveDirectory
    
    Получаем всех пользователей и групп из подразделения RUS домена infoworker.loc
    
    Get-ADUser -Filter * -SearchBase "OU=RUS,DC=Infoworker,DC=loc"
    
    Получаем сведения о пользователе с датой создания
    
    Get-ADUser -Filter {Name -eq "ivanov"} -Properties whenCreated
    
    Выбираем пользователей созданных за последние полгода и выгружаем их в файл
    
    #HELP Get-ADUser -Examples
    
    [System.DateTime]$date = [System.DateTime]::Now.AddDays(-180)
    
    $encoding = "Unicode"
    
    #Unicode,UTF7,UTF8,ASCII,UTF32,BigEndianUnicode,Default,OEM
    
    $users = Get-ADUser -LDAPFilter '(&(objectCategory=person)(objectClass=user))' -properties whenCreated, title, department
    
    $users | ? {$_.whenCreated -gt $date} | Export-Csv 'c:\users.csv' -Encoding $encoding
    
    Import-Csv 'c:\users.csv' | Out-GridView

    2. Делаем импорт в список SP:

    Только имена InternalName,Title - исправьте на те, что вы экспортировали.

    $web = Get-SPWeb http://portal
    
    $users = Import-Csv -Delimiter "`t" -Path "c:\contacts.txt"
    
    $list = $web.Lists["Контакты"]
    
    #Выполните команду, которая позволит узнать имена полей в списке:
    #$list.Fields | select InternalName,Title | Out-GridView
    
    #Далее заполняем список
    $users | where {
    $item = $list.AddItem();
    $item["FirstName"]=$_.Firstname;
    $item["Title"]=$_.Lastname;
    $item["JobTitle"]=$_.Job;
    $item["Company"]=$_. Company;
    $item["WorkPhone"]=$_.Phone;
    $item.Update();
    }

    Пробуйте что вам больше нравится.

    19 марта 2015 г. 10:08
  • Надеюсь направление деятельности указал.
    19 марта 2015 г. 10:09
  • Да. Но вот только с этим скриптом никак не разберусь. Если там надо какие-то значения подставлять, не разберусь куда, а если просто выполнить то не работает(
    19 марта 2015 г. 10:11
  • Который со службой профилей работает.
    19 марта 2015 г. 10:12
  • Еще вам пригодится это: SharePoint Management PowerShell scripts

    Первый скрипт - меняем только в Enumerate-SPUserProfiles "http://your_site_url" "List_Name"

    your_site_url - URL адрес вашего сайта

    ListName - Название списка контактов.

    Попробуйте пока-что решить вторым скриптом.

    19 марта 2015 г. 10:18
  • Да. Но вот только с этим скриптом никак не разберусь. Если там надо какие-то значения подставлять, не разберусь куда, а если просто выполнить то не работает(

    А вот так можно и ферму положить в ином случае, т.к. надо отдавать себе полный отчет, что делает скрипт.

    Я вам привел варианты реализации, универсальных решений мало, каждый сам правит скрипты под свой конкретный случай. 

    19 марта 2015 г. 10:27
  • Да это тестовый портал) не страшно, за одно и разберусь)))Пока сделаю через csv. Будет пока самым простым вариантом. Хотя Ваш мне больше нравится, но я пока не разобрался как все это запускать))
    19 марта 2015 г. 10:33
  • Да это тестовый портал) не страшно, за одно и разберусь)))Пока сделаю через csv. Будет пока самым простым вариантом. Хотя Ваш мне больше нравится, но я пока не разобрался как все это запускать))

    Плюс в первом скрипте - он не только заполняет список контактов, но так же и обновляет контакты на сведения из AD, минус, как и у всех подобных скриптов - он не удаляет уволенных сотрудников из списка.

    Хотя если список дополнить полем Updated, перед началом импорта проставить всем записям Updated = false, произвести импорт, при этом у существующих пользователей AD проставить этот флаг в записи списка в true, а потом произвести удаление всех записей, у которых поле Updated = false - получится идеальный скрипт по заполнению списка контактов.

    Второй скрипт - быстро, просто. Но он не обновляет сведения, т.е. перед вторым запуском следует список полностью очищать, иначе скрипт продублирует записи.


    19 марта 2015 г. 10:39
  • первый скрипт интереснее конечно, но я так и не понял как его запустить.

    19 марта 2015 г. 11:10
  • первый скрипт интереснее конечно, но я так и не понял как его запустить.


    Дайте лог ваших действий, что именно не получается? Или где возникает ошибка?
    19 марта 2015 г. 12:41
  • Задачу решил немного другим способом, по скрипту чуть проще получилось:

    Выгружаем пользователей  в csv

    Get-ADUser -Filter {(ObjectClass -eq "user") -and (GivenName -like "*")} -SearchBase "OU=Company,DC=contoso,DC=com" -Properties Surname, GivenName, Name,  Mail, Department, Title, telephoneNumber, mobile | sort-object -property Name | Select Surname, GivenName, Name, Mail,  Department, Title, telephoneNumber, mobile | Export-Csv F:\Contacts.csv -Encoding Unicode -NoTypeInformation 
    add-pssnapin microsoft.sharepoint.powershell
    $web = Get-SPWeb "http://portal02"
    $list = $web.lists["Phonebook"]
    //очищаем список, и обновляем заново
    do {$list.items.delete(0)}
    until ($list.items.Count -eq 0)
    //импортируем данные в адресную книгу
    Import-Csv E:\Import\Contacts.csv | ForEach-Object {
    $item = $list.items.Add()
    $item["ФИО"] = $_.Name 
    $item["Department"] = $_.Company 
    $item["Telephone"] = $_.telephoneNumber 
    $item["Mobile"] = $_.mobile 
    $item["email"] = $_.Mail 
    $item["title"] = $_.Title
    $item.update() 
    }


    • Помечено в качестве ответа AndreySV 23 июня 2015 г. 4:56
    23 июня 2015 г. 4:56
  • Подскажите такой момент:

    PS C:\Users\shp_admin> Add-PSSnapin microsoft.sharepoint.powershell
    PS C:\Users\shp_admin> $web=Get-SPWeb "https://***.com"
    PS C:\Users\shp_admin> $list=$web.list["Phonebook"]
    Не удается индексировать в массив NULL.
    строка:1 знак:1
    + $list=$web.list["Phonebook"]
    + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
        + FullyQualifiedErrorId : NullArray

    Необходимо очистить текущую адресную книгу.

    18 июля 2016 г. 13:16

  • PS C:\Users\shp_admin> $list=$web.list["Phonebook"]


    Вы пытаетесь обратиться к неизвестному свойству.

    попробуйте

    $list=$web.Lists["Phonebook"]


    мой блог Немного о SharePoint

    18 июля 2016 г. 13:25
    Модератор
  • Вот спасибо. Одну букву незаметил)
    19 июля 2016 г. 6:44
  • А теперь дальше: создал тестовый список Test List 

    PS C:\Users\shp_admin> Add-PSSnapin microsoft.sharepoint.powershell
    PS C:\Users\shp_admin> $web=Get-SPWeb "https://***.com"
    PS C:\Users\shp_admin> $list=$web.Lists["Test List"]
    PS C:\Users\shp_admin> do {$list.items.delete(0)} until ($list.items.Count -eq 0)
    все гут
    PS C:\Users\shp_admin> Add-PSSnapin microsoft.sharepoint.powershell
    PS C:\Users\shp_admin> $web=Get-SPWeb "https://***.com"
    PS C:\Users\shp_admin> $list=$web.Lists["Contacts"]
    PS C:\Users\shp_admin> do {$list.items.delete(0)} until ($list.items.Count -eq 0)
    Невозможно вызвать метод для выражения со значением NULL.
    строка:1 знак:5
    + do {$list.items.delete(0)} until ($list.items.Count -eq 0)
    +     ~~~~~~~~~~~~~~~~~~~~~
        + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
        + FullyQualifiedErrorId : InvokeMethodOnNull

    Сам разобрался - Надо обращаться не по имени листа а как указана в контенте сайта:

    PS C:\Users\shp_admin> $list=$web.Lists["Адресная книга"]

    • Изменено Muncubus 19 июля 2016 г. 11:11
    • Помечено в качестве ответа AndreySV 8 августа 2016 г. 6:46
    19 июля 2016 г. 10:54