Отправка изображений профиля пользователя пример надстройки SharePoint
В примере Core.ProfilePictureUploader показано, как выполнить массовую отправку данных профиля пользователя из общей папки или URL-адреса SharePoint Online, а также связать свойства профиля пользователя с отправленными изображениями.
Используйте этот пример, чтобы узнать, как:
- Перенос изображений профиля пользователя из локальной среды SharePoint Server в SharePoint Online.
- Устранены проблемы, возникающие, когда средству синхронизации Azure Active Directory (dirsync) не удается синхронизировать изображения профиля пользователя с SharePoint Online.
- Замените изображения профилей пользователей низкого качества в SharePoint Online.
В этом примере консольное приложение используется для выполнения следующих действий:
- Чтение имен пользователей и путей к файлам изображений или URL-адресов из файла сопоставления пользователей.
- Получение и отправка одного или трех изображений в библиотеку рисунков на узле "Личный сайт".
- Задайте свойства профиля пользователя, чтобы связать отправленные изображения с профилем пользователя.
- Обновление дополнительных (необязательных) свойств профиля пользователя.
Подготовка к работе
Чтобы приступить к работе, скачайте пример надстройки Core.ProfilePictureUploader из проекта шаблоны и практики разработчика Office 365 на сайте GitHub.
Примечание.
Код, приведенный в этой статье, предоставляется "как есть" без какой-либо явной или подразумеваемой гарантии, включая подразумеваемые гарантии пригодности для какой-либо цели, для продажи или гарантии отсутствия нарушения прав иных правообладателей.
Перед выполнением этого примера кода
- Храните образы пользователей, которые планируется отправить в SharePoint Online, в общей папке или на веб-сервере.
- Измените файл userlist.csv, включив в него следующее:
- Строка заголовка, содержащая значение UserPrincipalName, SourceURL.
- Для каждого пользователя добавьте новую строку, содержащую учетную запись пользователя организации (или имя участника-пользователя) и путь к файлу или URL-адрес изображения для отправки.
Запуск этого примера из Visual Studio
Настройте проект Core.ProfilePictureUploader с помощью следующих аргументов командной строки: -SPOAdmin Username -SPOAdminPassword Password -Configuration filepath
где:
- Имя пользователя — это имя пользователя администратора Office 365.
- Пароль — это пароль администратора Office 365.
- Filepath — это путь к файлу configuration.xml.
Установка аргументов командной строки в проекте Core.ProfilePictureUploader
В Обозреватель решений откройте контекстное меню (щелкните правой кнопкой мыши) для свойства проекта >Core.ProfilePictureUploader.
Выберите Отладка.
В поле Аргументы командной строки введите аргументы командной строки, перечисленные ранее.
Настройка процесса отправки в соответствии с вашими требованиями
Измените файл configuration.xml, введя следующие значения:
Имя клиента Office 365 в элементе tenantName. Пример:
<tenantName>contoso.onmicrosoft.com</tenantName>
Путь к файлу сопоставления пользователя в элементе pictureSourceCsv . Пример:
<pictureSourceCsv>C:\temp\userlist.csv</pictureSourceCsv>
Инструкции по отправке изображения с помощью элемента thumbs . Измените следующие атрибуты в элементе thumbs :
aupload3Thumbs — задайте значение true , если вы хотите отправить три изображения для каждого пользователя, или значение false , если вы хотите отправить только одно изображение.
createSMLThumbs — задайте значение true , если вы хотите создать три изображения разного размера (малый, средний и большой) исходного образа, или задайте значение false , если вы хотите отправить три изображения одинакового размера.
Дополнительные свойства, задается в профиле пользователя с помощью элемента additionalProfileProperties . Например, следующий XML-код указывает дополнительное свойство профиля пользователя с именем SPS-PictureExchangeSyncState , которое должно быть равно нулю в профиле пользователя при выполнении примера кода.
<additionalProfileProperties> <property name="SPS-PictureExchangeSyncState" value="0"/> </additionalProfileProperties>
Путь к файлу журнала в элементе logfile , как показано в следующем примере.
<logFile path="C:\temp\log.txt" enableLogging="true" loggingLevel="verbose" />
Задержка отправки в миллисекундах между отправкой различных файлов изображений с помощью элемента uploadDelay . Рекомендуемый параметр для uploadDelay — 500 миллисекунд.
В файле App.config измените элемент значенияпараметра ProfilePictureUploader_UPSvc_UserProfileService , чтобы включить ссылку на службу профилей пользователей в Центре администрирования SharePoint Online, как показано в следующем примере.
<Contoso.Core.ProfilePictureUploader.Properties.Settings>
<setting name="ProfilePictureUploader_UPSvc_UserProfileService"
serializeAs="String">
<value>https://contoso-admin.sharepoint.com/_vti_bin/userprofileservice.asmx</value>
</setting>
</Contoso.Core.ProfilePictureUploader.Properties.Settings>
Важно!
Подключение к веб-службе userprofileservice.asmx в Центре администрирования SharePoint Online позволяет обновить свойства профиля пользователей других пользователей. При выполнении этого примера кода используйте учетную запись администратора Office 365, которая имеет разрешения на управление профилями пользователей.
Использование примера надстройки Core.ProfilePictureUploader
Этот пример кода выполняется как консольное приложение. При выполнении примера кода метод Main в Файле Program.cs выполняет следующие действия:
Инициализирует консольное приложение с помощью SetupArguments и InitializeConfiguration.
Вызывает InitializeWebService для подключения к службе профилей пользователей в SharePoint Online.
Выполняет итерацию по файлу userlist.csv, чтобы считывать имя участника-пользователя (UPN) для пользователя и расположение файла изображения пользователя.
Извлекает изображение пользователя с помощью объектов WebRequest и WebResponse в GetImagefromHTTPUrl.
Вызывает Метод UploadImageToSpo для отправки изображения пользователя в SharePoint Online.
Вызывает Метод SetMultipleProfileProperties , чтобы задать свойства профиля пользователя PictureURL и SPS-PicturePlaceholderState .
Вызывает Метод SetAdditionalProfileProperties , чтобы задать дополнительные свойства профиля пользователя после отправки файла изображения.
static void Main(string[] args)
{
int count = 0;
if (SetupArguments(args)) // Checks if args passed are valid
{
if (InitializeConfiguration()) // Check that the configuration file is valid
{
if (InitializeWebService()) // Initialize the web service end point for the SharePoint Online user profile service.
{
using (StreamReader readFile = new StreamReader(_appConfig.PictureSourceCsv))
{
string line;
string[] row;
string sPoUserProfileName;
string sourcePictureUrl;
while ((line = readFile.ReadLine()) != null)
{
if (count > 0)
{
row = line.Split(',');
sPoUserProfileName = row[0];
sourcePictureUrl = row[1];
LogMessage("Begin processing for user " + sPoUserProfileName, LogLevel.Warning);
// Get source picture from source image path.
using (MemoryStream picturefromExchange = GetImagefromHTTPUrl(sourcePictureUrl))
{
if (picturefromExchange != null) // If we got image, upload to SharePoint Online
{
// Create SharePoint naming convention for image file.
string newImageNamePrefix = sPoUserProfileName.Replace("@", "_").Replace(".", "_");
// Upload source image to SharePoint Online.
string spoImageUrl = UploadImageToSpo(newImageNamePrefix, picturefromExchange);
if (spoImageUrl.Length > 0)// If upload worked:
{
string[] profilePropertyNamesToSet = new string[] { "PictureURL", "SPS-PicturePlaceholderState" };
string[] profilePropertyValuesToSet = new string[] { spoImageUrl, "0" };
// Set these two required user profile properties - path to uploaded image, and pictureplaceholder state.
SetMultipleProfileProperties(_sPOProfilePrefix + sPoUserProfileName, profilePropertyNamesToSet, profilePropertyValuesToSet);
// Set additional user profile properties based on your requirements.
SetAdditionalProfileProperties(_sPOProfilePrefix + sPoUserProfileName);
}
}
}
LogMessage("End processing for user " + sPoUserProfileName, LogLevel.Warning);
int sleepTime = _appConfig.UploadDelay;
System.Threading.Thread.Sleep(sleepTime); // A pause between uploads is recommended.
}
count++;
}
}
}
}
}
LogMessage("Processing finished for " + count + " user profiles", LogLevel.Information);
}
InitializeWebService подключается к SharePoint Online и задает ссылку на службу профилей пользователей на переменную экземпляра. Другие методы в этом примере кода используют эту переменную экземпляра для применения обновлений к свойствам профиля пользователя. Для администрирования профиля пользователя в этом примере кода используется веб-служба userprofileservice.asmx в Центре администрирования SharePoint Online.
static bool InitializeWebService()
{
try
{
string webServiceExt = "_vti_bin/userprofileservice.asmx";
string adminWebServiceUrl = string.Empty;
// Append the web service (ASMX) URL onto the admin website URL.
if (_profileSiteUrl.EndsWith("/"))
adminWebServiceUrl = _profileSiteUrl + webServiceExt;
else
adminWebServiceUrl = _profileSiteUrl + "/" + webServiceExt;
LogMessage("Initializing SPO web service " + adminWebServiceUrl, LogLevel.Information);
// Get secure password from clear text password.
SecureString securePassword = GetSecurePassword(_sPoAuthPasword);
// Set credentials from SharePoint Client API, used later to extract authentication cookie, so can replay to web services.
SharePointOnlineCredentials onlineCred = new SharePointOnlineCredentials(_sPoAuthUserName, securePassword);
// Get the authentication cookie by passing the URL of the admin website.
string authCookie = onlineCred.GetAuthenticationCookie(new Uri(_profileSiteUrl));
// Create a CookieContainer to authenticate against the web service.
CookieContainer authContainer = new CookieContainer();
// Put the authenticationCookie string in the container.
authContainer.SetCookies(new Uri(_profileSiteUrl), authCookie);
// Set up the user profile web service.
_userProfileService = new UPSvc.UserProfileService();
// Assign the correct URL to the admin profile web service.
_userProfileService.Url = adminWebServiceUrl;
// Assign previously created authentication container to admin profile web service.
_userProfileService.CookieContainer = authContainer;
// LogMessage("Finished creating service object for SharePoint Online Web Service " + adminWebServiceUrl, LogLevel.Information);
return true;
}
catch (Exception ex)
{
LogMessage("Error initiating connection to profile web service in SPO " + ex.Message, LogLevel.Error);
return false;
}
}
Метод Main в Файле Program.cs вызывает Метод UploadImageToSpo для отправки изображения профиля пользователя в SharePoint Online. Все изображения профилей пользователей хранятся в библиотеке рисунков на узле "Личный сайт". UploadImageToSpo выполняет следующие задачи:
- Подключается к SharePoint Online.
- Определяет количество изображений для отправки для каждого пользователя.
- Если вы настроили приложение для отправки одного изображения на пользователя, изображение будет отправлено в библиотеку рисунков.
- Если приложение настроено для отправки трех образов на пользователя, приложение проверяет значение createSMLThumbs в файле конфигурации, чтобы определить, требуются ли три изображения разного размера. Если требуются три изображения разного размера, приложение использует ResizeImageSmall и ResizeImageLarge для создания трех изображений разного размера из исходного образа. Затем приложение отправляет изображения с измененным размером в библиотеку рисунков. Если три изображения разного размера не требуются, приложение отправляет три изображения одинакового размера в библиотеку рисунков.
static string UploadImageToSpo(string PictureName, Stream ProfilePicture)
{
try
{
string spPhotoPathTempate = "/User Photos/Profile Pictures/{0}_{1}Thumb.jpg"; // Path template to picture library on the My Site host.
string spImageUrl = string.Empty;
// Create SharePoint Online Client context to My Site host.
ClientContext mySiteclientContext = new ClientContext(_mySiteUrl);
SecureString securePassword = GetSecurePassword(_sPoAuthPasword);
// Provide authentication credentials using Office 365 authentication.
mySiteclientContext.Credentials = new SharePointOnlineCredentials(_sPoAuthUserName, securePassword);
if (!_appConfig.Thumbs.Upload3Thumbs) // Upload a single input image only to picture library, no resizing necessary.
{
spImageUrl = string.Format(spPhotoPathTempate, PictureName, "M");
LogMessage("Uploading single image, no resize, to " + spImageUrl, LogLevel.Information);
Microsoft.SharePoint.Client.File.SaveBinaryDirect(mySiteclientContext, spImageUrl, ProfilePicture, true);
}
else if (_appConfig.Thumbs.Upload3Thumbs && !_appConfig.Thumbs.CreateSMLThumbs)// Upload three images of the same size.
{
// The following code is not optimal. Upload the same source image three times with different names.
// No resizing of images necessary.
LogMessage("Uploading threes image to SPO, no resize", LogLevel.Information);
spImageUrl = string.Format(spPhotoPathTempate, PictureName, "M");
LogMessage("Uploading medium image to " + spImageUrl, LogLevel.Information);
Microsoft.SharePoint.Client.File.SaveBinaryDirect(mySiteclientContext, spImageUrl, ProfilePicture, true);
ProfilePicture.Seek(0, SeekOrigin.Begin);
spImageUrl = string.Format(spPhotoPathTempate, PictureName, "L");
LogMessage("Uploading large image to " + spImageUrl, LogLevel.Information);
Microsoft.SharePoint.Client.File.SaveBinaryDirect(mySiteclientContext, spImageUrl, ProfilePicture, true);
ProfilePicture.Seek(0, SeekOrigin.Begin);
spImageUrl = string.Format(spPhotoPathTempate, PictureName, "S");
LogMessage("Uploading small image to " + spImageUrl, LogLevel.Information);
Microsoft.SharePoint.Client.File.SaveBinaryDirect(mySiteclientContext, spImageUrl, ProfilePicture, true);
}
else if (_appConfig.Thumbs.Upload3Thumbs && _appConfig.Thumbs.CreateSMLThumbs) //Generate 3 different sized images.
{
LogMessage("Uploading threes image to SPO, with resizing", LogLevel.Information);
// Create three images based on recommended sizes for SharePoint Online.
// Create small-sized image.
using (Stream smallThumb = ResizeImageSmall(ProfilePicture, _smallThumbWidth))
{
if (smallThumb != null)
{
spImageUrl = string.Format(spPhotoPathTempate, PictureName, "S");
LogMessage("Uploading small image to " + spImageUrl, LogLevel.Information);
Microsoft.SharePoint.Client.File.SaveBinaryDirect(mySiteclientContext, spImageUrl, smallThumb, true);
}
}
// Create medium-sized image.
using (Stream mediumThumb = ResizeImageSmall(ProfilePicture, _mediumThumbWidth))
{
if (mediumThumb != null)
{
spImageUrl = string.Format(spPhotoPathTempate, PictureName, "M");
LogMessage("Uploading medium image to " + spImageUrl, LogLevel.Information);
Microsoft.SharePoint.Client.File.SaveBinaryDirect(mySiteclientContext, spImageUrl, mediumThumb, true);
}
}
// Create large-sized image. This image is shown when you open the user's OneDrive for Business.
using (Stream largeThumb = ResizeImageLarge(ProfilePicture, _largeThumbWidth))
{
if (largeThumb != null)
{
spImageUrl = string.Format(spPhotoPathTempate, PictureName, "L");
LogMessage("Uploading large image to " + spImageUrl, LogLevel.Information);
Microsoft.SharePoint.Client.File.SaveBinaryDirect(mySiteclientContext, spImageUrl, largeThumb, true);
}
}
}
// Return URL of the medium-sized image to set properties on the user profile.
return _mySiteUrl + string.Format(spPhotoPathTempate, PictureName, "M");
}
catch (Exception ex)
{
LogMessage("User Error: Failed to upload thumbnail picture to SPO for " + PictureName + " " + ex.Message, LogLevel.Error);
return string.Empty;
}
}
SetMultipleProfileProperties задает несколько свойств профиля пользователя в одном вызове метода. В этом примере кода SetMultipleProfileProperties задает следующие свойства профиля пользователя для пользователя:
PictureURL — задайте URL-адрес переданного изображения среднего размера в библиотеке рисунков на узле личного сайта.
SPS-PicturePlaceholderState — установите значение 0, чтобы указать, что SharePoint Online должен отображать отправленное изображение для пользователя.
static void SetMultipleProfileProperties(string UserName, string[] PropertyName, string[] PropertyValue)
{
LogMessage("Setting multiple SPO user profile properties for " + UserName, LogLevel.Information);
try
{
int arrayCount = PropertyName.Count();
UPSvc.PropertyData[] data = new UPSvc.PropertyData[arrayCount];
for (int x = 0; x < arrayCount; x++)
{
data[x] = new UPSvc.PropertyData();
data[x].Name = PropertyName[x];
data[x].IsValueChanged = true;
data[x].Values = new UPSvc.ValueData[1];
data[x].Values[0] = new UPSvc.ValueData();
data[x].Values[0].Value = PropertyValue[x];
}
_userProfileService.ModifyUserPropertyByAccountName(UserName, data);
// LogMessage("Finished setting multiple SharePoint Online user profile properties for " + UserName, LogLevel.Information);
}
catch (Exception ex)
{
LogMessage("User Error: Exception trying to update profile properties for user " + UserName + "\n" + ex.Message, LogLevel.Error);
}
}
SetAdditionalProfileProperties задает все дополнительные свойства профиля пользователя, которые необходимо обновить после отправки файлов изображений. Дополнительные свойства для обновления можно указать в файле configuration.xml.
static void SetAdditionalProfileProperties(string UserName)
{
if (_appConfig.AdditionalProfileProperties.Properties == null) // If there are no additional properties to update.
return;
int propsCount = _appConfig.AdditionalProfileProperties.Properties.Count();
if (propsCount > 0)
{
string[] profilePropertyNamesToSet = new string[propsCount];
string[] profilePropertyValuesToSet = new string[propsCount];
// Loop through each property in configuration file.
for (int i = 0; i < propsCount; i++)
{
profilePropertyNamesToSet[i] = _appConfig.AdditionalProfileProperties.Properties[i].Name;
profilePropertyValuesToSet[i] = _appConfig.AdditionalProfileProperties.Properties[i].Value;
}
// Set all properties in a single call.
SetMultipleProfileProperties(UserName, profilePropertyNamesToSet, profilePropertyValuesToSet);
}
}