<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>michael greene</title>
	<atom:link href="http://mike-greene.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://mike-greene.com</link>
	<description>inner ramblings of a helpless mind</description>
	<lastBuildDate>Fri, 18 May 2012 00:28:21 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>End-To-End SharePoint 2010 User Profile Photos &amp; AD</title>
		<link>http://mike-greene.com/2012/05/end-to-end-sharepoint-2010-user-profile-photos/</link>
		<comments>http://mike-greene.com/2012/05/end-to-end-sharepoint-2010-user-profile-photos/#comments</comments>
		<pubDate>Fri, 18 May 2012 00:28:21 +0000</pubDate>
		<dc:creator>michael greene</dc:creator>
				<category><![CDATA[Technology]]></category>
		<category><![CDATA[PowerShell]]></category>
		<category><![CDATA[SharePoint]]></category>
		<category><![CDATA[Social Media]]></category>
		<category><![CDATA[User Profile Services]]></category>

		<guid isPermaLink="false">http://mike-greene.com/?p=1572</guid>
		<description><![CDATA[During a recent WSS3 to SharePoint Server 2010 upgrade, the need arose to move roughly 600 user photos into Active Directory and implement user profile photos for SharePoint. While user photos existed, they were stored in a SharePoint library which would be sunset following the build of the new 2010 environment. Additionally, the user photos [...]]]></description>
			<content:encoded><![CDATA[<p>During a recent WSS3 to SharePoint Server 2010 upgrade, the need arose to move roughly 600 user photos into Active Directory and implement user profile photos for SharePoint. While user photos existed, they were stored in a SharePoint library which would be sunset following the build of the new 2010 environment. Additionally, the user photos needed to be available for a custom web part solution highlighting employee birthdays and anniversaries. Initially, thoughts were to follow the old model and store the photos in a picture library, but with the organization&#8217;s IT strategy and upcoming deployment of Lync 2010, using Active Directory as the central repository for photos made the most sense.</p>
<p><strong>Step 1: Getting Photos into Active Directory</strong></p>
<p>There&#8217;s a ton of blog posts and articles available on how to use PowerShell and Exchange tools to import photos into Active Directory. Normally I&#8217;m the first person to jump on the PowerShell bandwagon, but in this instance there are a few constraints. Pushing thumbnails to AD with this method requires your images to be less than 10kb in size, and a fixed size of 96 x 96px. If you intend to reuse these images outside of Exchange or Lync, you likely want a higher quality of image. You certainly don&#8217;t want to be using unedited photos right out of a digital camera, but something more along the lines of a 300px image is going to give you greater quality and reuse.</p>
<p>Due (primarily) to this constraint, we opted to use a third party tool that gave a little more control over the image format and size, while still offering a bulk load ability. We grabbed the trial version of <a href="http://cjwdev.co.uk/Software/ADPhotoEdit/Info.html" title="AD Photo Edit" target="_blank">AD Photo Edit</a> from Chris Wright, and put it through it&#8217;s paces. The trial lets you execute just 5 users at a time, but once we validated it would do what we wanted we purchased a copy of the full version. At just $49, it&#8217;s significantly cheaper than the manual effort of doing this one at a time for 600 users. This particular tool had the ability to specify the naming format of our photos, so we could point it to the folder of 600 photos and it would automatically reconcile to the correct AD user and import the photo. Once you confirm that your photo names conform to a naming convention that matches an AD property, you&#8217;re off to the races.</p>
<p><img src="http://mike-greene.com/wp-content/uploads/2012/05/ADPhotoEdit.png" alt="" title="ADPhotoEdit" width="540" height="463" class="alignnone size-full wp-image-1593" /></p>
<p><strong>Step 2: Mapping the AD Photo into SharePoint 2010</strong></p>
<p>Once you&#8217;ve pushed all of your photos into Active Directory, you must tell SharePoint they are there. By default, SharePoint will not just grab the photos from AD. Head into Central Administration and navigate to your User Profile Service Application. From the main UPS screen, pick &#8220;Manage User Properties&#8221; and edit the &#8220;Picture&#8221; property. Set the &#8220;Edit Settings&#8221; radio button to not allow users to change their photos, ensure that your &#8220;Source Data Connection&#8221; is set to your Active Directory UPS connection, set the &#8220;Attribute&#8221; to &#8220;thumbnailPhoto&#8221; and the &#8220;Direction&#8221; to &#8220;Import&#8221;. Finally, click &#8220;Add&#8221;, then &#8220;OK&#8221;.</p>
<p><img src="http://mike-greene.com/wp-content/uploads/2012/05/UPSPictureProperty.png" alt="" title="UPSPictureProperty" width="540" height="208" class="alignnone size-full wp-image-1596" /></p>
<p>Since UPS didn&#8217;t know about this field previously, we must now perform a synchronization and allow UPS to fetch the data for this newly mapped field. From your User Profile Service Application, click &#8220;Start Profile Synchronization&#8221;, select a full synchronization, then click &#8220;OK&#8221;. This first synchronization since the field was mapped must be done as a full sync because that field previously was un-mapped. During an incremental synchronization, UPS will update the values for all mapped fields, but it will not look for new ones. Once a full sync completes, incremental will be sufficient for future updating of the individual account details.</p>
<p><img src="http://mike-greene.com/wp-content/uploads/2012/05/UPSFullSync.png" alt="" title="UPSFullSync" width="540" height="94" class="alignnone size-full wp-image-1597" /></p>
<p>If you think back to step one, you&#8217;ll remember that we chose this method because wanted a better quality of photo than a 10kb 96px image. As SharePoint will be looking for a specific size to use in thumbnails and user profile pages, we must now tell SharePoint to generate the appropriate sized images from the original in Active Directory. Before you can perform this task, ensure that the user you&#8217;re logged in to the SharePoint server with has &#8220;Full Control&#8221; on the User Profile Service Application. From the main &#8220;Manage Service Applications Screen&#8221;, select the User Profile Service Application, and then click &#8220;Administrators&#8221;. Confirm that the account you&#8217;re logged in as has the &#8220;Full Control&#8221; role, and if not add it now.</p>
<p><img src="http://mike-greene.com/wp-content/uploads/2012/05/UPSAdmins.png" alt="" title="UPSAdmins" width="540" height="508" class="alignnone size-full wp-image-1598" /></p>
<p>Next, open a new PowerShell session and run the following commands:</p>
<pre class="brush: powershell; title: ; notranslate">Add-PSSnapin Microsoft.SharePoint.PowerShell -EA 0
Update-SPProfilePhotoStore -CreateThumbnailsForImportedPhotos 1 -MySiteHostLocation http://mysites</pre>
<p>The first command simply loads the SharePoint PowerShell Snapin if you haven&#8217;t already loaded it. The second command physically tells UPS to iterate through the photos in the user profiles and generate the thumbnails if they don&#8217;t already exist. Obviously if you&#8217;ve bulk loaded a large number of photos this will take a few minutes. Be sure to include the correct path to your MySite host. If you get an error about an object reference not set to an instance of an object, you likely have a permissions issue, and the user you&#8217;re logged in as doesn&#8217;t have full control of UPS.</p>
<p>Once this operation completes you should see user photos in SharePoint. Note that the best way to verify this is to look at the actual personal profile (person.aspx). Performing a search will still show you the old photo (or no photo) until the next incremental search crawl takes place on the content source with your sps3:// provider mapped.</p>
<p><strong>Step 3: Ongoing Maintenance</strong></p>
<p>This is fabulous, I&#8217;ve bulk loaded my 600, 1000, 2000 users and we&#8217;re up and running; but what happens when I change 10 of my photos tomorrow, or process a new hire next week? First of all, you&#8217;ve got to put that user&#8217;s photo in Active Directory. Many of the tools that offer bulk loading of photos will also allow you to manage one-off uploads or additions. Once the photo has been added to Active Directory, SharePoint User Profile Synchronization will grab that image on it&#8217;s next incremental synchronization (typically nightly). The piece that is most easily forgotten is this: UPS may have that image, but it cannot use it until the thumbnails are generated by running the Update-SPProfilePhotoStore cmdlet in PowerShell. Essentially, that cmdlet needs to be run after every UPS sync completes to ensure that the current photo is actually displayed.</p>
<p>The easiest way to accomplish this is to setup a scheduled task that calls your PowerShell script. First things first, create a new PowerShell script containing the following commands, and save it (ie: <em>C:\Solutions\Update-SPProfilePhotoStore.ps1</em>):</p>
<pre class="brush: powershell; title: ; notranslate">Add-PSSnapin Microsoft.SharePoint.PowerShell -EA 0
Update-SPProfilePhotoStore -CreateThumbnailsForImportedPhotos 1 -MySiteHostLocation http://mysites
$event = New-Object System.Diagnostics.EventLog(&quot;Application&quot;)
$event.Source = &quot;SharePoint&quot;
$infoEvent = [System.Diagnostics.EventLogEntryType]::Information
$event.WriteEntry(&quot;User Profile Service Photos Updated&quot;, $infoEvent, 5000)</pre>
<p>Note that the first two lines of this script are identical to our previous execution of the Update-SPProfilePhotoStore cmdlet. The lines after it log the event to the system&#8217;s application log using a source application of &#8220;SharePoint&#8221;, an event description of &#8220;User Profile Service Photos Updated&#8221;, and an event ID of 5000. We add this simply as a way of verifying that the PowerShell script is actually being run (and at the correct time).</p>
<p>With the script saved, head over to Windows Scheduled Tasks, and create a new task. Set the task to execute a program and provide the path to powershell.exe as well as your script:
<pre class="brush: jscript; title: ; notranslate">c:\windows\system32\WindowsPowerShell\v1.0\powershell.exe &quot;&amp; 'C:\Solutions\Update-SPProfilePhotoStore.ps1'&quot;</pre>
<p>Schedule your task to run even if the user is not logged on, and ensure it happens sometime after the nightly User Profile Synchronization Timer Job. For example, if your UPS job runs at 1:00 AM, you may want to schedule your task to fire at 3:00 AM, giving ample time for UPS to finish processing before user profile thumbnails get updated. You must also ensure that the task is executed by a user that has &#8220;Full Control&#8221; to the UPS service application, or the script will fail to process.</p>
]]></content:encoded>
			<wfw:commentRss>http://mike-greene.com/2012/05/end-to-end-sharepoint-2010-user-profile-photos/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>The Bell Cage</title>
		<link>http://mike-greene.com/2012/05/the-bell-cage/</link>
		<comments>http://mike-greene.com/2012/05/the-bell-cage/#comments</comments>
		<pubDate>Thu, 10 May 2012 12:53:26 +0000</pubDate>
		<dc:creator>michael greene</dc:creator>
				<category><![CDATA[Photography]]></category>
		<category><![CDATA[England 2012]]></category>

		<guid isPermaLink="false">http://mike-greene.com/?p=1565</guid>
		<description><![CDATA[Built in the 15th and 16th centuries, St. Mary&#8217;s Church in East Bergholt, Suffolk is unique for it&#8217;s lack of a traditional church bell tower. Due to a halt during the construction of the church, this temporary structure was built next to the church to house the bells. A &#8220;temporary&#8221; structure that still remains some [...]]]></description>
			<content:encoded><![CDATA[<p>Built in the 15th and 16th centuries, St. Mary&#8217;s Church in East Bergholt, Suffolk is unique for it&#8217;s lack of a traditional church bell tower. Due to a halt during the construction of the church, this temporary structure was built next to the church to house the bells. A &#8220;temporary&#8221; structure that still remains some 500 years later.<br />
This unique arrangement leads to the only place in the world where bells are rung in this manner. As opposed to traditional ringing where ropes are pulled from below, bell ringers physically stand next to the bells, throwing them manually.</p>
<p>With a weight of 4.25 tons, the bells themselves are also believed to be the heaviest that are run in England today.</p>
<p>This HDR image was assembled in Photomatix Pro using a set of 5 exposures developed from a single RAW image.</p>
<p><a href="http://500px.com/photo/7460838">The Bell Cage</a> by <a href="http://500px.com/webdes03">Michael Greene</a></p>
]]></content:encoded>
			<wfw:commentRss>http://mike-greene.com/2012/05/the-bell-cage/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Creating A Photo Collage Wallpaper</title>
		<link>http://mike-greene.com/2012/05/creating-a-photo-collage-wallpaper/</link>
		<comments>http://mike-greene.com/2012/05/creating-a-photo-collage-wallpaper/#comments</comments>
		<pubDate>Wed, 09 May 2012 20:48:54 +0000</pubDate>
		<dc:creator>michael greene</dc:creator>
				<category><![CDATA[Photography]]></category>
		<category><![CDATA[Tutorial]]></category>

		<guid isPermaLink="false">http://mike-greene.com/?p=1552</guid>
		<description><![CDATA[Step 1: Once you&#8217;ve downloaded the collage templates, extract the zip file and open the template you want to use using Fireworks CS5 or later. The templates have been pre-built for a desktop screen resolution of 1920x1080px. The colored zones represent containers for the photos that we&#8217;ll be adding to the collage, while the white frames [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Step 1:</strong> Once you&#8217;ve <a href="http://mike-greene.com/wp-content/uploads/2012/05/Photo-Collages.zip">downloaded the collage templates</a>, extract the zip file and open the template you want to use using Fireworks CS5 or later. The templates have been pre-built for a desktop screen resolution of 1920x1080px. The colored zones represent containers for the photos that we&#8217;ll be adding to the collage, while the white frames will automatically frame each photo.</p>
<p><img class="alignnone size-full wp-image-1539" title="Collage Step 1" src="http://mike-greene.com/wp-content/uploads/2012/05/Collage-Step-1.png" alt="" width="540" height="313" /></p>
<p><strong>Step 2:</strong> Identify a photo to be added to a zone, and drag it into the canvas.</p>
<p><img class="alignnone size-full wp-image-1540" title="Collage Step 2" src="http://mike-greene.com/wp-content/uploads/2012/05/Collage-Step-2.png" alt="" width="540" height="313" /></p>
<p><strong>Step 3:</strong> While holding down the shift key (to make sure the image maintains proportions), grab one of the corners of the image and resize it to roughly cover the zone you want to place it in.</p>
<p><img class="alignnone size-full wp-image-1541" title="Collage Step 3" src="http://mike-greene.com/wp-content/uploads/2012/05/Collage-Step-3.png" alt="" width="540" height="313" /></p>
<p><strong>Step 4:</strong> Click once on the image to select it, then select &#8220;Cut&#8221; from the &#8220;Edit&#8221; menu.</p>
<p><img class="alignnone size-full wp-image-1550" title="Collage Step 4" src="http://mike-greene.com/wp-content/uploads/2012/05/Collage-Step-41.png" alt="" width="540" height="313" /></p>
<p><strong>Step 5:</strong> Select the zone you want to place the image in by clicking once on it.</p>
<p><img class="alignnone size-full wp-image-1543" title="Collage Step 5" src="http://mike-greene.com/wp-content/uploads/2012/05/Collage-Step-5.png" alt="" width="540" height="313" /></p>
<p><strong>Step 6:</strong> With the zone selected, select &#8220;Paste Inside&#8221; from the &#8220;Edit&#8221; menu. This will create a layer mask and fit the image inside it.</p>
<p><img class="alignnone size-full wp-image-1551" title="Collage Step 6" src="http://mike-greene.com/wp-content/uploads/2012/05/Collage-Step-61.png" alt="" width="540" height="313" /></p>
<p><strong>Step 7:</strong> Your photo has now been masked into the zone with the white photo frame around it.</p>
<p><img class="alignnone size-full wp-image-1545" title="Collage Step 7" src="http://mike-greene.com/wp-content/uploads/2012/05/Collage-Step-7.png" alt="" width="540" height="313" /></p>
<p><strong>Step 8:</strong> If the image requires additional adjustments such as further resizing, repositioning, sharpening, color adjustments, etc. you must first unlock the image from the mask. Expand the &#8220;Layers&#8221; panel, click on the photo to select the layer, find the active layer in the layers panel, and click the chain link icon to unlock the layer from the mask.</p>
<p><img class="alignnone size-full wp-image-1549" title="Collage Step 8" src="http://mike-greene.com/wp-content/uploads/2012/05/Collage-Step-81.png" alt="" width="540" height="313" /></p>
<p><strong>Step 9:</strong> You can now make changes to the photo without moving and affecting the mask that keeps it in the frame.</p>
<p><img class="alignnone size-full wp-image-1547" title="Collage Step 9" src="http://mike-greene.com/wp-content/uploads/2012/05/Collage-Step-9.png" alt="" width="540" height="313" /></p>
<p><strong>Step 10:</strong> Repeat steps 2-9 for each remaining zone, then select &#8220;File&#8221; from the menu, and click &#8220;Save As&#8230;&#8221; to save your collage.</p>
]]></content:encoded>
			<wfw:commentRss>http://mike-greene.com/2012/05/creating-a-photo-collage-wallpaper/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Actually, Avis Doesn&#8217;t Try Harder</title>
		<link>http://mike-greene.com/2012/04/actually-avis-doesnt-try-harder/</link>
		<comments>http://mike-greene.com/2012/04/actually-avis-doesnt-try-harder/#comments</comments>
		<pubDate>Thu, 26 Apr 2012 17:39:42 +0000</pubDate>
		<dc:creator>michael greene</dc:creator>
				<category><![CDATA[Travel]]></category>
		<category><![CDATA[Social Media]]></category>

		<guid isPermaLink="false">http://mike-greene.com/?p=1532</guid>
		<description><![CDATA[My girlfriend and I recently returned from our vacation in England (3 days in London and 4 days in Suffolk). We had planned a rental car for the Suffolk portion of our trip, and the story below is the overview of our experience that I sent to Avis Customer Service after they deserted us with [...]]]></description>
			<content:encoded><![CDATA[<p>My girlfriend and I recently returned from our vacation in England (3 days in London and 4 days in Suffolk). We had planned a rental car for the Suffolk portion of our trip, and the story below is the overview of our experience that I sent to Avis Customer Service after they deserted us with no car to drive. I&#8217;m one of those people that&#8217;s very loyal to a given company until something like this happens&#8211;you won&#8217;t see me making any Avis reservations in the future.</p>
<blockquote><p>To whom it may concern,</p>
<p>I’d like to offer some feedback and a complaint related to a recent rental experience with Avis. As an Avis preferred customer who rents primarily for business, my girlfriend and I selected Avis for an upcoming vacation to the United Kingdom.</p>
<p>I booked the reservation on January 24, 2012 for pickup in Ipswich on April 21, and return to Heathrow airport on April 25. After booking the reservation, I followed up with a call directly to the Ipswich branch, and spoke to <em>******</em> on January 25, 2012 to confirm everything was correct with the reservation (since I was booking it from the United States). I also emphasized the need for an automatic, having never driven a manual (and especially not on the opposite side, shifting with my left hand, on narrow British roads). On April 18, 2012 Avis sent me a reservation reminder that our car was ready to be picked up as booked.</p>
<p>You can imagine my surprise now, when we get off the train in Ipswich, walk across the street to the Avis office and get told “We have a slight issue with your reservation—we have no automatics available”. I then learn that this is the same person that I spoke with on the phone to confirm everything with, and that the car is there but unable to be rented because it has “been pushed back on its mileage” (whatever that means).</p>
<p>Trying to make the situation better she then offers me my choice of anything on the lot, failing to recognize that none of those are cars I can physically drive. She made a rude comment about how if I “needed an American car” she did have a Chevrolet to choose from, and then continued to tell me that I wouldn’t be liable for any damage to the vehicle or transmission. I’m unsure as to if she actually had the power to give me a car to trash with no liability, but that sounded too good to be true and certainly wasn’t something I was going to risk.</p>
<p>Luckily I had family in the area that was able to meet us and take us to another rental company who was not only able to help us, but did so in a professional and understanding manner. Had family not been available we would have been deserted in a foreign city with no means of transportation. As a result of changing companies, walking in and having to accept whatever vehicle they had available, our car rental also ended up costing almost twice as much as planned.</p>
<p>This was certainly not the way we wanted to start our vacation—that alone is bad enough, but the fact that I took the extra steps of confirming directly with the local branch only to still have issues is unacceptable. If this is the type of service you offer your “Preferred customers” then Avis is not a business I wish to do business with, and this will be the last time I give Avis an opportunity for my business domestically or internationally. I’ve also cross-posted this overview of our experience on my blog, and on Facebook and Twitter.</p>
<p>With regret,</p>
<p>Michael Greene</p></blockquote>
<p>The silver lining to all of this is that we had an awesome experience at Enterprise. They were friendly, helpful, and genuinely interested in helping solve our problem (unlike the staff at Avis who basically said since it was the weekend and many of their locations would be closed for the afternoon they had nothing they could do for us). If you find yourself needing a rental car at some point in the future, I&#8217;d highly encourage you to give Enterprise a try. Maybe you&#8217;ll learn, like I did, that there&#8217;s nicer people out there.</p>
<!-- tweet id : 193796031220158466 --><style type='text/css'>#bbpBox_193796031220158466 a { text-decoration:none; color:#1FAECB; }#bbpBox_193796031220158466 a:hover { text-decoration:underline; }</style><div id='bbpBox_193796031220158466' class='bbpBox' style='padding:20px; margin:5px 0; background-color:#060606; background-image:url(http://a0.twimg.com/profile_background_images/316551860/twitter_bkg.png); background-repeat:no-repeat'><div style='background:#fff; padding:10px; margin:0; min-height:48px; color:#303030; -moz-border-radius:5px; -webkit-border-radius:5px;'><span style='width:100%; font-size:18px; line-height:22px;'>Cut up my Avis Preferred card-will never rent w/ Avis again. Stranded at a British train station w/ no car I can drive. @<a href="http://twitter.com/intent/user?screen_name=AvisWeTryHarder" class="twitter-action">AvisWeTryHarder</a> <a href="http://twitter.com/search?q=%23FB" title="#FB">#FB</a></span><div class='bbp-actions' style='font-size:12px; width:100%; padding:5px 0; margin:0 0 10px 0; border-bottom:1px solid #e6e6e6;'><img align='middle' src='http://mike-greene.com/wp-content/plugins/twitter-blackbird-pie//images/bird.png' /><a title='tweeted on April 21, 2012 16:19' href='http://twitter.com/#!/webdes03/status/193796031220158466' target='_blank'>April 21, 2012 16:19</a> via <a href="http://www.hootsuite.com" rel="nofollow" target="blank">HootSuite</a><a href='https://twitter.com/intent/tweet?in_reply_to=193796031220158466' class='bbp-action bbp-reply-action' title='Reply'><span><em style='margin-left: 1em;'></em><strong>Reply</strong></span></a><a href='https://twitter.com/intent/retweet?tweet_id=193796031220158466' class='bbp-action bbp-retweet-action' title='Retweet'><span><em style='margin-left: 1em;'></em><strong>Retweet</strong></span></a><a href='https://twitter.com/intent/favorite?tweet_id=193796031220158466' class='bbp-action bbp-favorite-action' title='Favorite'><span><em style='margin-left: 1em;'></em><strong>Favorite</strong></span></a></div><div style='float:left; padding:0; margin:0'><a href='http://twitter.com/intent/user?screen_name=webdes03'><img style='width:48px; height:48px; padding-right:7px; border:none; background:none; margin:0' src='http://a0.twimg.com/profile_images/2085257967/Prism_normal.jpg' /></a></div><div style='float:left; padding:0; margin:0'><a style='font-weight:bold' href='http://twitter.com/intent/user?screen_name=webdes03'>@webdes03</a><div style='margin:0; padding-top:2px'>Michael Greene</div></div><div style='clear:both'></div></div></div><!-- end of tweet -->
<p>The other interesting thing to note here, is that I tweeted kudos to both @EnterpriseCares (Enterprise Rent-A-Car), and to @ApexHotels thanking them for excellent service on our vacation. Both replied almost instantly thanking for the feedback, but despite the fact that Avis has replies to peoples issues in their timeline for the last few days, there has been no peep from them (since the tweet on April 21, 2012).</p>
]]></content:encoded>
			<wfw:commentRss>http://mike-greene.com/2012/04/actually-avis-doesnt-try-harder/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>SharePoint Branding &amp; CSS Specificity</title>
		<link>http://mike-greene.com/2012/04/sharepoint-branding-css-specificity/</link>
		<comments>http://mike-greene.com/2012/04/sharepoint-branding-css-specificity/#comments</comments>
		<pubDate>Fri, 13 Apr 2012 15:41:44 +0000</pubDate>
		<dc:creator>michael greene</dc:creator>
				<category><![CDATA[Technology]]></category>
		<category><![CDATA[Branding]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[SharePoint]]></category>

		<guid isPermaLink="false">http://mike-greene.com/?p=1519</guid>
		<description><![CDATA[We all know that best practices SharePoint branding avoids the use of !important in your CSS, but how do you correctly control the specificity of your CSS to mitigate the need for it? The order of operations for your CSS depends on a number of factors, including the loading order of the stylesheet, the order [...]]]></description>
			<content:encoded><![CDATA[<p>We all know that best <a title="Custom CSS and SharePoint Branding (The Right Way)" href="http://mike-greene.com/2011/10/custom-css-and-sharepoint-branding-the-right-way/" target="_blank">practices SharePoint branding</a> avoids the use of !important in your CSS, but how do you correctly control the specificity of your CSS to mitigate the need for it?</p>
<p>The order of operations for your CSS depends on a number of factors, including the loading order of the stylesheet, the order of the styles within that stylesheet, and lastly the specificity of the style. SharePoint allows us to use the <em>&lt;SharePoint:CssRegistration&gt;</em> tag to help provide greater control over the loading order of stylesheets and ensure that your custom style sheet is loaded after all of the core ones. This allows us to easily override the out of the box classes easily, since styles loaded later will override matching properties of identically named styles loaded previously.</p>
<p>I recently ran into a problem when branding SharePoint 2010 MySites for a client. The SharePoint core CSS has classes for branding the &#8220;Add New&#8221; links on the bottom of list/library web parts (<em>.ms-addnew a:visited</em>, <em>.ms-addnew a:active</em>, <em>.ms-addnew a</em>, etc.). Simple enough, my custom stylesheet that is loaded after all of the core ones overrides the link color to my desired color. But on the MySite, there&#8217;s another core stylesheet (portal.css) that gets loaded as part of the layout of the MySite. The CSS link is actually rendered inside the main content placeholder, not in the head. These same few styles are redefined in portal.css, and since that is loaded later, it overrides my override of the core style.</p>
<p>Some people might now stand up, voilla&#8230; this is one of those cases where &#8220;you HAVE to use !important&#8221;, but this is not the case. Remember that little thing called specificity? A style loaded later will not override a previous style if that previous style has greater specificity. Since <em>.class .class element</em> is more specific than <em>.class element</em>, the browser will always choose a more specific style over a newer one.</p>
<p>This being said, crack open your custom master page, and find the opening <em>&lt;body&gt;</em> <em></em>tag. If your masterpage has been derived from the default out of the box master, you&#8217;ll likely see that the body tag has a class attribute with a value of &#8220;<em>v4master</em>&#8220;. Add a second value to the class attribute (ie: <em>class=&#8221;v4master customBranding&#8221;</em>). We can now define more specific styles using the <em>.customBranding</em> selector. Using <em>.customBranding .ms-addnew a</em> will always take precedence over the <em>.ms-addnew a</em> in portal.css purely because it&#8217;s more specific than any styles already defined in the core stylesheets. No !important here.</p>
]]></content:encoded>
			<wfw:commentRss>http://mike-greene.com/2012/04/sharepoint-branding-css-specificity/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>User Profile Services via Client Object Model</title>
		<link>http://mike-greene.com/2012/04/user-profile-services-via-client-object-model/</link>
		<comments>http://mike-greene.com/2012/04/user-profile-services-via-client-object-model/#comments</comments>
		<pubDate>Wed, 04 Apr 2012 14:19:46 +0000</pubDate>
		<dc:creator>michael greene</dc:creator>
				<category><![CDATA[Technology]]></category>
		<category><![CDATA[Client Object Model]]></category>
		<category><![CDATA[Collaboration]]></category>
		<category><![CDATA[ECMAScript]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[SharePoint]]></category>
		<category><![CDATA[User Experience]]></category>

		<guid isPermaLink="false">http://mike-greene.com/?p=1498</guid>
		<description><![CDATA[I was recently thinking through ways to help drive adoption of an intranet and engage users to explore the various capabilities of the system. One thought was to alert users if they have not supplied a profile photo, or a short bio in their MySite. Sure we could do this with web services, but I [...]]]></description>
			<content:encoded><![CDATA[<p>I was recently thinking through ways to help drive adoption of an intranet and engage users to explore the various capabilities of the system. One thought was to alert users if they have not supplied a profile photo, or a short bio in their MySite. Sure we could do this with web services, but I thought I&#8217;d figure out how to do it with the client object model with ECMAScript. After a lot of searching, I kept finding blog posts that said I was out of luck and there was no way to query User Profiles via the client object model. At a high level, that assessment is correct, but what we can do is query the user info list of the current site.</p>
<p>When I first started this, none of the test users in my lab had a profile picture, so I added one and found that my script kept returning a <em>null</em> object instead of my picture. The hidden Easter egg here is that the site&#8217;s user info list isn&#8217;t updated in real time. If you head over to <em>Central Administration -&gt; Monitoring -&gt; Review job definitions</em> and dig down the list you&#8217;ll find a job called &#8220;<em>User Profile Service Application &#8211; User Profile to SharePoint Full Synchronization</em>&#8220;. This timer job will execute every hour and synchronize the properties of your User Profile Services to the site user info list, so the picture that was set on the MySite is now accessible via the user info list.</p>
<p>First things first, we need to find out the ID of the user that&#8217;s currently viewing the page (this is the physical numerical record of the user in the site&#8217;s user info list, not the login username). Credit to Mike Oryszak (<a href="https://twitter.com/next_connect" target="_blank">@next_connect</a>) and his blog post on <a href="http://www.mikeoryszak.com/sharepoint/use-the-status-bar-to-display-active-workflows" target="_blank">using the status bar to display active workflows</a> for getting me in the right direction on this piece. We&#8217;ll start out by grabbing the current web context and fire off that query. If the query is successful in executing, it&#8217;ll call the <em>onUserSuccessMethod</em> function.</p>
<pre class="brush: jscript; title: ; notranslate">
var context = null;
var web = null;
var curUser = null;

function getUser() {
	context = new SP.ClientContext.get_current();
	web = context.get_web();
	curUser = web.get_currentUser();
	curUser.retrieve();
	context.load(web);
	context.executeQueryAsync(Function.createDelegate(this, this.onUserSuccessMethod), Function.createDelegate(this, this.onFailureMethod));
}</pre>
<p>Now that we have our context we&#8217;ll create a variable called <em>user</em> and assign it to the current user object, and call our <em>loadProfile</em> function to do the profile query.</p>
<pre class="brush: jscript; title: ; notranslate">
function onUserSuccessMethod(sender, args) {
	var user = web.get_currentUser();
	loadProfile();
}</pre>
<p>The <em>loadProfile</em> function defines the user info list, builds the CAML query to get the record for the current user, and fires that query off. If the query is successful in executing, it&#8217;ll call the <em>onProfileSuccessMethod</em> function.</p>
<pre class="brush: jscript; title: ; notranslate">
function loadProfile() {
	context = SP.ClientContext.get_current();
	web = context.get_web();
	userInfoList = web.get_siteUserInfoList();
	camlQuery = new SP.CamlQuery();
	camlQuery.set_viewXml('&lt;View&gt;&lt;Query&gt;&lt;Where&gt;&lt;Eq&gt;&lt;FieldRef Name=\'ID\'/&gt;&lt;Value Type=\'Number\'&gt;' + curUser.get_id() + '&lt;/Value&gt;&lt;/Eq&gt;&lt;/Where&gt;&lt;/Query&gt;&lt;RowLimit&gt;1&lt;/RowLimit&gt;&lt;/View&gt;');
	this.listItems = userInfoList.getItems(camlQuery);
	context.load(listItems);
	context.executeQueryAsync(Function.createDelegate(this, this.onProfileSuccessMethod), Function.createDelegate(this, this.onFailureMethod));
}</pre>
<p>Now that we have the result set from our query (in the form of a <em>listItems</em> object), all we need to do is grab the first (and only item), this will be on index 0 in the array, and analyze the picture field to see if there&#8217;s a value there or not. If there is a picture object, we&#8217;ll grab the Url to it and save it in a new variable (<em>pictureURL</em>) just in case we want it. If there is no picture object, we&#8217;ll fire off a call to SP.UI.Status to add a new status bar telling the user they don&#8217;t have a photo, with a link to their profile where they can add one.</p>
<pre class="brush: jscript; title: ; notranslate">
function onProfileSuccessMethod(sender, args) {
	var item = listItems.itemAt(0);
	var picture = item.get_item('Picture');
	if (picture) {
		var pictureURL = picture.get_url();
	} else {
		noPicture = SP.UI.Status.addStatus('Profile Photo', 'You have not added a profile photo to your account. &lt;a href=\'http://mysites/person.aspx\'&gt;Add one now!&lt;/a&gt;');
		SP.UI.Status.setStatusPriColor(noPicture, 'blue');
	}
}</pre>
<p>You&#8217;ll notice that both <em>getUser()</em> and <em>loadProfile()</em> have references to an <em>onFailureMethod</em> function, in the event that our query fails. This will be a simple function to just alert our error.</p>
<pre class="brush: jscript; title: ; notranslate">
function onFailureMethod(sender, args) {
	alert('Error: ' + args.get_message() + '\n' + args.get_stackTrace());
}</pre>
<p>Now that we&#8217;ve got all of our functions written, all we need is a simple call to our <em>getUser()</em> function (after the core SharePoint JavaScript has loaded, of course).</p>
<pre class="brush: jscript; title: ; notranslate">ExecuteOrDelayUntilScriptLoaded(getUser, &quot;sp.js&quot;);</pre>
<p>Putting it all together:</p>
<p>My &#8220;Michael Greene&#8221; account has a user profile image, so we just see normal SharePoint with no profile photo alerts.<br />
<img src="http://mike-greene.com/wp-content/uploads/2012/04/ups_photo.png" alt="" title="ups_photo" width="540" height="336" class="alignnone size-full wp-image-1508" style="border: 1px solid #000;" /></p>
<p>My &#8220;Setup Account&#8221; account does not have a profile image, so SharePoint prompts us that we should add a photo.<br />
<img src="http://mike-greene.com/wp-content/uploads/2012/04/ups_nophoto.png" alt="" title="ups_nophoto" width="540" height="336" class="alignnone size-full wp-image-1509" style="border: 1px solid #000;" /></p>
<p>Due to the fact that we have to wait on the timer job to run and update the user info list with the new photo, it&#8217;s possible that the user could add a photo then still see the prompt telling them they haven&#8217;t. In a true application of this, we could add a condition to check the <em>Modified</em> time of the user info list record to see if the record has been &#8220;updated&#8221; in the last hour, to avoid that false positive. Only if the record has been updated within the hour and has no photo, should we alert the user.</p>
]]></content:encoded>
			<wfw:commentRss>http://mike-greene.com/2012/04/user-profile-services-via-client-object-model/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>People Picker Woes</title>
		<link>http://mike-greene.com/2012/02/people-picker-woes/</link>
		<comments>http://mike-greene.com/2012/02/people-picker-woes/#comments</comments>
		<pubDate>Wed, 01 Feb 2012 16:56:10 +0000</pubDate>
		<dc:creator>michael greene</dc:creator>
				<category><![CDATA[Technology]]></category>
		<category><![CDATA[Active Directory]]></category>
		<category><![CDATA[SharePoint]]></category>

		<guid isPermaLink="false">http://mike-greene.com/?p=1494</guid>
		<description><![CDATA[On my last project I ran into the chasm of the SharePoint 2010 people picker resolving to users across multiple domains. There&#8217;s loads of blog posts out there (first, second, third), plus the Microsoft documentation, but there&#8217;s one important piece missing to all of these posts. In my scenario, corp.domainA.com contains all of the users [...]]]></description>
			<content:encoded><![CDATA[<p>On my last project I ran into the chasm of the SharePoint 2010 people picker resolving to users across multiple domains. There&#8217;s loads of blog posts out there (<a href="http://martijnschouten.wordpress.com/2010/06/02/sharepoint-2010-domain-trusts-people-picker/" target="_blank">first</a>, <a href="http://www.portalsolutions.net/Blog/Lists/Posts/Post.aspx?List=1fef67f0-70ca-4263-b683-f10c1958687a&amp;ID=43&amp;Web=2a4e9897-6530-44a1-80b5-4fac295c2c26" target="_blank">second</a>, <a href="http://martinbruce.blogspot.com/2011/05/sharepoint-2010-multiple-domains-people.html" target="_blank">third</a>), plus the <a href="http://technet.microsoft.com/en-us/library/cc263460(office.12).aspx" target="_blank">Microsoft documentation</a>, but there&#8217;s one important piece missing to all of these posts.</p>
<p>In my scenario, corp.domainA.com contains all of the users (~1,600 in this case), and domainB.com contains all of our SharePoint servers, service accounts, etc. Now, the documentation states that if you have a two-way trust in place, then you don&#8217;t have to do anything special to make SharePoint resolve those accounts within the trusted domain. In this scenario, a two-way trust is in place, but the trust is between the root (domainA.com), and domainB.com. I&#8217;ll preface this with the fact that I&#8217;m not an Active Directory guy, but my &#8220;expectation&#8221; would be that if the root domain is trusted, the child domain is also trusted. That seems to be the case, but SharePoint will not resolve down to &#8220;corp\user&#8221; accounts when searching for a user in the people picker. My assumption is that despite the trust, SharePoint doesn&#8217;t dive into a child domain of a trusted domain during the query, unless you tell it you want it to.</p>
<p>The solution is to use the peoplepicker-searchadforests STSADM operation (yes, this is one things that you still have to use STSADM for&#8211;no PowerShell equivalent yet). The other thing to note, which I didn&#8217;t see mentioned in any of the blogs or documentation I found, is that you must run the STSADM operation against every URL for your web app. So if you have one or more Alternate Access Mapping setup on your web application, you must run the STSADM operation against those AAMs.</p>
<p>So in our case:</p>
<pre class="brush: bat; title: ; notranslate">
stsadm -o setproperty -pn peoplepicker-searchadforests -pv domain:corp.domainA.com;domain:domainB.com -url http://intranet
stsadm -o setproperty -pn peoplepicker-searchadforests -pv domain:corp.domainA.com;domain:domainB.com -url http://intranet.domainB.com
</pre>
]]></content:encoded>
			<wfw:commentRss>http://mike-greene.com/2012/02/people-picker-woes/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Enhancing SharePoint 2010 for the iPad (SPSAusTX 2012)</title>
		<link>http://mike-greene.com/2012/01/enhancing-sharepoint-2010-for-the-ipad-spsaustx-2012/</link>
		<comments>http://mike-greene.com/2012/01/enhancing-sharepoint-2010-for-the-ipad-spsaustx-2012/#comments</comments>
		<pubDate>Sat, 21 Jan 2012 21:55:41 +0000</pubDate>
		<dc:creator>michael greene</dc:creator>
				<category><![CDATA[Presentations & Whitepapers]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[iOS]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[SharePoint]]></category>
		<category><![CDATA[SharePoint Saturday]]></category>
		<category><![CDATA[SPSAuxTX12]]></category>
		<category><![CDATA[User Experience]]></category>
		<category><![CDATA[User Interface]]></category>

		<guid isPermaLink="false">http://mike-greene.com/?p=1489</guid>
		<description><![CDATA[Despite being marketed as an entertainment device rather than a mobile platform for business, the iPad continues to gain traction as a mobile device for the next generation business user. For some organizations, the rich user interaction and usability afforded by the iPad is a compelling reason to work towards cross-platform capability or iPad specific [...]]]></description>
			<content:encoded><![CDATA[<blockquote><p>Despite being marketed as an entertainment device rather than a mobile platform for business, the iPad continues to gain traction as a mobile device for the next generation business user. For some organizations, the rich user interaction and usability afforded by the iPad is a compelling reason to work towards cross-platform capability or iPad specific versions of line-of-business systems. In this session we’ll review custom iPad specific enhancements for SharePoint 2010, including changes to the user interface based on the orientation of the device.</p>
<p>Presented at SharePoint Saturday Austin, TX (January 21, 2012).</p></blockquote>
<p><strong>Demonstration Video:</strong><br />
<iframe width="539" height="303" src="http://www.youtube.com/embed/K8NrTPEu_pY" frameborder="0" allowfullscreen></iframe></p>
]]></content:encoded>
			<wfw:commentRss>http://mike-greene.com/2012/01/enhancing-sharepoint-2010-for-the-ipad-spsaustx-2012/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Create SharePoint Groups with PowerShell</title>
		<link>http://mike-greene.com/2012/01/create-sharepoint-groups-with-powershell/</link>
		<comments>http://mike-greene.com/2012/01/create-sharepoint-groups-with-powershell/#comments</comments>
		<pubDate>Wed, 11 Jan 2012 15:25:01 +0000</pubDate>
		<dc:creator>michael greene</dc:creator>
				<category><![CDATA[Technology]]></category>
		<category><![CDATA[PowerShell]]></category>
		<category><![CDATA[SharePoint]]></category>

		<guid isPermaLink="false">http://mike-greene.com/?p=1483</guid>
		<description><![CDATA[It wasn&#8217;t until I looked into this tweet that I realized there was no &#8220;New-SPGroup&#8221; type cmdlet that ships with SharePoint out of the box. Instead, we have to call the SiteGroups.Add operation on the web where we want to make the group. While this isn&#8217;t terribly intuitive for people new to PowerShell, this post [...]]]></description>
			<content:encoded><![CDATA[<!-- tweet id : 156911637658480641 --><style type='text/css'>#bbpBox_156911637658480641 a { text-decoration:none; color:#FF0000; }#bbpBox_156911637658480641 a:hover { text-decoration:underline; }</style><div id='bbpBox_156911637658480641' class='bbpBox' style='padding:20px; margin:5px 0; background-color:#642D8B; background-image:url(http://a1.twimg.com/images/themes/theme10/bg.gif);'><div style='background:#fff; padding:10px; margin:0; min-height:48px; color:#3D1957; -moz-border-radius:5px; -webkit-border-radius:5px;'><span style='width:100%; font-size:18px; line-height:22px;'>@<a href="http://twitter.com/intent/user?screen_name=webdes03" class="twitter-action">webdes03</a> <a href="http://twitter.com/search?q=%23SPSVB" title="#SPSVB">#SPSVB</a> Could use help coming up w/a script to make 110 SP Groups for 1 Site collection.  Have time to help?</span><div class='bbp-actions' style='font-size:12px; width:100%; padding:5px 0; margin:0 0 10px 0; border-bottom:1px solid #e6e6e6;'><img align='middle' src='http://mike-greene.com/wp-content/plugins/twitter-blackbird-pie//images/bird.png' /><a title='tweeted on January 10, 2012 21:33' href='http://twitter.com/#!/java_woman/status/156911637658480641' target='_blank'>January 10, 2012 21:33</a> via web<a href='https://twitter.com/intent/tweet?in_reply_to=156911637658480641' class='bbp-action bbp-reply-action' title='Reply'><span><em style='margin-left: 1em;'></em><strong>Reply</strong></span></a><a href='https://twitter.com/intent/retweet?tweet_id=156911637658480641' class='bbp-action bbp-retweet-action' title='Retweet'><span><em style='margin-left: 1em;'></em><strong>Retweet</strong></span></a><a href='https://twitter.com/intent/favorite?tweet_id=156911637658480641' class='bbp-action bbp-favorite-action' title='Favorite'><span><em style='margin-left: 1em;'></em><strong>Favorite</strong></span></a></div><div style='float:left; padding:0; margin:0'><a href='http://twitter.com/intent/user?screen_name=java_woman'><img style='width:48px; height:48px; padding-right:7px; border:none; background:none; margin:0' src='http://a2.twimg.com/profile_images/1392052729/246698_10150207586877144_501217143_7416577_6750257_n_normal.jpg' /></a></div><div style='float:left; padding:0; margin:0'><a style='font-weight:bold' href='http://twitter.com/intent/user?screen_name=java_woman'>@java_woman</a><div style='margin:0; padding-top:2px'>Rebecca Ward</div></div><div style='clear:both'></div></div></div><!-- end of tweet -->
<p>It wasn&#8217;t until I looked into this tweet that I realized there was no &#8220;New-SPGroup&#8221; type cmdlet that ships with SharePoint out of the box. Instead, we have to call the SiteGroups.Add operation on the web where we want to make the group. While this isn&#8217;t terribly intuitive for people new to PowerShell, this post should help to walk you through it.</p>
<p>Firstly, we&#8217;re adding groups to webs, not sites, so we need to identify the web where the group is going to exist. While groups are available site-wide, they&#8217;re actually stored at the web level, which explains why when you create a subsite (a web), you get the three default groups created. Yes, I realize it&#8217;s confusing that a web has a property of &#8220;SiteGroups&#8221;, and a site doesn&#8217;t&#8211;but that&#8217;s just the way it is. Before we can do anything, we need to create a variable and save our web object into it.</p>
<pre class="brush: powershell; title: ; notranslate">$web = Get-SPWeb http://intranet</pre>
<p>In addition to a title and description, we also need to specify the owner and any members of our group when we call the SiteGroups.Add operation; those users must be valid SPUser objects, not a &#8220;domain\username&#8221; string. To keep things simple for this example, let&#8217;s assume they&#8217;re the same person, since the owner is typically also a member of the group. We&#8217;re going to create a user variable, and pipe our web object to the Get-SPUser cmdlet (with a user string). This will tell PowerShell to iterate through every user in our web until it finds the one we&#8217;ve specified, and save that SPUser object to our user variable.</p>
<pre class="brush: powershell; title: ; notranslate">$user = $web | Get-SPUser &quot;domain\username&quot;</pre>
<p>Now that we have our user captured, we can go ahead and call the SiteGroups.Add operation, passing to it the title of the group, the owner of the group, the members of the group, and the description of the group (in that order).</p>
<pre class="brush: powershell; title: ; notranslate">$web.SiteGroups.Add(&quot;Group Name&quot;, $user, $user, &quot;Group Description&quot;)</pre>
<p>Now it&#8217;s a simple matter of heading on over to your groups list and validating that it&#8217;s there.</p>
<p>If, like Rebecca, you had a lot of these to do, you could store the details in a CSV file and handle your inputs from there. Let&#8217;s assume you had a CSV with columns of &#8220;Web&#8221;, &#8220;GroupName&#8221;, &#8220;User&#8221;, and &#8220;GroupDescription&#8221; that was stored in C:\Groups.csv, we can make a simple script to loop through all of the lines in the Groups.csv file and create each group.</p>
<pre class="brush: powershell; title: ; notranslate">$groups = Import-CSV c:\Groups.csv
foreach ($group in $groups) {
	$web = Get-SPWeb $group.Web
	$user = $web | Get-SPUser $group.User
	$web.SiteGroups.Add($group.GroupName, $user, $user, $group.GroupDescription)
}</pre>
]]></content:encoded>
			<wfw:commentRss>http://mike-greene.com/2012/01/create-sharepoint-groups-with-powershell/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Making Life Easier with PowerShell (SPSVB 2012)</title>
		<link>http://mike-greene.com/2012/01/making-life-easier-with-powershell-spsvb-2012/</link>
		<comments>http://mike-greene.com/2012/01/making-life-easier-with-powershell-spsvb-2012/#comments</comments>
		<pubDate>Mon, 09 Jan 2012 14:49:01 +0000</pubDate>
		<dc:creator>michael greene</dc:creator>
				<category><![CDATA[Presentations & Whitepapers]]></category>
		<category><![CDATA[PowerShell]]></category>
		<category><![CDATA[SharePoint]]></category>
		<category><![CDATA[SharePoint Saturday]]></category>
		<category><![CDATA[SPSVB12]]></category>

		<guid isPermaLink="false">http://mike-greene.com/?p=1474</guid>
		<description><![CDATA[Have you ever spent an afternoon setting site collection properties manually on every site collection in your farm? How about going through and activating features following an upgrade? These are just two simple examples of where PowerShell can turn an entire afternoon worth of work into just a few minutes. In this session we’ll start [...]]]></description>
			<content:encoded><![CDATA[<blockquote><p>Have you ever spent an afternoon setting site collection properties manually on every site collection in your farm? How about going through and activating features following an upgrade? These are just two simple examples of where PowerShell can turn an entire afternoon worth of work into just a few minutes. In this session we’ll start off with a familiarization of PowerShell and progress into capabilities and usage scenarios of the out of the box SharePoint 2010 cmdlets.</p>
<p>Presented at SharePoint Saturday, Virginia Beach (January 7, 2012)</p></blockquote>
<p><strong>Resources:</strong></p>
<ul>
<li>STSADM -&gt; PowerShell Mapping<br />
<a href="http://technet.microsoft.com/en-us/library/ff621081.aspx">http://</a><a href="http://technet.microsoft.com/en-us/library/ff621081.aspx">technet.microsoft.com/en-us/library/ff621081.aspx</a></li>
<li>Scripting with Windows PowerShell (5part webcast series)
<div><a href="http://technet.microsoft.com/en-us/scriptcenter/dd742419">http://</a><a href="http://technet.microsoft.com/en-us/scriptcenter/dd742419">technet.microsoft.com/en-us/scriptcenter/dd742419</a></div>
</li>
<li>PowerShell Power Hour (monthly lunchtime webcasts)
<div><a href="http://idera.com/Education/PowerShell-Webcasts/">http://idera.com/Education/PowerShell-Webcasts</a><a href="http://idera.com/Education/PowerShell-Webcasts/">/</a></div>
</li>
<li>Automating Microsoft SharePoint 2010 Administration with Windows PowerShell 2.0. Gary Lapointe, Shannon Bray<br />
<a href="http://www.amazon.com/Automating-SharePoint-2010-Windows-PowerShell/dp/0470939206/ref=sr_1_1?ie=UTF8&amp;qid=1320673675&amp;sr=8-1">http://www.amazon.com/Automating-SharePoint-2010-Windows-PowerShell/dp/0470939206/ref=sr_1_1?ie=UTF8&amp;qid=1320673675&amp;sr=8-1<br />
</a></li>
<li>Automating Microsoft Windows Server 2008 R2 Administration with Windows PowerShell 2.0.  Matthew Hester, Sarah Dutkiewicz<br />
<a href="http://www.amazon.com/Automating-Microsoft-Windows-Server-PowerShell/dp/1118013867/ref=sr_1_1?s=books&amp;ie=UTF8&amp;qid=1320673692&amp;sr=1-1">http://www.amazon.com/Automating-Microsoft-Windows-Server-PowerShell/dp/1118013867/ref=sr_1_1?s=books&amp;ie=UTF8&amp;qid=1320673692&amp;sr=1-1<br />
</a></li>
<li>Windows PowerShell Command Builder<br />
<a href="http://www.microsoft.com/resources/TechNet/en-us/Office/media/WindowsPowerShell/WindowsPowerShellCommandBuilder.html">http://www.microsoft.com/resources/TechNet/en-us/Office/media/WindowsPowerShell/WindowsPowerShellCommandBuilder.html</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://mike-greene.com/2012/01/making-life-easier-with-powershell-spsvb-2012/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

