Лучший отвечающий
Адресная книга из AD в Sharepoint 2013

Вопрос
-
Добрый день, коллеги. Хотелось бы узнать можно ли в 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, диаграмма организации, заполним список контактов.
- Предложено в качестве ответа Kaplin VladimirModerator 19 марта 2015 г. 10:18
- Помечено в качестве ответа Иван ПродановMicrosoft contingent staff, Moderator 25 марта 2015 г. 12:12
19 марта 2015 г. 9:53 -
PS C:\Users\shp_admin> $list=$web.list["Phonebook"]
Вы пытаетесь обратиться к неизвестному свойству.
попробуйте
$list=$web.Lists["Phonebook"]
мой блог Немного о SharePoint
- Помечено в качестве ответа Иван ПродановMicrosoft contingent staff, Moderator 19 июля 2016 г. 6:47
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["Адресная книга"]
19 июля 2016 г. 10:54
Все ответы
-
добрый день
на сколько я знаю, что штатно никак.
Только с Outlook- Изменено Kaplin VladimirModerator 19 марта 2015 г. 8:35
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_farm19 марта 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, диаграмма организации, заполним список контактов.
- Предложено в качестве ответа Kaplin VladimirModerator 19 марта 2015 г. 10:18
- Помечено в качестве ответа Иван ПродановMicrosoft contingent staff, Moderator 25 марта 2015 г. 12:12
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 - получится идеальный скрипт по заполнению списка контактов.
Второй скрипт - быстро, просто. Но он не обновляет сведения, т.е. перед вторым запуском следует список полностью очищать, иначе скрипт продублирует записи.
- Изменено Maxim Shusharin 19 марта 2015 г. 10:45
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
- Помечено в качестве ответа Иван ПродановMicrosoft contingent staff, Moderator 19 июля 2016 г. 6:47
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["Адресная книга"]
19 июля 2016 г. 10:54