Create and delete SharePoint list views with PowerShell

Here’s how you can create and delete views in a SharePoint list or library using PowerShell (Is there anything that can’t be done through a PowerShell script?)

The script below creates a view called “TestView”.  It expects three command-line arguments:  site collection URL, the name of the view to create, and the list GUID.  The view that’s created is an exact replica of the “All Items” view (you can certainly modify the code as needed).  Here’s how you would call this script from the command line:


powershell  CreateView.ps1 "your_site_collection_URL" "TestView" "List GUID 6865306f-60e0-4889-addd-4fb9862e72e0"

Script code (use the button in the top right corner to copy it to the clipboard):


[System.Reflection.Assembly]::Load("Microsoft.SharePoint, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c") | out-null

# reading command line arguments

$siteURL = $args[0]

$strViewName = $args[1]

$ListGUID = $args[2]

# enter your CAML query for the view here...

$strQuery = "<Where><Gt><FieldRef Name='ID'/><Value Type='Counter'>0</Value></Gt></Where>"

 # create a new SPsite object and recursively go through all webs

# until a matching list GUID is found

$site=new-object Microsoft.SharePoint.SPSite($siteURL)

foreach ($web in $site.AllWebs)
{
 

foreach ($list in $web.Lists)
{

$ListTempGUID = $list.ID.ToString()
  

if ($ListTempGUID.Contains($ListGUID))
{

write-host "**********************************************"
write-host "Match found. Preparing to create a view: ", $strViewName
write-host "List Title: ", $list.Title
write-host "List GUID: ", $list.ID

$fields = $list.Views["All Items"].ViewFields.ToStringCollection()

$result = $list.Views.Add($strViewName, $fields, $strQuery, 100, $True, $False , "HTML", $False)

write-host "View ", $strViewName , " was created successfully."

break

}
}

} 

write-host "Done."

$site.Dispose(); ##ENFORCED DISPOSAL!!!

    

So far, so good?  Well, now that you’ve created a view, how do you delete it?  Follow the same logic, only instead of using the Add method of SPViewCollection object, we’ll be using the Delete method.

Same command line arguments as before:  site collection URL, name of the view, and list GUID.

Calling script from the command line:


powershell  DeleteView.ps1 "your_site_collection_URL" "TestView" "List GUID 6865346f-60e0-4889-addd-4fb3862572e0"

 


[System.Reflection.Assembly]::Load("Microsoft.SharePoint, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c") | out-null

# reading command line arguments...

$siteURL = $args[0]

$strViewName = $args[1]

$ListGUID = $args[2] 
# creating a new site object and recursively searching through its lists

# until a matching list GUID is found

$site=new-object Microsoft.SharePoint.SPSite($siteURL)

foreach ($web in $site.AllWebs)
{
 

foreach ($list in $web.Lists)
{

$ListTempGUID = $list.ID.ToString()
  

if ($ListTempGUID.Contains($ListGUID))
{
foreach ($view in $list.Views)
{

If ( $view.Title.Contains($strViewName))
{

write-host "**********************************************"
write-host "Match found. Preparing to DELETE a view: ", $view.Title
write-host "List Title: ", $list.Title
write-host "List GUID: ", $list.ID

# you can insert a pause here if you like...

$list.Views.Delete($view.ID)

write-host "View ", $view.Title , " has been deleted successfully."

break

}
}

break

}

}

}
write-host "Done."

$site.Dispose(); ##ENFORCED DISPOSAL!!! 
 

Finally,  how do you find out the GUID of your list?  It’s fairly straightforward – you just need to access the SPList.ID property of your list.  Here’s a simple script that will output the GUIDs of all lists in your site collection:


[System.Reflection.Assembly]::Load("Microsoft.SharePoint, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c") | out-null
# write column headings

write-host "List URL ; Web URL ; Web Title ; List Title; List GUID ;"

