Best solution to create Automatic UserProfile Import to SharePoint
- Create folder “ImportProfileImages”
- Create subfolder “ProfileImages”
- Create “Drive:\ImportProfileImages\UpdateUserProfiles.ps1″
cls
if((Get-PSSnapin | Where {$_.Name -eq "Microsoft.SharePoint.PowerShell"}) -eq $null) {
Add-PSSnapin Microsoft.SharePoint.PowerShell;
}
#---------------------------------------------------------------------------------
# Default Values
#---------------------------------------------------------------------------------
$spNotFoundMsg = "Unable to connect to SharePoint. Please verify that the site '$siteUrl' is hosted on the local machine.";
#-----------------------------------------------------
# Load Assemblies
#-----------------------------------------------------
if ([Reflection.Assembly]::LoadWithPartialName("Microsoft.SharePoint") -eq $null) { throw $spNotFoundMsg; }
if ([Reflection.Assembly]::LoadWithPartialName("Microsoft.Office.Server") -eq $null) { throw $spNotFoundMsg; }
#-----------------------------------------------------
# Functions
#-----------------------------------------------------
function ToSimpleString([string]$value, [bool]$trim = $true, [bool]$removeSpaces = $true, [bool]$toLower = $true)
{
if ($value -eq $null) { return [System.String]::Empty; }
if ($trim)
{
$value = $value.Trim();
}
if ($removeSpaces)
{
$value = $value.Replace(" ", "");
}
if ($toLower)
{
$value = $value.ToLower();
}
return $value;
}
function GetSPSite($url)
{
[Microsoft.SharePoint.SPSite]$site = New-Object "Microsoft.SharePoint.SPSite" -ArgumentList $url
return $site;
}
function GetSPWeb($url)
{
[Microsoft.SharePoint.SPSite]$site = GetSPSite -url $url;
[Microsoft.SharePoint.SPWeb]$web = $site.OpenWeb();
return $web
}
function GetSPList($url, $listName)
{
$listName = (ToSimpleString -value $listName);
[Microsoft.SharePoint.SPWeb]$web = GetSPWeb -url $url;
foreach($list in $web.Lists)
{
$title = (ToSimpleString -value $list.Title);
if ($listName -eq $title)
{
return $list;
}
}
return $null;
}
function GetSPDocumentLibrary($url, $libraryName)
{
[Microsoft.SharePoint.SPDocumentLibrary]$lib = [Microsoft.SharePoint.SPDocumentLibrary](GetSPList -url $url -listName $libraryName);
return $lib;
}
function GetSPFile($libraryInstance, $fileName)
{
$fileName = (ToSimpleString -value $fileName -removeSpaces $false);
foreach($file in $libraryInstance.RootFolder.Files)
{
$itemName = (ToSimpleString -value $file.Name -removeSpaces $false);
if ($fileName -eq $itemName)
{
return $file;
}
}
return $null;
}
function UploadSPFile([string]$url, [string]$libraryName, [string]$filePath, [System.Text.StringBuilder]$verbose = $null)
{
try
{
[Microsoft.SharePoint.SPDocumentLibrary]$lib = (GetSPDocumentLibrary -url $url -libraryName $libraryName);
if ($lib -eq $null)
{
throw (([string]'Cannot find document library "') + ([string]$libraryName) + ([string]'" at url "') + ([string]$url) + ([string]'"!'));
}
$bytes = [System.IO.File]::ReadAllBytes($filePath);
$fileName = [System.IO.Path]::GetFileName($filePath);
[Microsoft.SharePoint.SPFile]$file = GetSPFile -libraryInstance $lib -fileName $fileName;
if ($file -eq $null)
{
if ($verbose -ne $null)
{
[void]$verbose.AppendLine("Uploading File...");
}
$file = $lib.RootFolder.Files.Add($fileName, $bytes);
}
else
{
if ($verbose -ne $null)
{
[void]$verbose.AppendLine("File Exists, overwriting...");
}
$file.SaveBinary($bytes);
}
if ($verbose -ne $null)
{
[void]$verbose.AppendLine(($bytes.Length.ToString()) + ([string]" bytes written!"));
}
return $file;
}
catch
{
if ($verbose -ne $null)
{
[void]$verbose.AppendLine(([string]'Error: Upload to document library "') + ([string]$libraryName) + ([string]'" at "') + ([string]$url) + ([string]'" or file "') + ([string]$filePath) + ([string]'" failed!'));
[void]$verbose.AppendLine([string]'Error: ' + [string]$error[1]);
}
}
return $null;
}
function GetSpContext($url)
{
[Microsoft.SharePoint.SPSite]$site = GetSPSite -url $url
return [Microsoft.Office.Server.ServerContext]::GetContext($site);
}
function GetProfileManager($url)
{
[Microsoft.Office.Server.ServerContext]$ctx = GetSpContext -url $url
[Microsoft.Office.Server.UserProfiles.UserProfileManager]$upm = New-Object "Microsoft.Office.Server.UserProfiles.UserProfileManager" -ArgumentList $ctx
return $upm;
}
function GetSPUser($url, $loginName)
{
[Microsoft.SharePoint.SPWeb]$web = GetSPWeb -url $url
[Microsoft.SharePoint.SPUser]$user = $web.AllUsers[$loginName]
return $user;
}
function GetProfilePropertyName($userProfileManager, $propertyName)
{
$propertyName = (ToSimpleString -value $propertyName);
$propertyName = $propertyName.Replace("sps-", "");
foreach($prop in $userProfileManager.Properties)
{
[string]$n = (ToSimpleString -value $prop.DisplayName);
$n = $n.Replace("sps-", "");
if ($propertyName -eq $n) { return $prop.Name.ToString(); }
$n = (ToSimpleString -value $prop.Name);
$n = $n.Replace("sps-", "");
if ($propertyName -eq $n) { return $prop.Name.ToString(); }
}
return $null;
}
#This function is VERY different from [System.IO.Path]::Combine
function CombineUrls([string]$baseUrl, [string]$relUrl)
{
[System.Uri]$base = New-Object System.Uri($baseUrl, [System.UriKind]::Absolute);
[System.Uri]$rel = New-Object System.Uri($relUrl, [System.UriKind]::Relative);
return (New-Object System.Uri($base, $rel)).ToString();
}
function Update-SPProfilePictures([string]$webUrl, [string]$picLibraryName, [string]$localFolderPath, [string]$domain)
{
#Get web and picture library folder that will store the pictures
$web = Get-SPWeb $webUrl
$picFolder = $web.Folders[$picLibraryName]
if(!$picFolder)
{
Write-Host "Picture Library Folder not found"
return
}
#Attach to local folder and enumerate through all files
$files = ([System.IO.DirectoryInfo] (Get-Item $localFolderPath)).GetFiles() | ForEach-Object {
$username = [IO.Path]::GetFileNameWithoutExtension($_.FullName);
#Create file stream object from file
$fileStream = ([System.IO.FileInfo] (Get-Item $_.FullName)).OpenRead()
$contents = new-object byte[] $fileStream.Length
$fileStream.Read($contents, 0, [int]$fileStream.Length);
$fileStream.Close();
write-host "Copying" $_.Name "to" $picLibraryName "in" $web.Title "..."
#Add file
$spFile = $picFolder.Files.Add($picFolder.Url + "/" + $_.Name, $contents, $true)
$spItem = $spFile.Item
$upm = GetProfileManager -url $webUrl
$up = $null;
$up = $upm.GetUserProfile("$domain\$username");
$picturePropertyName = GetProfilePropertyName -UserProfileManager $upm -PropertyName "PictureUrl";
if($up -ne $null)
{
if (-not [System.String]::IsNullOrEmpty($picturePropertyName))
{
$PortraitUrl = CombineUrls -baseUrl $spFile.Web.Url -relUrl $spFile.ServerRelativeUrl;
Write-Host $PortraitUrl
$up.get_Item($picturePropertyName).Value = $PortraitUrl;
$up.Commit();
}
}
}
Write-Host "Updating User Profile Photo Store..." -foregroundcolor yellow
Update-SPProfilePhotoStore –MySiteHostLocation $webUrl
Write-Host "Done" -foregroundcolor green
}
4. Run
Update
-SPProfilePictures
"http://my-sites-host-url"
"User Photos"
"c:\ImportProfileImages\ProfileImages"
"Your_Domain"
Comentarios