I’ve been playing around with Powershell the last week and thought I’d post some of my trickier findings:
Remoting with powershell
With remoting you can script installations or configurations that should be done on multiple farms/servers without having to login to each farm and run the script with it’s variables. Now you can just build 1 big script with variables and run each part of the script with a remote powershell session opened with the correct credentials.
The code below calls some functions to start a new remote session with fixed name, load variable / functions file into the session to be used later, run your code using the variables and functions, end session.
StartRemoting $AUTH_Servername $AUTH_ServerUser $AUTH_ServerUserPassword
$s = Get-PSSession -Name "RemoteSP2010Script"
Invoke-Command -Session $s -ScriptBlock {
LoadSharePointCmdlets
#YOUR CODE
}
StopRemoting $AUTH_Servername
function LoadSharePointCmdlets()
{
Write-Host "- Loading SharePoint cmdlets" -foregroundcolor "Green"
Add-PsSnapin Microsoft.SharePoint.PowerShell -ErrorAction SilentlyContinue
}
function StartRemoting($Server, $Username, $Password)
{
#Build credentials from variables
if($Username -eq $NULL)
{
$Credentials = $NULL
}
else
{
$Credentials = New-Object -TypeName System.Management.Automation.PSCredential
-argumentlist $Username , $Password
}
#enable remoting
enable-PSRemoting -confirm:$false
#increase memory limit for remote shell
Set-Item WSMan:\localhost\Shell\MaxMemoryPerShellMB 1000
#Disconnects the client remote desktop
#Enable-WSManCredSSP -Role client -DelegateComputer $Server -Force
Write-Host "Starting new remote session to" $Server -foregroundcolor "Green"
if ($Credentials -eq $NULL)
{
$s = new-psSession -ComputerName $Server -Name "RemoteSP2010Script"
}
else
{
$s = new-psSession -ComputerName $Server -Authentication CredSSP
–Credential $Credentials -Name "RemoteSP2010Script"
}
#Load Variables & functions into remote session
Write-Host "Loading variables and functions into remote session" -foregroundcolor "Green"
Invoke-Command -Session $s -FilePath $VariableFileLocation -ErrorAction SilentlyContinue
Invoke-Command -Session $s -FilePath $FunctionsFileLocation -ErrorAction SilentlyContinue
}
function StopRemoting($Server)
{
Write-Host "Closing remote session to" $Server -foregroundcolor "Green"
Remove-PSSession -ComputerName $Server
}