Showing posts with label Powershell. Show all posts
Showing posts with label Powershell. Show all posts

Wednesday, 25 June 2014

SharePoint 2010/2013: Enable-SPFeature Error (Failed to create receiver object from assembly)

So I had another lovely error recently, I had a wasp which had some external assemblies, I accidentally forgot to add one to the package manifest and when it deployed I got:

Enable-SPFeature : Failed to create receiver object from assembly "ASSEMBLYNAME, Version=1.0.0.0, Culture=neutral, PublicKeyToken=eaf1b7820cf1
fb30", class "CLASSNAME" for feature "FEATURENAME" (ID: 08284496-c68e-4f6c-befe-5777d14ad74b).
: System.ArgumentNullException: Value cannot be null.

So I instantly realised I was being silly and added the reference to the package manifest, packaged it, cabbed it, The Dll was in there, Great! I deployed the wsp and tried The deployment script again, it failed on the same point, I checked the gas, it was there alright, everything was looking as it should, but I couldn't activate the feature.

What was wrong? I tried deploying once more, did an observer for good measure and still nothing.

I then thought I would reopen the PowerShell window and try once again on the off chance that something was borked, so I restarted it, ran the script and it worked!

For some reason, the PowerShell session had cached the old error response from the feature activation, I don't know why but that's what it seemed to do.

Rule of thumb for the future, open a new ps session if you get an unexplained issue with a ps script

Saturday, 7 June 2014

Powershell | Get SharePoint 2010 Custom Error and Access Denied pages

A simple script, run this on any SharePoint server in a farm and it will return all set error and access denied pages for all web applications:

Scenario: Audit of farm setup

Script:
<#
.Synopsis
   Gets all set error and access denied pages for all webapps in the current farm
.EXAMPLE
   get-sperrorpages
#>

function get-sperrorpages()
{
    $snapin = Get-PSSnapin | Where-Object { $_.Name -eq 'Microsoft.SharePoint.Powershell'}
    if ($snapin -eq $null)
    {      
        Write-Host "Loading SharePoint Powershell Snapin"
        Add-PSSnapin "Microsoft.SharePoint.Powershell"
    }

    Start-SPAssignment -global
get-spwebapplication | ForEach-Object {
Write-Host "Web Application: $_" -foregroundcolor Green
Write-Host " - Error Page Set:" $_.GetMappedPage([Microsoft.SharePoint.Administration.SPWebApplication+SPCustomPage]::Error)
Write-Host " - Access Denied Page Set:" $_.GetMappedPage([Microsoft.SharePoint.Administration.SPWebApplication+SPCustomPage]::AccessDenied)
Write-Host ""
}

    Stop-SPAssignment –global
}

Output:
PS C:\dev\scripts\audit> .\get-errorpages.ps1
Web Application: SPWebApplication Name=intranet.devnet.local
 - Error Page:
 - Access Denied Page:

Web Application: SPWebApplication Name=extranet.devnet.local
 - Error Page: /_layouts/Devnet.Local/Error.aspx
 - Access Denied Page: /_layouts/Devnet.Local/AccessDenied.aspx

Web Application: SPWebApplication Name=internet.devnet.local
 - Error Page: /_layouts/Devnet.Local/Error.aspx
 - Access Denied Page: /_layouts/Devnet.Local/AccessDenied.aspx

Web Application: SPWebApplication Name=edit.internet.devnet.local
 - Error Page: /_layouts/Devnet.Local/Error.aspx
 - Access Denied Page: /_layouts/Devnet.Local/AccessDenied.aspx

As you can see from that execution my farm has four web applications, three are publicly accessible so i have set custom error and access denied pages, the fourth is internal only so there is no need for any custom branded pages

Powershell | Get all active RDP sessions for a username

For any IT admin/dev, the ecosystem involves connecting and managing multiple remote desktop sessions to different servers and computers, this can get very cumbersome to maintain and make sure you are disconnecting, many of you probably use mRemote or Remoter Desktop Connection manager to help you manage all of your different connections (if you don't, you really should, its a godsend to be able to categorise and organise all of your connections).

The problem comes in when you have an unexpected crash or an issue and either your computer crashes or the RDP app crashes, you can loose track of which connection you have open, that can lead to leaving sessions open taking up valuable resources or hogging sessions other people need.

That problem can be solved with this powershell script:

<#
.Synopsis
   Gets all server entries from an RDPC connection file and shecks for any open sessons
.EXAMPLE
   get-rdpsessions "C:\resources\rdpSettings.rdg" 'benjamin.dev'
#>
function get-rdpsessions()
{
    Param(
        # link to the RDPC connections file
        $rdcManagerFile,
        # default username to use incase the conneciton entry doesnt have a username set, this should be without the domain
        $defaultUsername)
    
    Select-Xml -XPath '//server' -Path "C:\resources\rdpSettings.rdg" | %{
        $server = $_.node.name
        $userName = $defaultUsername
        if ($_.Node.logonCredentials.HasChildNodes)
        {
            $userName =  $_.Node.logonCredentials.userName
        }
    
        $queryResults = (qwinsta /server:$server | foreach { (($_.trim() -replace “\s+”,”,”))} | ConvertFrom-Csv)
        $queryResults |  %{
            if ($_.SESSIONNAME -eq $userName)
            { 
                write-host 'User:' $_.SESSIONNAME 'is active on' $server -ForegroundColor green
            }
        }
    }
}

get-rdpsessions "C:\resources\rdpSettings.rdg" 'benjamin.dev'

This will output something like the following:

PS C:\Users\benjamin.dev> C:\Users\benjamin.dev\SkyDrive\Code\PS\get-rdpsessions.ps1
User: benjamin.dev is active on devnet-ad.devnet.local
User: benjamin.dev is active on devnet-sql.devnet.local
User: benjamin.dev is active on devnet-sp14.devnet.local
User: benjamin.dev is active on devnet-sp15.devnet.local

This script can be easily modified to integrate with whatever system you use, for example, if you run a development house or consultancy, this could be modified to run through all servers for all users at 4:50 in the afternoon every day and email anyone who has an active session to remind them they need to log off