Unknown's avatar

Posts by Simon Doy

I am an avid SharePoint enthusiast who works as an Independent SharePoint Consultant based in Leeds, United Kingdom. I am one of the organisers of the Yorkshire SharePoint User Group in the United Kingdom. I have been designing and building SharePoint solutions since 2006.

PowerShell: Getting Sandbox Solutions in a SharePoint Web Application


Introduction

Like all good SharePoint developers we have been using Sandbox Solutions where we can. Of course one of the problems with Sandbox solutions is that its difficult to find out what you have installed and where.
This is particularly important if you have a Sandbox solution that is used for branding and is installed into a number of site collections.
Therefore I built a script which will retrieve sandbox solutions in a web application.
You can filter which sandbox solutions by the name.
Please fill free to use and modify the script, though make sure you test it before using in Production.
If you do make some enhancement that you think is useful, please let me know as would love to see what additional functionality is useful.

How does the script works

The script is a PowerShell script which works in the following way:
  • The script is run by providing the Url for the Web Application
  • The script will enumerate through all the site collections in the web application and creates an array object which has two properties, SiteCollection and Solution
  • Once all site collections have been enumerated then the array will be outputted.
This way you can use the output for further processing steps. For example, to filter the results for one solution and upgrade the solutions in all the site collections returned.
The script is shown below:

param
(
[Parameter(Mandatory=$false, HelpMessage='Solution Name')]
[string]$SolutionName="",
[Parameter(Mandatory=$false, HelpMessage='Solution Name')]
[string]$WebApplicationUrl="")$memoryAssignment = Start-SPAssignment;
$numberOfSolutionsFound = 0;
$webApplication = Get-SPWebApplication -Identity $WebApplicationUrl -ErrorAction SilentlyContinue -AssignmentCollection $memoryAssignment;
if($webApplication -ne $null)
{
#enumerate through site collections in web application
$allSites = Get-SPSite -WebApplication $webApplication -Limit ALL -Confirm:$false -AssignmentCollection $memoryAssignment;
foreach($checkSite in $allSites)
{
#Write-Output "Checking Site " $checkSite.Url " for solution " $SolutionName;
if($SolutionName -eq "")
{
$checkSolutions = Get-SPUserSolution -Site $checkSite -AssignmentCollection $memoryAssignment;
foreach($solution in $checkSolutions)
{
$output = New-Object -TypeName "System.Object";
Add-Member -InputObject $output -MemberType NoteProperty -Name "Solution" -Value "";
Add-Member -InputObject $output -MemberType NoteProperty -Name "SiteCollection" -Value "";
$output.Solution = $solution;
$output.SiteCollection = $checkSite;
Write-Output -InputObject $output;
$numberOfSolutionsFound++
}
}
else
{
$checkSolution = Get-SPUserSolution -Identity $SolutionName -Site $checkSite -ErrorAction SilentlyContinue -AssignmentCollection $memoryAssignment;
if($checkSolution -ne $null)
{
$output = New-Object -TypeName "System.Object";
Add-Member -InputObject $output -MemberType NoteProperty -Name "Solution" -Value "";
Add-Member -InputObject $output -MemberType NoteProperty -Name "SiteCollection" -Value "";
$output.Solution = $checkSolution;
$output.SiteCollection = $checkSite;
Write-Output -InputObject $output;
$numberOfSolutionsFound++
}
}
}
}</p>
<p style="direction: ltr; margin-top: 0; margin-left: 0; width: 7.5875in;">Write-Output "Found $numberOfSolutionsFound Instances of Solution $SolutionName";
Stop-SPAssignment $memoryAssignment;</p>
<p style="direction: ltr; margin-top: 0; margin-left: 0; width: 7.5875in;">

 

How to execute the script

 To execute the script do the following:
  • Logon to SharePoint 2013 server
  • Run the SharePoint Management Shell
    • .\Get-SPUserSolutionInWebApplication -WebApplicationUrl https://sharepoint
    • There is an optional parameter -SolutionName which allows you to only return the solutions with a particular name

The script will output an array of Solution Objects with an associated Site Collection object.

We can assign a value to the output and then do some further processing using that value.

Here is an example of the output from the script without assigning the result to a variable.

getusersolutionsfromwebapp

To do something more useful then assign the output to a variable. You can then enumerate through the variable array.

For example, the following screenshot shows the output being assigned to a variable $solutions and then it is being enumerated using the following:

