1 0 Tag Archives: SharePoint
post icon

What tools to install on a SharePoint 2010 developer box

I’ve built out SharePoint development environments many times but I’ve never really sat down and made a list of the tools I use before.   A good friend emailed me today and asked what tools I have on my SharePoint development box and it prompted me to put a list together.   I thought I’d share what tools fit into my day to day usage.

First a bit about the infrastructure and topology of my development environment.   I’ve got a dedicated VMWare ESXi 5.0 box in my basement with an i7-920, 24GB of ram, and 4x2TB hard drives in Raid 1+0.  I’m using an Adaptec hardware raid controller all inside of  a Super Micro tower.

With that box I’m able to run quite a number of virtual machines for a lot of different tasks beyond SharePoint development.   I’ve got a combination of Linux and Windows servers and clients setup for building and testing various applications.   A couple boxes are mainstays however and provide resources that are shared across the rest.   These are my domain controller and SQL box.   Both are running server 2008R2.   The SQL box has multiple SQL instances on it (2008R2 and 2012).   I have a couple of different SharePoint VMs and fire them up depending on what I’m working on.

When setting up the development box I always turn to AutoSPInstaller to actually install the SharePoint bits.   It automates the process and makes it repeatable.   It can handle installing the prequisites, configuring the farm, configuring service applications, creating web applications, creating site applications, etc.   It is really very powerful and saves a ton of time in setting up a new environment.   You can get it at http://autospinstaller.codeplex.com/.

 

For my primary 2010 development box I also have the following tools installed:

And while I hesitate to admit it given how much I hate the headache it can cause, I do also use SharePoint Designer from time to time.   While I’m a firm believer that you shouldn’t do SharePoint customizations with it (everything should be done via Visual Studio and packaged into a WSP) the truth is that SharePoint Designer is really good for working on masterpages.   If you’re doing branding work then I’d recommend it be included into your tool arsenal.

Leave a Comment
post icon

Comparing Office 365 and Google Apps

I’ve used Google Apps for many years given that it is a reliable way for me to host my personal email for free.   I own my own domain (obviously) and I enjoy having the address jason@vallery.net.    Since the surname Vallery isn’t terribly common I’ve also had the occasion to setup email addresses for close and distant family members who wanted the novelty of name@vallery.net.    With the free version of Google Apps you can create up to 10 accounts which was more than enough for my limited needs.

Given my role in technology I’ve also had the occasion to help friends and family with their own personal web needs.  Over the last few years I’ve helped several folks get off the ground with a basic website and email on their own domain for either personal or small business use.   Every single time I’ve turned to Google Apps as the solution for them to host their email, calendar, etc.

Now that Office 365 has been available for a while I decided to evaluate both my own usage of Google Apps as well as what tool I’m recommended to people who ask me.   What I’ve found has redefined the problem a bit and changed the way I approach the answer.

For my own use I migrated my domain over to Office 365 last fall (around November 2011 I think).   I was pleased with the tools that Microsoft offered to accomplish this.   It was a pretty simple task for me to import the users, migrate their email, and then send them their new login credentials.   I had a little bit of effort in walking the family members through configuring Outlook and/or their Phones but it generally went well.

There were a few things that I immediately noticed were missing however:

  • No custom CNAME for the login page.   Everyone had got used to logging in at https://mail.vallery.net/.   Now I have to have them go to https://portal.microsoftonline.com?   What is that about?   It would have made the transition quite a bit simpler if I could have just remapped the CNAME so the URL wouldn’t have changed for the users.

 

  • DNS management is tricky.   Microsoft has the expectation that I’m going to just hand them over my domain and use their DNS servers.   No way Microsoft!!   I use my domain for a lot more than email and instant messaging.   I’ve got a number of complex records that need to be maintained.  I want the ability to dynamically update those records via an API.   That is why I turned to paying for the premium service from dyndns.org to host my DNS.   With the limited capability that Microsoft is offering for DNS management there was no way I was going to switch to their name server.   As a result I had to “trick” their system by looking up all of the records that they would have inserted on my zone had they been hosting it and then create them on dyndns.org’s server.   This wasn’t a big deal but shortly after I setup my account those records changed and my service stopped working.   I had to go and repeat the process.   I understand why from a stability perspective Microsoft wants to be able to handle the DNS for the domain but that just isn’t practical until their tools are as robust as other offerings.

 

  • Of course the biggest difference is cost.   For free with Google Apps you get 10 mailboxes, calendar, cloud storage for documents, instant messaging,  SAML claims support (ADFS),  and a marketplace full of additional capabilities.  For free from Microsoft you get….  nothing.    The cheapest Office 365 plan is $4/month/user and that only gets you exchange.   For $6/month/user you can include Lync and a SharePoint site collection.   You still don’t get full enterprise features like sync with AD, true SharePoint (mysites, multiple site collections, etc).   That doesn’t kick in until you get up the E1 plan.  Current Office 365 pricing and plans: www.microsoft.com/en-us/office365/compare-plans.aspx

 

