Scripting SharePoint Learning Kit Permissions with PowerShell

If you are using SLK with more than a few sights then provisioning the permissions becomes either very time consuming or impossible by hand. A typical UK secondary school will have between 700 to 1500 distinct classes, and to use SLK to its fullest extent then each of these will need a site with unique permissions. So once you have finished any trial/prototype you will need to script the setting up of SLK Permissions.

The following is a simple proof of concept script to initially set the SLK permissions on a site. It will add permissions for specified Active Directory users or groups to specified existing sites in SharePoint. You could easily extend it to create sites by checking to see if the site exists first, and if not running New-SPWeb.

The script runs from an input csv in the following format:

Site,User,Role
http://laptop01/sites/slk/class1,demo\learner1,SLK Learner
http://laptop01/sites/slk/class1,demo\learner2,SLK Learner
http://laptop01/sites/slk/class1,demo\teacher,SLK Instructor
http://laptop01/sites/slk/class2,demo\teacher,SLK Instructor

For each line in the input file it adds the user to the given site, with the given permission level.

To use save the following PowerShell as a ps1 file, create an input csv file called sitePermissions.csv in the same directory and run the script.

Add-PSSnapIn Microsoft.SharePoint.PowerShell -ErrorAction SilentlyContinue

function AddPermission($web, $userName, $permission)
{
# Break inheritance if required. Argument is true if copy existing permissions or false to strip all
# permissions
if ($web.HasUniqueRoleAssignments -eq $false)
{
$web.BreakRoleInheritance($true)
}

$user = $web.EnsureUser($userName)
$roleAssignment = New-Object Microsoft.SharePoint.SPRoleAssignment($user)
$role = $web.RoleDefinitions[$permission]
$roleAssignment.RoleDefinitionBindings.Add($role);
$web.RoleAssignments.Add($roleAssignment)
}

$csvData = import-csv sitePermissions.csv
foreach ($line in $csvData)
{
$web = Get-SPWeb $line.Site
AddPermission $web $line.User $line.Role
$web.Dispose()
}

Running this with the sample data above gives the following before and after screenshots on the permissions:

beforeafter

Notes on the script:

  1. There is no error handling so if your input in incorrect e.g. typos in your site, user name or roles, you will get screens of red error messages.
  2. Line 1, Add-PSSnapIn ensures that the PowerShell comandlets are added into the current session if not already present.
  3. The actual adding of the permissions is put into a function to break up the script and improve readability and maintainability.
  4. Permissions can only be added to sites which have unique permissions, so if the site doesn’t already have permissions it breaks them and can either copy the existing conditions, or start from none depending on the value of the argument passed to BreakRoleInheritance.
  5. EnsureUser is used to make sure that the user is added to SharePoint before trying to give them permissions
  6. To change the name of the input file, just change sitePermissions.csv in the script.
  7. It’s not particularly optimised as it opens a new SPWeb for every line. You could check to see if it’s a different site on each line and only dispose and create a new one if it is different.
  8. The script will still work if the user’s permission already exists.

This is a simple script suitable for initial setting of SLK permissions. It doesn’t attempt to remove any permissions if no longer required, or do anything else to the site apart from breaking inheritance.

For a more comprehensive solution which can completely provision a set of sites, including setting any setting on a site, adding and removing permissions and automatically adding teachers’ sites to their list when assigning permissions, as well as a multitude of other functionality, then please investigate our managed service Salamander SharePoint. This will do all this and more.

Read More

Bulk Loading Photos From Sims Into SharePoint

I now have a way to script bulk loading of photos from Sims into SharePoint, for example to enable the use of the Learning Gateway My Children web part.

The script is in 2 parts. First extract the photos from Sims using our free Photo Export tool

PhotoExport.exe simsuser simspassword outputFolder /names:mapping.csv

where mapping.csv is a csv file mapping admission numbers to Active Directory login names

The use the PowerShell script in my last blog entry Using PowerShell to Bulk Upload Files to SharePoint to upload the images to SharePoint.

You could even set up a scheduled task to automatically upload them on a predefined schedule.

Read More

Using PowerShell to Bulk Upload Files to SharePoint

While building a school’s Learning Gateway I needed to bulk upload all their student images into a picture library so that the My Children web part could display them. Since there were several hundred of them I wrote a little PowerShell script to perform this.

$siteUrl = "http://sharepoint/schools/test"
$listName = "Students Picture Library"

[system.reflection.assembly]::LoadWithPartialName("Microsoft.Sharepoint")
$site = New-Object Microsoft.SharePoint.SPSite($siteUrl)
$web = $site.OpenWeb()
$list = $web.Lists[$listName]
$fileCollection = $list.RootFolder.Files

$files = get-childItem -Exclude *.ps1

foreach ($file in $files)
{
    $stream = $file.OpenRead()
    $uploaded = $fileCollection.Add($file.Name, $stream, $TRUE)
    "Uploaded " + $file.Name

    if ($stream) {$stream.Dispose()}
}

if ($web) {$web.Dispose()}
if ($site) {$site.Dispose()}

In order to use this:

  1. Save as as .ps1 file in the same folder as the files to upload.
  2. Change the site url and name of the list at the beginning of the script to your values
  3. Make sure that only the files to upload and the ps1 file is in the folder
  4. Open PowerShell using Run As Administrator
  5. Navigate to the folder
  6. Run the .ps1 file

The script will then iterate through all files in the current folder and upload them to the given list, overwriting them if they already exist.

Read More