$solutions | %{Write-Host $_.Solution.Name “in” $_.SiteCollection.Url}

enumerate-usersolutionarray

Downloads

If you would like to try out the PowerShell script, then you can download the script here:

Get-SPUserSolutionInWebApplication.zip

Please fill free to use and modify the script, though make sure you test it before using in Production.

Also let me know if you find it useful and if you have made some cool changes let me know as always looking for ways to make things better!

SharePoint 2013 Incoming Email Issue : Emails disappear


 

Introduction

The other day we had a SharePoint 2013 development environment which had been configured up to receive email into libraries.

The configuration had been working for a while with no problems, there are issues with the incoming email on older versions of SharePoint 2013 but this farm was patched to May 2015.

We used the following Technet article to configure incoming email: https://technet.microsoft.com/en-us/library/cc262947.aspx

Unfortunately, email was never getting into SharePoint. The service had been working without any problems for a few weeks.

 

Problem Analysis

 

On investigation of the problem showed that email was successfully routed via Exchange to the SharePoint server via the locally installed SMTP service. The email was arriving successfully into the drop folder and after a few minutes the email disappeared. However, it would never appear in the document library! The email just disappeared.

Another symptom of the problem was seen when accessing the document library settings page for Incoming Email. Not all the settings would be loaded, the page was missing a large set of settings.

Normally the page looks like this :-

incoming-email-settings-library-ok

 

However, it was only showing this information :-

incoming-email-settings-library-broken

 

When someone attempted to make a change to the email settings for the list then the following error would be thrown:-


Server Error in '/' Application.

Error in the application.Description: An unhandled exception occurred during the execution of the current web request. 

Please review the stack trace for more information about the error and where it originated in the code. 

Exception Details: Microsoft.SharePoint.SPException: Error in the application.

Source Error: An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below.

Stack Trace: [SPException: Error in the application.]   
Microsoft.SharePoint.SPList.UpdateDirectoryManagementService(String oldAlias, String newAlias) +1239   
Microsoft.SharePoint.SPList.Update(Boolean bFromMigration) +311   
Microsoft.SharePoint.ApplicationPages.EmailSettingsPage.SubmitButton_Click(Object sender, EventArgs args) +1347   
System.Web.UI.WebControls.Button.RaisePostBackEvent(String eventArgument) +146   
System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +3586

Version Information: Microsoft .NET Framework Version:4.0.30319; ASP.NET Version:4.0.30319.34248

 

Strange behaviour indeed!

I fired up ULSViewer (http://www.microsoft.com/en-us/download/details.aspx?id=44020) on the offending server. Whilst watching the ULS log, another email was sent to the document library. After a minute or so a message popped up.

Cannot load type EWSSharePointEventReceiver from Assembly: [Assembly Name].

So for some reason the assembly could not be loaded, hmm so why is that?
I had a look through the GAC and could find the assembly name. However, using a .Net Reflector such as Just Decompile (http://www.telerik.com/products/decompiler.aspx) or .NET Reflector (http://www.red-gate.com/products/dotnet-development/reflector/). I could see that the class was not in the assembly. Speaking with the developers, I found out the class names had been changed. So the next thing I checked was the event receivers.

With a bit of PowerShell, I found a set of event receivers which were being fired by the item email received event.

I removed the event receiver using the following PowerShell and running it in the SharePoint 2013 PowerShell Management Shell:-

 


$eventReceiverName="EWSSharePointEventReceiver*";
$siteUrl="https://sharepoint";
$site = Get-SPSite $siteUrl;
$rootWeb = $site.RootWeb;
$allWebs = $rootWeb.AllWebs();

foreach($checkList in $allListsInWeb)        
{   
	Write-Host "Checking List: " $checkList.Title " for event receiver class: " $eventReceiverName;
	$eventReceivers = $checkList.EventReceivers | ?{$_.Class -like $eventReceiverName};            
 
        If($eventReceivers -ne $null -and $eventReceivers.Count -gt 0)
        {                   
             foreach($removeReceiver in $eventReceivers)                        
             {                       
	           Write-Host "Removing Event Receiver: $removeReceiver";
		   $removeReceiver.Delete();
             }
 
             $checkList.Update();
        }
}

 

After the corrupt event receivers were removed from the list then resending the email to SharePoint worked! Now the email appeared in the document library.