none
Bulk upload User Pictures Powershell Script - Skip existing photos..

    Question

  • Hello. I have a current working process for a client. When someone joins the company, a headshot is taken and is placed in a shared folder by security team. The picture file is named the same ID of the user log on.

    On a monthly basis, this script runs, but I need it modified so that IF the headshot ID matches the name of the existing photo library, then it should skip the upload for this user. I have tried many ways to get it working but cannot, can anyone help modify this script please?

    cls

    if((Get-PSSnapin | Where {$_.Name -eq "Microsoft.SharePoint.PowerShell"}) -eq $null) {
           Add-PSSnapin Microsoft.SharePoint.PowerShell;
    }

    $environment ="$env:userdomain"

    #---------------------------------------------------------------------------------
    # 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
    }


    Update-SPProfilePictures "http://sharepoint.$environment.local/profiles" "User Photos" "E:\Headshots" "$environment"

    Tuesday, May 02, 2017 1:01 PM

All replies