So what does that mean?   For someone like my cousin who has a classic car restoration business (http://chclassics.com) it would make no sense for him to pay $6/month/user for email.   He has five employees and only two of those actually use email.   With Google Apps he can get free hosting for his email and calendar and it meets 100% of his needs for free.   I can’t help but recommend that he go that route.

For someone like myself who lives in his email it makes more sense for me to go Office 365.   I mentioned the things that Office 365 was missing above but I didn’t mention what it brings.   This is exchange.   The most powerful mail server that has ever existed.   I get to push my email down to Outlook.  No more IMAP.   I get 25GB of storage to archive and search my old messages.   I get a SharePoint site for hosting my family’s documents.   I have a shared One Note with my wife with all kinds of stuff in it (tasks, shopping list, recipes, finances, etc).

So – if you’re a small business with a technical savvy audience that can appreciate the real value that having a true exchange/SharePoint based solution can bring then obviously Office 365 is the way to go.   If you need the very basic functionality and are watching your expenses very closely than I’d say stick with Google Apps.   For me the $6/month/user I’m paying is a small price to pay for the functionality that I get.   I will certainly continue to recommend Google Apps though for people like my cousin who just want to get their email.

Obviously neither Google or Microsoft are making their money off customers like myself or my cousin.   That isn’t the market that either of them are after.   The under 10 user customer isn’t even on the Microsoft radar.   I think from a public relations perspective though it would benefit Microsoft to consider introducing a plan that would directly compete with the free Google Apps plan.  Who knows…  maybe some day my cousins 5 person business will turn into a 50 person business?  Wouldn’t it be easier for him to continue using Google Apps then switch to Office365 at that point?

Leave a Comment
post icon

Using powershell to set SSP profile properties

I recently put together a powershell script that can be used to update a profile property of all of the users stored in the SharePoint SSP.  At NewsGator we use a boolean property field to indicate if a particular part of our product has been activated or not.  There are some cases where this boolean flag needs to be reset for all users. To do this I put together a simple powershell script to reset this value for all users.

This could easily be adapted for other users so I thought I would post share it.

###########################
# "Configure Settings"
$SSPName = "SSPAdmin"
$MySiteUrl = "http://mysite/"
$propName = "newsgator-x-onboarded"
$propValue = "true"
###########################

#Load the SharePoint assemblies
[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.Office.Server")
[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.Office.Server.UserProfiles")

$ServerContext = [Microsoft.Office.Server.ServerContext]::GetContext($SSPName);
$UPManager = new-object Microsoft.Office.Server.UserProfiles.UserProfileManager($ServerContext);
$enumProfiles = $UPManager.GetEnumerator();
"Total User Profiles available:" + $UPManager.Count
$count=0;

#Loop through the SSP entries and update the property
foreach ($oUser in $enumProfiles)
{
    $count = $count + 1;
    $u = $oUser.Item("Accountname");
    Write-Output "($count):  Setting '$propName' to '$propValue' for $u";
    $oUser[$propName].Value = $propValue;
    $oUser.Commit();
} 


Leave a Comment
post icon

Activating features in bulk on the MySite with PowerShell

I recently came across a client who needed to activate a couple of features on their MySites in batches.   Given that they have a significant number of MySites already created we needed to find a way to stage the deployment of the new functionality that the features offer.   I put together a PowerShell script that iterates through the SSP looking for users who:

  • Have a MySite
  • Either one of both of the required features are not currently active

For each of the users that match the above criteria both of the features are activated. A counter is incremented and once we reach the desired number of users for the batch the script exits. When we are ready to process another batch the script effectively picks up where it left off since we’re skipping the users who are already activated.

You could then have the execution of this script automatically executed on a regular basis during low utilization hours. Eventually everyone will have the features activated and the new functionality deployed. You could continue to let the script execute to catch any new users (if you decide not to staple the features like we are).

For others looking to do something similar I’m posting the original script in its entirety.


###########################
# "Configure Settings"
$SSPName = "SSPAdmin"
$mysiteurl = "http://mysite"
$ngsite_feature_id = "6a91335c-5ecc-4afc-aa68-14d73afbb1bc"
$webpart_feature_id = "5174F049-99D9-4d68-96E0-93AB2AE1C7BC"
$userCount = 500
$stsadm = "$env:programfiles\Common Files\Microsoft Shared\Web Server Extensions\12\BIN\STSADM.EXE"
###########################

#Load the SharePoint Assemblies
[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.Office.Server")
[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.Office.Server.UserProfiles")

#Create the SSP objects
$ServerContext = [Microsoft.Office.Server.ServerContext]::GetContext($SSPName);
$UPManager = new-object Microsoft.Office.Server.UserProfiles.UserProfileManager($ServerContext);

$enumProfiles = $UPManager.GetEnumerator();
"Total User Profiles available:" + $UPManager.Count
$count=0;

#Loop through every user who has an entry in the SSP
foreach ($oUser in $enumProfiles)
{
    #Get the username for the user
    $u = $oUser.Item("Accountname")

    #How many have we activated?  If more than $userCount above stop processing
    if ($count -ge $userCount) {
        Write-Output "Okay, we're stopping for now because we've activated for $userCount MySites"
        break
    } else {

    #Does the user have a MySite?  If so continue
    if ($oUser['PersonalSpace'].Value -ne $null) {
        #Create an SPSite (Site Collection) and SPWeb (Web) object for the given users MySite
        $siteurl = $mysiteurl + $oUser['PersonalSpace'].Value
        $spSite = new-object Microsoft.SharePoint.SPSite($siteurl)
        $spWeb = $spSite.OpenWeb() 

        #Let's check to see if either of the features we want to activate are currently activated.  
        #If not we should activate them.   Remember that the NewsGator Site Feature is "site" scoped thus we use SPWeb
        #The web part feature is Site Collection scoped so we have to use SPSite
        if (($spWeb.Features[$ngsite_feature_id] -eq $null) -or ($spSite.Features[$webpart_feature_id] -eq $null)) {

            #Execute STSADM -o activatefeature to activate the NewsGator Site Feature for this user, if it fails capture that and stop execution of the program.
            $sResult = &stsadm -o activatefeature -id $ngsite_feature_id -force -url  $siteurl
            if(!($sResult -like "*Operation completed successfully*")){
                Write-Host -ForegroundColor "red" -BackgroundColor "white" "Activate of site upgrade feature failed for $u on $siteurl : `n $sResult"
                break
            }

            #Execute STSADM -o activatefeature to activate the Webpart deployment feature, if it fails capture that and stop execution
            $sResult = &stsadm -o activatefeature -id $webpart_feature_id -force -url  $siteurl
            if(!($sResult -like "*Operation completed successfully*")){
                Write-Host -ForegroundColor "red" -BackgroundColor "white" "Activate of mysite web parts feature failed for $u on $siteurl : `n $sResult"
                break
            }

            #increment the count and output a status
            $count = $count + 1;
            Write-Output "($count):  Features activated on $siteurl for $u succesfully";
        } else {
            Write-Output "Skipping $siteurl for $u as they are already active."
        }
    } else {
        Write-Output "Skipping $siteurl for $u as they do not have a MySite."
    }

    #Clean up our objects to prevent a memory leak
    $spWeb.Dispose();
    $spSite.Dispose();
    $siteurl = $null;
    }
} 

Leave a Comment