Introduction to Windows PowerShell
for SharePoint Administrators
Shane Young and Todd Klindt
SharePoint Nerds
Rackspace
Who is this Todd guy?
SharePoint MVP since 2006
Speaker, writer, consultant, juggler of kittens
Personal Blog
www.toddklindt.com/blog
Company web site
sharepoint.rackspace.com
E-mail
[email protected] Twitter me! @toddklindt
Agenda
What is Windows PowerShell
Windows PowerShell basics
Windows PowerShell scripts for administrators
What is Windows PowerShell?
Command-line interface and scripting language used
for SharePoint Server administration
Compliments CMD
Extends STSADM
Uses XML & Objects
Built on the .NET Framework
Why do we care?
Complete command-line system that is far more
powerful than any previous Windows-based
command-line prompt environment.
Provides:
More Control
More Efficiency
More Productivity
More coolness
What about STSADM?
STSADM still available to support backwards
compatibility.
Whatever STSADM can do, PowerShell can do
better!
Ability to run against SQL Snapshots, instead of
production.
More granular control for backup / restore.
Windows PowerShell Basics
cmdlet
pronounced "command-let
single function that can be used separately or
combined with other cmdlets to perform complex
tasks and automate administration
Windows PowerShell Basics
cmdlets = verbs (actions) & nouns (objects)
Combine the two to build specific commands
Examples
Get-SPSite
Get = Verb
SPSite = Noun
Getting the list of SharePoint cmdlets
Get a list of all commands:
Get-Command noun sp*
Get help for a specific command:
Get-Help <cmdlet>
Get-Help <cmdlet> -example
DEMO
PowerShell Basics
PowerShell Scripts
Build scripts to easily execute through common
commands & tasks!
Can be developed and scheduled using Windows
Task Scheduler.
Register-ScheduledJob
PowerShell Scripts
Examples:
Activate a feature across multiple site collections
Provisioning of Managed Accounts
Creating of New Sites
Backup all Site Collections in Farm
Scripting Syntax
Sample Script:
$password = Read-Host "What is the password for all
accounts?" -assecurestring ; Get-Content usernames.txt |
ForEach-Object {New-SPManagedAccount -password
$password -username litwareinc\$_; Set-SPManagedAccount identity $_ -autogenerate -confirm:$False}
Syntax
Description
Denotes a variable.
Denotes completion of cmdlet, continue to next one.
Sends the output of the preceding cmdlet to the next cmdlet.
ForEach-Object { }
For each object, execute all the commands within the { }.
DEMO
PowerShell Scripts
General PowerShell tips
Its just a shell, spruce it up some
Color
Size
Run as Admin
Enable quick edit
Use the included ISE
Use a third party solution
Remoting
Must be enabled on each server
Nothing much to do on the client
Two ways in
Enter-PSSession
Invoke-Command
Use Enable-PSRemoting to enable
Get-Help about_remoting
Watch out for security settings
Increase MaxMemoryPerShellMB
PowerShell Web Access
Avoiding the Farm Config Wizard
The Farm Config Wizard does some very bad things
Wise SharePoint admins avoid it
Use PowerShell to replicate its functionality
Steps
Managed accounts
Web applications
MySite host
Service application pool
State Service
Usage Service
The rest
Everyday tasks
Add-SPShellAdmin
Move-SPSite
Enable Developer Dashboard
Troubleshooting
Master pages
Get database sizes
Add-SPShellAdmin
Necessary for unprivileged accounts, since youre
not logging in as the Farm account, right?
Must specify databases to give access to
Gives permissions to an account
WSS_Admin_WPG on SharePoint servers
SharePoint_Shell_Access role on database
To run it account must have:
Security_Admin role SQL instance
db_owner role on database
Local admin on SharePoint server
Move-SPSite
Used to move Site Collections between content
databases
Everything mergecontentdbs can do, this can do
better
Mostly done on the SQL side
Databases must be attached to the same web
application, and on the same SQL instance
Works great to get rid of Content databases with
GUIDs
Developer Dashboard
Can be enabled with STSADM, but thats just
embarrassing
More flexibility with PowerShell
$dash =
[Microsoft.SharePoint.Administration.SPWebService]::Conte
ntService.DeveloperDashboardSettings;
$dash.DisplayLevel = 'On';
$dash.TraceEnabled = $true;
$dash.Update()
Troubleshooting
Use New-SPLogFile immediately before
and right after recreating a problem
Use Merge-SPLogFiles to collect trace logs
from all servers in your farm
Use Get-SPLogEvent to get events
Can filter by a number of properties, like
Correlation ID
Can point at alternate directory
Get-SPLogEvent -StartTime (Get-Date).addminutes(-10) Directory
e:\logs | Where-Object {$_.correlation -eq "dc07834b-9982-4eafaacf-d62a6b398f87"}
Master Pages
Can be used to set the master page
$web = Get-SPWeb http://sharepoint
$web.CustomMasterUrl =
"/_catalogs/masterpage/nightandday.master"
$web.MasterUrl = "/_catalogs/masterpage/nightandday.master"
$web.Update()
Database Information
Use Get-SPDatabase to get list of databases and
their properties
Get-SPDatabase | Sort-Object disksizerequired -desc | FormatTable Name, @{Label ="Size in MB"; Expression =
{$_.disksizerequired/1mb}}
Get-SPDatabase | ForEach-Object {$db=0} {$db
+=$_.disksizerequired; $_.name + " - " +
$_.disksizerequired/1mb} {Write-Host "`nTotal Storage (in MB)
=" ("{0:n0}" -f ($db/1mb))}
Links
Todd doing this without Shane
http://www.toddklindt.com/sizzle
Zach Rosenfields blog
http://sharepoint.microsoft.com/Blogs/zach
Gary Lapointes blog
http://blog.falchionconsulting.com/
Document your farm with PowerShell
http://technet.microsoft.com/en-us/library/ff645391.aspx
PS Scripts
http://get-spscripts.com/
Things we referenced
Determine database sizes in PowerShell
http://www.toddklindt.com/SP2010DatabaseSize
Remoting requirements for SharePoint 2010
http://sharepoint.microsoft.com/blogs/zach/Lists/Posts/Post.aspx?ID=45
Developer Dashboard
http://www.toddklindt.com/devdashboard
Master Pages
http://www.toddklindt.com/SetSP2010MasterPage
Use Move-SPSite
http://www.toddklindt.com/blog/Lists/Posts/Post.aspx?ID=233
SharePoint 2013 PowerShell Guide
http://technet.microsoft.com/en-us/library/ff678226.aspx