Here's an easy one. My current project requires quite alot of automation. It's a migration but prior to migration I am rolling out over 100 sites of varied type, each type of site has it's own roll-out requirements such as web parts, lists, content types and so forth all being built, configured and deployed from powershell.
It's all publishing sites, so saving as a template is out of the question and building the custom site definitions in Visual Studio 2010 (although would be best practice) - was also ruled out during the planning phases. I'll explain why in some other post.
A common question, and perhaps limitation of SharePoint 2010 is the lack of site directories - you can't associate meta-data with a site or subsite like you can an item and so forth.
For this reason, we're using site property bags, on deployment we set the metadata for each site, then as my later scripts go round to make changes they can reference the site properties to add a little logic.
First, get the site properties.
$siteUrl = http://sharepointSite/subsite/targetSite
$web = Get-SpWeb $siteUrl
$web.properties
you will see some standard out of box properties like default language, a property for the custom upload page.
To add properties to the site property bag:
$siteUrl = http://sharepointSite/subsite/targetSite
$web = Get-SpWeb $siteUrl
$web.properties["customProperty1"]="propertyValue"
$web.properties["customProperty2"]="Another propperty value"
calling another $web.properties will show you your new properties,
you can reference them directly using $web.properties["customProperty1"].
Have Fun!
Ryan
SharePoint - .NET - Digital Photography and Drums
A blog about SharePoint, .NET, Digital art and drums.. Pretty much what it says on the tin.
Thursday, 23 February 2012
Thursday, 26 January 2012
Update a Content Query Web Part using Powershell
Here is a quick little script you can use to change the properties of a content query web part using powershell. I have a whole load of them to do post-deployment and i'm dynamically building the query to do so.
I am using SharePoint 2010 Publishing with a subsite called "news" being deployed with every site. On the home page of each site we have a styled content qeury web part which is being populated from the "news" subsite. I did an export of the content query web part (along with several others) and because i'm doing everything in powershell to automate the deployment, i figured i'd dynamically update the web parts after they have been deployed. That allows me a litttle more control later.
#Set the Site Url and find our publishing page.
$SiteUrl = http://sharepointsite.sharepoint/subsite
$WpWeb = Get-SPWeb $SiteUrl
$PageFolder = $WpWeb.GetFolder("pages")
$Page = $PageFolder.Files Where-Object { $_.Name -eq "default.aspx" }
#Check the page out
$Page.CheckOut()
#Find our web part - the one i'm looking for is "Latest News" and it's visible to all.
$AllWebParts = $WpWeb.GetWebPartCollection($page,"Shared")
$MyWebPart = $AllWebParts Where-Object { $_.Title -eq "Latest News” }
In my case, want to update the WebUrl property to point at my $SiteUrl+"/news" -
just type $MyWebPart if you want to see all of the available properties.
#Update the property. I want to ALWAYS point to the subsite of my current site
$MyWebPart.WebUrl = $siteurl+"/news"
$MyWebPart.ItemLimit = "5"
#Save changes to the web part it's self & Check in and publish -
$AllWebParts.SaveChanges($MyWebPart.StorageKey)
$Page.Update()
$Page.CheckIn("")
$Page.Publish("")
#Because its a publishing page - we'll approve it.
$pweb = [Microsoft.SharePoint.Publishing.PublishingWeb]::GetPublishingWeb($WpWeb)
$publishingPage = $pweb.GetPublishingPages() Where { $_.Name -eq "default.aspx"}
$publishingPage.ListItem.File.Approve("Page approved by ps")
#job done
$pweb.dispose()
$WpWeb.Dispose()
Right, thats all for today.
Have Fun!
I am using SharePoint 2010 Publishing with a subsite called "news" being deployed with every site. On the home page of each site we have a styled content qeury web part which is being populated from the "news" subsite. I did an export of the content query web part (along with several others) and because i'm doing everything in powershell to automate the deployment, i figured i'd dynamically update the web parts after they have been deployed. That allows me a litttle more control later.
#Set the Site Url and find our publishing page.
$SiteUrl = http://sharepointsite.sharepoint/subsite
$WpWeb = Get-SPWeb $SiteUrl
$PageFolder = $WpWeb.GetFolder("pages")
$Page = $PageFolder.Files Where-Object { $_.Name -eq "default.aspx" }
#Check the page out
$Page.CheckOut()
#Find our web part - the one i'm looking for is "Latest News" and it's visible to all.
$AllWebParts = $WpWeb.GetWebPartCollection($page,"Shared")
$MyWebPart = $AllWebParts Where-Object { $_.Title -eq "Latest News” }
In my case, want to update the WebUrl property to point at my $SiteUrl+"/news" -
just type $MyWebPart if you want to see all of the available properties.
#Update the property. I want to ALWAYS point to the subsite of my current site
$MyWebPart.WebUrl = $siteurl+"/news"
$MyWebPart.ItemLimit = "5"
#Save changes to the web part it's self & Check in and publish -
$AllWebParts.SaveChanges($MyWebPart.StorageKey)
$Page.Update()
$Page.CheckIn("")
$Page.Publish("")
#Because its a publishing page - we'll approve it.
$pweb = [Microsoft.SharePoint.Publishing.PublishingWeb]::GetPublishingWeb($WpWeb)
$publishingPage = $pweb.GetPublishingPages() Where { $_.Name -eq "default.aspx"}
$publishingPage.ListItem.File.Approve("Page approved by ps")
#job done
$pweb.dispose()
$WpWeb.Dispose()
Right, thats all for today.
Have Fun!
Thursday, 19 January 2012
Add a Publishing Page and Set it to Default Welcome Page with custom Page Layout (PowerShell)
As part of a rather extensive process, i am currently writing a site structure deployment script that gets around the problem of being unable to deploy Publishing Sites from a template.
Instead, I've built my publishing site templates in a dev environment, exported the pages to XML, and using that xml, I am deploying brand new sites from the out of box Publishing template, and carefully reconstructing each site to match my template. I am doing this via powershell (of course) and using an excel sheet with all of the site types pre-defined.
A big issue I had was applying a custom page layout to the default.aspx page produced by the out of box template - I decided that this wasn't best practice and instead - I create a "Home.aspx" file, set it as default welcome page and apply my custom page layout.
As a taster, here's how I am creating the new pages, applying the custom page layout and setting them as default, welcome page BEFORE importing all of the default site content, and most importantly, the page content.
function CreatePages([string]$SiteUrl, [string]$PageLayoutName)
{
$site = New-Object Microsoft.SharePoint.SPSite($SiteUrl)
$psite = New-Object Microsoft.SharePoint.Publishing.PublishingSite($site)
$web = Get-SPWeb $SiteUrl
$pubWeb = [Microsoft.SharePoint.Publishing.PublishingWeb]::GetPublishingWeb($web)
#Create new Page(s)
$pl = $pubWeb.GetAvailablePageLayouts() Where { $_.Name -eq $PageLayoutName }
$newHomePage = $pubWeb.AddPublishingPage("home.aspx", $pl)
$newHomePage.Update()
# Check-in and publish page
$newHomePage.CheckIn("")
$newHomePage.ListItem.File.Publish("")
$newAboutPage = $pubWeb.AddPublishingPage("about-us.aspx", $pl)
$newAboutPage.Update()
# Check-in and publish page
$newAboutPage.CheckIn("")
$newAboutPage.ListItem.File.Publish("")
write-host "Published new page "
#Set new page to be the welcome (home page)
$assignment = Start-SPAssignment
$rootFolder = $web.RootFolder
$rootFolder.WelcomePage = "Pages/home.aspx"
$rootFolder.Update()
Stop-SPAssignment $assignment
write-host "Set as new default "
$site.Dispose()
$web.Dispose()
}
As you can see, I'm passing in just the "NAME" of the page layout, using [Microsoft.SharePoint.Publishing.PublishingWeb.GetAvailablePageLayouts() and a filter to bring back JUST that page layout.
Here we create the new page and apply the page layout.
$newHomePage = $pubWeb.AddPublishingPage("home.aspx", $pl)
$newHomePage.Update()
At some point, I will do a break down of the entire script. It does quite alot and is a pretty good alternative to a custom site defination. Although - given more time and resource, a custom site definition is the best way to solve this problem.
Have fun!
Ryan
Instead, I've built my publishing site templates in a dev environment, exported the pages to XML, and using that xml, I am deploying brand new sites from the out of box Publishing template, and carefully reconstructing each site to match my template. I am doing this via powershell (of course) and using an excel sheet with all of the site types pre-defined.
A big issue I had was applying a custom page layout to the default.aspx page produced by the out of box template - I decided that this wasn't best practice and instead - I create a "Home.aspx" file, set it as default welcome page and apply my custom page layout.
As a taster, here's how I am creating the new pages, applying the custom page layout and setting them as default, welcome page BEFORE importing all of the default site content, and most importantly, the page content.
function CreatePages([string]$SiteUrl, [string]$PageLayoutName)
{
$site = New-Object Microsoft.SharePoint.SPSite($SiteUrl)
$psite = New-Object Microsoft.SharePoint.Publishing.PublishingSite($site)
$web = Get-SPWeb $SiteUrl
$pubWeb = [Microsoft.SharePoint.Publishing.PublishingWeb]::GetPublishingWeb($web)
#Create new Page(s)
$pl = $pubWeb.GetAvailablePageLayouts() Where { $_.Name -eq $PageLayoutName }
$newHomePage = $pubWeb.AddPublishingPage("home.aspx", $pl)
$newHomePage.Update()
# Check-in and publish page
$newHomePage.CheckIn("")
$newHomePage.ListItem.File.Publish("")
$newAboutPage = $pubWeb.AddPublishingPage("about-us.aspx", $pl)
$newAboutPage.Update()
# Check-in and publish page
$newAboutPage.CheckIn("")
$newAboutPage.ListItem.File.Publish("")
write-host "Published new page "
#Set new page to be the welcome (home page)
$assignment = Start-SPAssignment
$rootFolder = $web.RootFolder
$rootFolder.WelcomePage = "Pages/home.aspx"
$rootFolder.Update()
Stop-SPAssignment $assignment
write-host "Set as new default "
$site.Dispose()
$web.Dispose()
}
As you can see, I'm passing in just the "NAME" of the page layout, using [Microsoft.SharePoint.Publishing.PublishingWeb.GetAvailablePageLayouts() and a filter to bring back JUST that page layout.
Here we create the new page and apply the page layout.
$newHomePage = $pubWeb.AddPublishingPage("home.aspx", $pl)
$newHomePage.Update()
At some point, I will do a break down of the entire script. It does quite alot and is a pretty good alternative to a custom site defination. Although - given more time and resource, a custom site definition is the best way to solve this problem.
Have fun!
Ryan
Tuesday, 10 January 2012
3 Ways to Save SharePoint 2010 Publishing Sites as a Template
Well first post of 2012 - last year was a fantastic year filled with all sorts of juicy SharePoint solutions. I have a few blog posts in Draft that I am looking forward to publishing about powershell, DPM and Property Bags, but for now heres a wee easy one that might save you some time!
I'm currently tasked with packaging a series of 2010 publishing sites, the challenge in doing so is not only that it's "not supported by Microsoft" but publishing makes it exceedingly difficult.
All of our sites for this particular part of the project are publishing sites and have all been pre-created on a lab. The requirement is that following the standard new-site creation practice, a fully customised publishing site (with subsites!) is deployed from site template.
To do this, I saved the top level Publishing Site as a template, imported it into Visual Studio 2010 and added the subsites etc. More about this later.
I discovered that you can't save a site as a template once publishing features are enabled. I found 3 ways of getting round this but be warned, it's not supported by MS. Infact, it's claimed that publishing sites saved as templates and redeployed won't upgrade later.
Anyways, first thing you can do is go to your site http://sharepoint.net/MyPublishingSite
you'll notice that "Save Site as Template" is missing from site actions. Here is 3 ways in which you can do this.
1. Go straight to the save template page
just add "/_layouts/savetmpl.aspx" to your url.
http://sharepoint.net/MyPublishingSite/_layouts/savetmpl.aspx
This will let you save "MyPublishingSite" as a template.
If you really want to knock SharePoint out of support (it's ok for labs or dev machines) –
2. Edit the PublishingSiteSettings.xml file in the hive.
C:\PROGRAM FILES\COMMON FILES\MICROSOFT SHARED\WEB SERVER EXTENSIONS\12\TEMPLATE\FEATURES\PUBLISHING
Open PublishingSiteSettings.xml in notepad.
At the bottom there’s a tag for HIDECUSTOMACTION.
Comment it out like so:
<!--<HideCustomAction Id="HideSaveAsTemplate" HideActionId=”SaveAsTemplate" GroupId="Customization" Location="Microsoft.SharePoint.SiteSettings" /> -->
Then add the custom action for saving as template:
<CustomAction Id="SaveAsTemplate" GroupId="Customization" Location="Microsoft.SharePoint.SiteSettings" Rights="AddAndCustomizePages,BrowseDirectories,ManagePermissions,ManageSubwebs,ManageWeb,UseRemoteAPIs,ViewFormPages" Sequence="60" Title="$Resources:SiteSettings_SaveAsTemplate_Title;"> <UrlAction Url="_layouts/savetmpl.aspx" /> </CustomAction>
3. Use PowerShell
$Web=Get-SPWeb http://sharepoint.net/MyPublishingSite
$Web.SaveAsTemplate(“Template Name”,”Template Title”,”Template Description”,1)
That’s it, have fun!
I'm currently tasked with packaging a series of 2010 publishing sites, the challenge in doing so is not only that it's "not supported by Microsoft" but publishing makes it exceedingly difficult.
All of our sites for this particular part of the project are publishing sites and have all been pre-created on a lab. The requirement is that following the standard new-site creation practice, a fully customised publishing site (with subsites!) is deployed from site template.
To do this, I saved the top level Publishing Site as a template, imported it into Visual Studio 2010 and added the subsites etc. More about this later.
I discovered that you can't save a site as a template once publishing features are enabled. I found 3 ways of getting round this but be warned, it's not supported by MS. Infact, it's claimed that publishing sites saved as templates and redeployed won't upgrade later.
Anyways, first thing you can do is go to your site http://sharepoint.net/MyPublishingSite
you'll notice that "Save Site as Template" is missing from site actions. Here is 3 ways in which you can do this.
1. Go straight to the save template page
just add "/_layouts/savetmpl.aspx" to your url.
http://sharepoint.net/MyPublishingSite/_layouts/savetmpl.aspx
This will let you save "MyPublishingSite" as a template.
If you really want to knock SharePoint out of support (it's ok for labs or dev machines) –
2. Edit the PublishingSiteSettings.xml file in the hive.
C:\PROGRAM FILES\COMMON FILES\MICROSOFT SHARED\WEB SERVER EXTENSIONS\12\TEMPLATE\FEATURES\PUBLISHING
Open PublishingSiteSettings.xml in notepad.
At the bottom there’s a tag for HIDECUSTOMACTION.
Comment it out like so:
<!--<HideCustomAction Id="HideSaveAsTemplate" HideActionId=”SaveAsTemplate" GroupId="Customization" Location="Microsoft.SharePoint.SiteSettings" /> -->
Then add the custom action for saving as template:
<CustomAction Id="SaveAsTemplate" GroupId="Customization" Location="Microsoft.SharePoint.SiteSettings" Rights="AddAndCustomizePages,BrowseDirectories,ManagePermissions,ManageSubwebs,ManageWeb,UseRemoteAPIs,ViewFormPages" Sequence="60" Title="$Resources:SiteSettings_SaveAsTemplate_Title;"> <UrlAction Url="_layouts/savetmpl.aspx" /> </CustomAction>
3. Use PowerShell
$Web=Get-SPWeb http://sharepoint.net/MyPublishingSite
$Web.SaveAsTemplate(“Template Name”,”Template Title”,”Template Description”,1)
That’s it, have fun!
Labels:
as,
moss2007 template,
powershell,
publishing,
save,
Sharepoint 2010,
site,
site template,
stp,
stsadm,
wsp
Friday, 4 November 2011
SharePoint and DPM Protection
Been tasked with setting up and configuring DPM (Microsoft Data Protection Manager 2010) to provide disaster recovery and granular backups to a domain of development servers.
The domain its self has everything, domain controllers, exchange, sql cluser(s), sharepoint 2007 multi server farms, sharepoint 2010 multi server farms and plenty of single server instances to worry about. The domain is a virtualised domain with some impressive tin and plenty of resources so its used globably by the company i work for.
I've been using my increasing powershell kung fu to automate and batch most of the process but before I write some posts about what i'm doing and how - on a farm this big I needed to make sure I knew the basics of DPM and specifically doing it for Sharepoint.
I found a fantastic post that helps me do just that and wanted to share.
http://scug.be/blogs/scdpm/archive/2010/03/11/sharepoint-2010-protection-in-dpm-2010-part-1.aspx
Have fun!
The domain its self has everything, domain controllers, exchange, sql cluser(s), sharepoint 2007 multi server farms, sharepoint 2010 multi server farms and plenty of single server instances to worry about. The domain is a virtualised domain with some impressive tin and plenty of resources so its used globably by the company i work for.
I've been using my increasing powershell kung fu to automate and batch most of the process but before I write some posts about what i'm doing and how - on a farm this big I needed to make sure I knew the basics of DPM and specifically doing it for Sharepoint.
I found a fantastic post that helps me do just that and wanted to share.
http://scug.be/blogs/scdpm/archive/2010/03/11/sharepoint-2010-protection-in-dpm-2010-part-1.aspx
Have fun!
Wednesday, 26 October 2011
Update SharePoint User Profile for all users in a Active Directory Distribution List
Putting my 2010 project work aside, I was asked to programmatically update each users "User Profile" that was a member of a group (Distribution List) in active directory. In my case, I had to create a custom user profile property called "location". I then had to map each person from their DL in AD to a location in their user profile.
So if I am based in "Glasgow" and I am in the Active Directory Group "Scotland_All" - they wanted some code to update my user profile property, on a mass scale (12,000 users)..
I did some googling before i set about the task but didn't find very much so figured i'd post a quick how-to.
First I went through active directory to get all users that were a member of X group.
I had to use an account and password with access to AD.
Once have the users details, I start updating their user profile. This is done using the object model so the console app was run locally. It can be done via web services but with so many users and transactions I found that simelar tasks would time out..
Works very nicely. Hope someone out there finds it useful.
So if I am based in "Glasgow" and I am in the Active Directory Group "Scotland_All" - they wanted some code to update my user profile property, on a mass scale (12,000 users)..
I did some googling before i set about the task but didn't find very much so figured i'd post a quick how-to.
First I went through active directory to get all users that were a member of X group.
const string ADaddress = "domain.com";const string ADuserName = @"domain\admin";const string ADPassword = "DomainAdminPassword";const string ad_group = "Xgroup";const string domain_name = "Domain"; //not entirely neededconst string sp_site = "http://yourSharePointSite.domain.com";const string location_value = "Value";
I had to use an account and password with access to AD.
try{//Create connection to AD and get all users in specified groupPrincipalContext ctx = new PrincipalContext(ContextType.Domain,ADaddress,ADuserName,ADPassword);//Search for members in groupGroupPrincipal group = GroupPrincipal.FindByIdentity(ctx, ad_group); //CL_France being the DL we needPrincipalSearchResultmembers = group.GetMembers(); //getting them all //Get the user names and add the domain (we are assuming that all these users will be "s7")foreach (Principal member in members){string domainUserName = domain_name + @"\" + member.SamAccountName;//Update in SharepointUpdatespProfile(domainUserName);}}catch (Exception ex){Console.WriteLine(ex); //show me the errorConsole.Read(); //pause}}
Once have the users details, I start updating their user profile. This is done using the object model so the console app was run locally. It can be done via web services but with so many users and transactions I found that simelar tasks would time out..
//take user names, check they have a user profile - if they do, update "localtion" fieldstatic void UpdatespProfile(string uName){//show user in consoleConsole.WriteLine(uName);//member.SamAccountName);try{using (SPSite site = new SPSite(sp_site)){//Connect to user manager and pass in user nameUserProfileManager profileManager = new UserProfileManager(ServerContext.GetContext(site));UserProfile userProfile = profileManager.GetUserProfile(uName);//check if we have a valid user profileif (userProfile != null){//Update location fielduserProfile["Location"].Value = location_value;//update the user profileuserProfile.Commit();//show it worked in consoleConsole.WriteLine("Updated Location to" +" " + location_value);}else{//show we didn't have a valid user profile in consoleConsole.WriteLine("No user profile");}}}catch (Exception ex){//show the errorConsole.WriteLine(ex);//pauseConsole.Read();}}
Works very nicely. Hope someone out there finds it useful.
Thursday, 25 August 2011
Upcoming Posts
Having started a new contract last month working predominately on the infrastructure, administration and consultancy side of SharePoint I am missing development a little but in the meantime getting my hands very dirty with some work i'll be blogging in the near future.
I have been particularly working with Powershell, Hyper-V and SharePoint.
Recently I designed and implemented a full new Development lab infrastructure which allows new stand-alone SharePoint 2010 servers to be deployed in Hyper-V with almost 0 configuration from the deployment agent.
In otherwords, I have scripted and automated the entire process using Poweshell with the following processes automated:
- New Virtual Machine created from clone of base server
- New virtual machine configured
- Powershell scripted configuration of the operating system installation
- powershell scripted configuration of networking, renaming the machine, joining the domain
- Powershell scripted configuration of a Sql server 2008 pre-deployment image
- Powershell scripted installation of SharePoint 2010
- Powershell scripted configuration of SharePoint 2010 configuration database and new farm
- powershell scripted deployment of new SharePoint 2010 farm
- powershell scripted deployment of web applications and site collections
- powershell scripted configuration of SSP
- Powershell scripted configuration of search services
- powershell scripted server security configs, terminal services and so forth
- powershell scripted assignment of Alternate access mappings to allow remote access
Basically a fully functioning development lab, fully scripted and deployed in less than 1 hour with no manual overhead for the user other than initiation the process.
I hope to blog most of the process, in particular the scripts them selves and while many other people have deployed similar scripts, the dynamic nature of this type of deployment means they can be re-used in many scenarios.
Subscribe to:
Posts (Atom)