# create a site object and recursively list all of its list objects and their details
 $site=new-object Microsoft.SharePoint.SPSite("http://your_site_collection_URL)  

  foreach ($web in $site.AllWebs)
 {
  foreach ($list in $web.Lists)
 {
 write-host $list.DefaultViewURL, ";", $web.URL , ";",  $web.Title , ";" , $list.Title , ";" , $list.ID

 }

 }

$site.Dispose(); ##ENFORCED DISPOSAL!!!

Calling STSADM from within a PowerShell script

For various SharePoint admin tasks, there are times when you need to execute an STSADM command from within a PowerShell script. 

Before you can do that, you’ll need to tell PowerShell where to find STSADM executable. You can do that by adding the following line to your profile.ps1 file (usually located in C:\WINDOWS\system32\windowspowershell\v1.0 ):

Set-Alias -Name stsadm -Value $env:CommonProgramFiles”\Microsoft Shared\Web Server Extensions\12\BIN\STSADM.EXE”

Now you can use stsadm in your scripts and it should work beautifully…

Content Deployment error: Maximum request length exceeded.

Sometimes, when you run a Content Deployment job between a source farm and a destination farm, you may encounter the following issue:

“Content deployment job ‘Job Name’ failed. The remote upload Web request failed.”

When you look in the ULS logs, you may see the following:

File upload of ‘C:\Inetpub\wwwroot\SiteDirectory\ExportedFiles70.cab’ failed. Exception System.Web.HttpException: Maximum request length exceeded.  at System.Web.HttpRequest.GetEntireRawContent()     at System.Web.HttpRequest.get_InputStream()… 

OK, let’s do a web search to see how to fix this issue.  After some searching, you’ll come across posts that tell you to modify maxAllowedContentLength or MaxRequestLength attribute in the Central Administration web.config file (or maybe WFE’s too).  Examples: 

http://technet.microsoft.com/en-us/library/dd795107.aspx

http://weblogs.asp.net/hosamkamel/archive/2007/09/18/resolving-maximum-request-length-exceeded-exception.aspx

I’ve found that if you only modify web.config files as specified in the articles above, it will NOT solve the problem.  

 To solve this problem, you need to increase maxRequestLength value in three places on the TARGET farm:  

  1. Central Administration web.config file (typically located in C:\Inetpub\wwwroot\wss\VirtualDirectories\DirectoryName)
  2. Your web application main web.config file (typically located in C:\Inetpub\wwwroot\wss\VirtualDirectories\DirectoryName).
  3. Content deployment web.config file located in:

C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\12\TEMPLATE\ADMIN\Content Deployment

Note:  You can find out the correct paths for items 1 and 2 by opening IIS Manager.

Open web.config file located at each location and locate the maxRequestLength attribute.  Increase it to allow upload of the largest CAB file that you have.  The default setting limits the upload file size to 51200 KB for CA and web application and to 102400 KB for content deployment.

<configuration>
  <system.web>
    <httpRuntime maxRequestLength=”102400″ />
  </system.web>
</configuration>

You can find out how large the largest CAB file is by running the following command on the source farm Central Administration server:

stsadm -o editcontentdeploymentpath -pathname (pathname here) -keeptemporaryfiles Failure

 This setting will allow you to see the CAB files generated during the content deployment job (in the temp directory specified in the Content Deployment settings screen in Central Administration).

Modify web.config file to display detailed error messages

I was dealing with another one of those “helpful” SharePoint error messages today:

“An unexpected error has occurred.”

Nishant Rana’s blog post had the exact steps needed to get SharePoint to spit out the details:

http://nishantrana.wordpress.com/2009/03/24/%E2%80%9Can-unexpected-error-has-occurred%E2%80%9D-error-message-in-sharepoint/

I’m bookmarking this one!

Content Deployment resources

Find out who’s connected to Windows Server

Sometimes when you try to connect to a server using Remote Desktop (RDP), you might receive this error:

TooManyConnections

(“The terminal server has exceeded the maximum number of allowed connections.”)

This message means that there are at least 2 other active RDP sessions on the server (unless it’s a Terminal Services server, and that’s another story.).  Since you can’t log on, you can’t easily find out who else might be logged on.  One or both of these sessions may be inactive (someone logged in and forgot to log off), and if you’re working on a large team, it may be a hassle to find out who is connected.  Luckily, there’s a built-in tool in Windows Server which will tell you who is connected to your server:  qwinsta.

Here’s how to use it:

1. Log on to another server using an account that has administrative access to the server which is generating the error message.

2. Open command prompt and type in the following:

qwinsta /server:%SERVERNAME%  

where %SERVERNAME% is the name of your server.

More details about the syntax:    qwinsta /?

MS TechNet article:

http://technet.microsoft.com/en-us/library/cc731503(WS.10).aspx

Note:

Another method is to use query session command instead of qwinsta.  The syntax is exactly the same. 

You can also use Terminal Services Manager to connect to another server and see RDP sessions.

Testing access to SharePoint pages

Let’s say you have a long list of SharePoint pages that need to be tested to verify that they’re permissioned correctly.  One way to do it is to take a non-privileged account (end user) and attempt to connect to each of the URLs.  If the page is locked down, you’ll get a page titled “Access denied”; otherwise, the page will load normally.

I recently responded to a thread on SharePoint TechNet about a similar issue and ended up writing a PowerShell script to address it.

The script below will read a text file containing a list of URLs (make sure to modify the source file path with your own path), and then call a function for each URL.  This function will open a new instance of IE, navigate to the URL, wait for the page to load, and then grab the title of the page.  If the user doesn’t have access to the page, the page title will contain “Access denied”; otherwise, the page title will be returned.  Run this script under the credentials of one of your end users.  If you’re trying to open individual documents (Word, Excel, etc.), you may need to modify the script so that it launches correct application (and closes it when done).


# This script will read a text file containing a list of URLs and attempt to connect to each URL.  Successful connection will return the page's title; otherwise, the script will return Access denied error.

# OpenIE function starts here...
# This function launches a new instance of IE and then navigates to the specified URL

function OpenIE($url)
{

if ($url -notlike "http://*")
{

$url = "http://" + $url

}
$ie = new-object -com "InternetExplorer.Application"

$ie.Visible = $true

$ie.Navigate($url)

# wait for IE to load the page

While( $ie.Busy )
{
[System.Threading.Thread]::Sleep(100)
}

# grab page title - if access is denied, the page title will say so

$Title = $ie.Document.Title

$ie.Quit()

return $Title

}

 

# *** Main script routine starts here ***
# specify your source file path here...

$SourceFilePath = "C:\Shared\list.txt"

write-host "Starting script..."

# read the source file into an array of strings, iterate through each one

$list = Get-Content $SourceFilePath

foreach ($item in $list)
{

$result = OpenIE($item)

write-host $item, ";" , $result

}

write-host "Finished."

Maximum string length for SharePoint profile custom properties

Today I needed to create a custom property in SharePoint which would store some long strings.  So naturally, a question came up:  How long can a string be before SharePoint refuses to recognize it?  It appears that the limit is set at 2,000 characters.  When I tried setting the string field length to 2,000 characters and attempted to save the new property, SP would reset it back to the default value of 25.  However, it does accept 1,999 characters or less (see screenshot below). 

SomeCustomProperty

Presenting at the LexMUG October meeting

I presented at the Lexington Microsoft Users Group (www.lexmug.com) meeting today on the topic of functional differences between WSS 3.0 and MOSS 2007.

http://sharepointnomad.files.wordpress.com/2009/10/lexmug_oct2009_presentation-andregalitsky.ppt

Finding out where SharePoint email alias is used

Recently, a question came up in the SharePoint TechNet forums regarding document libraries with incoming email enabled.  If you only know the name of the AD contact for the library, how can you find out which document library or list it’s pointing to? 

Here’s a straightforward PowerShell script which will iterate through every site collection in every web application and return the names and email aliases of every list that has an active email alias specified.


[System.Reflection.Assembly]::Load("Microsoft.SharePoint, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c") | out-null

[void][System.reflection.Assembly]::LoadWithPartialName("Microsoft.SharePoint")
$oContentService = [Microsoft.Sharepoint.Administration.SPWebService]::ContentService;

[Microsoft.SharePoint.Administration.SPWebApplicationCollection]$waColl = $oContentService.webApplications;

$waColl1 = $waColl | where-object {$_.IsAdministrationWebApplication -eq $FALSE}
write-host "WebApplication; Site Collection; List Title; List URL; EmailAlias"

foreach ($wa in $waColl1)
{

$sites = $wa.Sites

foreach ($obj in $sites)

{

$spSite = new-object Microsoft.SharePoint.SPSite($obj.URL)

$colWebsites = $spSite.AllWebs

foreach ($web in $colWebsites)
{

 $colLists = $web.Lists
 
 foreach ($list in $colLists)
 {

 if ( $list.EmailAlias -ne $null )
 {

 write-host  $wa.Name, ";", $obj.URL, ";", $list.Title , ";", $list.DefaultViewUrl, ";",  $list.EmailAlias

 }

 }

}

}

}

write-host "Finished."

Next Page »


RSS Ben Curry’s Blog

  • I'm at the ATL users group Monday night, Nov 16th November 15, 2009
  • Upgrading to SharePoint Server 2010 November 3, 2009

RSS Bud Ratliff blog

  • An error has occurred; the feed is probably down. Try again later.

Blog Stats

  • 6,218 hits