<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" gd:etag="W/&quot;DUUHSHs6cSp7ImA9WxNUFk4.&quot;"><id>tag:blogger.com,1999:blog-13524907</id><updated>2009-11-07T18:40:39.519-05:00</updated><title>Things that Should be Easy</title><subtitle type="html">Every so often (too often in the IT industry) I encounter things that should have been very easy to do but turned out to be far too complicated.  Hopefully posting them here will allow others to avoid the same issues.</subtitle><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://thingsthatshouldbeeasy.blogspot.com/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://thingsthatshouldbeeasy.blogspot.com/" /><link rel="hub" href="http://pubsubhubbub.appspot.com/" /><link rel="next" type="application/atom+xml" href="http://www.blogger.com/feeds/13524907/posts/default?start-index=26&amp;max-results=25&amp;redirect=false&amp;v=2" /><author><name>Eugene Rosenfeld [former MOSS MVP]</name><uri>http://www.blogger.com/profile/07177988916544941383</uri><email>noreply@blogger.com</email></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>66</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><link rel="self" href="http://feeds.feedburner.com/ThingsThatShouldBeEasy" type="application/atom+xml" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><entry gd:etag="W/&quot;DkcFSXw_cSp7ImA9WxNVFko.&quot;"><id>tag:blogger.com,1999:blog-13524907.post-573013100285255619</id><published>2009-10-27T16:06:00.001-04:00</published><updated>2009-10-27T16:06:58.249-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-10-27T16:06:58.249-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="LSaaS" /><category scheme="http://www.blogger.com/atom/ns#" term="Cloud computing" /><category scheme="http://www.blogger.com/atom/ns#" term="SaaS" /><title>Stormy Skies for Cloud Computing</title><content type="html">&lt;p&gt;I don’t know about you, but I’m somewhat confused about all the hype over “cloud computing”. Don’t get me wrong, accessing services on the Internet makes sense, sometimes. What I don’t understand is how many people tout cloud computing as the silver bullet for all of our IT ills; you know, the way virtualization was supposed to solve all of our problems? That will be a different post. Back to the point. The Web 2.0 Journal has a &lt;a href="http://web2.sys-con.com/node/640237" target="_blank"&gt;nice enumeration of the benefits to cloud computing&lt;/a&gt;. First I’d like to comment on these benefits. &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h3&gt;What the vendors tell you&lt;/h3&gt;  &lt;p&gt;“&lt;i&gt;&lt;strong&gt;Reduced Cost&lt;/strong&gt; - &lt;/i&gt;Cloud technology is paid incrementally, saving organizations money.“ &lt;/p&gt;  &lt;p&gt;My comment: It depends on what cost your talking about. Making use of hosted services provides a cost-effective way to start initially deploying a capability to your organization.&amp;#160; However, it’s like renting an apartment vs. buying a house: you never stop paying rent. The service fee is a constant monthly expense that never goes away. Need a second service? There’s another monthly fee. The problem of course is that you never actually get ROI with this model. It’s more like a reverse ROI. You start out ahead of the game because you had few start up costs. But after a few months, you get further and further behind, because at some point you’ve paid as much in service fees as it would have cost to do the implementation in house. And you keep on paying. Indefinitely.&lt;/p&gt;  &lt;p&gt;Check out my post on &lt;a href="http://thingsthatshouldbeeasy.blogspot.com/2009/09/how-to-get-started-with-sharepoint-on.html"&gt;getting started with SharePoint on the cheap&lt;/a&gt; where I show how you can get started with SharePoint in house for $1100, with no recurring costs. That setup will support between 500 to 1000 users and provide over 100 GB of storage. Comparable hosting plans would cost between $55-$80 per month (more if you exceed the small amount of storage that comes with most plans by using document versions). That means that the in-house implementation of SharePoint would actually come out cheaper than the hosted option somewhere between 14 to 20 months. ROI within 18 months is considered good in the industry.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;i&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p&gt;&lt;i&gt;“&lt;strong&gt;Increased Storage&lt;/strong&gt; - &lt;/i&gt;Organizations can store more data than on private computer systems.” &lt;/p&gt;  &lt;p&gt;My comment: Storage is cheap. In fact, storage is one of the cheapest IT commodities you can buy today. You can get &lt;a href="http://www.pcconnection.com/IPA/Shop/Product/Detail.htm?sku=9954943&amp;amp;oext=1038A&amp;amp;ci_src=14110944&amp;amp;ci_sku=9954943" target="_blank"&gt;4 TB of business-class storage for under $6,000&lt;/a&gt;. Compare that to a &lt;a href="http://www.123together.com/SharePoint/Dedicated_SharePoint_Services_v3_and_123Together.xhtml" target="_blank"&gt;hosted SharePoint service offering with only 1 TB of storage for $4,000 per month&lt;/a&gt;. What IT commodity is significantly more expensive than storage? WAN bandwidth. Cloud computing model uses WAN bandwidth like it’s going out of style. See the “What the vendors don’t tell you” section of this post for more on the topic.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;i&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p&gt;&lt;i&gt;“&lt;strong&gt;Highly Automated&lt;/strong&gt; - &lt;/i&gt;No longer do IT personnel need to worry about keeping software up to date.”&lt;/p&gt;  &lt;p&gt;My comment: There is an obsessive compulsive disorder in IT circles called “software updates”. Many administrators think that they need to apply the latest hot fix or service pack the moment it comes out. It’s ok to talk about it. I had this problem too. Do you know what I discovered happens if you don’t apply most of these updates? Absolutely nothing. Servers keep running. In fact, by not applying the latest update you mitigate the risk of that update breaking your application. So, while letting the hosting provider keep the software up to date is nice, it is of questionable business benefit and can lead to misbehaving applications or unexpected downtime.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;i&gt;“&lt;strong&gt;Flexibility &lt;/strong&gt;- &lt;/i&gt;Cloud computing offers much more flexibility than past computing methods.” &lt;/p&gt;  &lt;p&gt;My comment: I have a few thoughts on this one. First, while cloud computing can provide more flexibility, more flexibility is not necessarily better. If an in-house system has enough flexibility, adding more flexibility may not offer any business benefit. Second, the most inflexible part of an organization may be the people. Every time you something in IT changes, users need to get retained. That training is time consuming and costly (time = money) . Third, Has anyone asked why there is a need for so much flexibility? Could it be a symptom of poor planning? Why not deal with the problem’s root cause rather than the symptom?&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;i&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p&gt;&lt;i&gt;“&lt;strong&gt;More Mobility&lt;/strong&gt; - &lt;/i&gt;Employees can access information wherever they are, rather than having to remain at their desks.”. &lt;/p&gt;  &lt;p&gt;My comment: This is great, but you don’t need to have your service hosted in the cloud. Get an Internet domain name and a DNS service like &lt;a href="http://www.no-ip.com/services/managed_dns/plus_dynamic_dns.html" target="_blank"&gt;No-IP Plus&lt;/a&gt; ($25 per year). You can make your in-house web application Internet-accessible in less than an hour.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;i&gt;“&lt;strong&gt;Allows IT to Shift Focus&lt;/strong&gt; - &lt;/i&gt;No longer having to worry about constant server updates and other computing issues, government organizations will be free to concentrate on innovation.”&lt;/p&gt;  &lt;p&gt;My comment: See my comment in the &amp;quot;&lt;strong&gt;Highly Automated&lt;/strong&gt;“ section for my thoughts on chasing server updates. We have AD, Exchange, SharePoint, SQL Server, and TFS in house, and have no full-time IT support personnel. How do we do this? By keeping our filthy hands off of the servers. Best of all, we don’t need to pay hosting service fees for the privilege of not touching the servers. Not monkeying with existing servers allows us to focus on delivering new capability.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Next I’d like to add a one more item people often attribute to hosted systems and comment on that item: “&lt;strong&gt;Increased reliability&lt;/strong&gt;”. There a general feeling that service providers in the cloud can do a better job of ensuring system uptime than other organizations can. In some cases I think this is true, especially when taking about specialized hosting companies. However, many cloud service providers do not fall into that category. Remember the now infamous &lt;a href="http://forums.t-mobile.com/tmbl/?category.id=Sidekick" target="_blank"&gt;T-Mobile Sidekick data loss&lt;/a&gt; incident? I guess “carrier-grade” doesn’t mean what it used it. There is no guarantee that a service providers will do a better job of ensuring service reliability than you will. &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Along the same lines as service reliability is “&lt;strong&gt;service availability&lt;/strong&gt;”. While service reliability refers to the service running, service availability refers to users actually being able to get to the service, two completely different things. When the service is running on the same LAN as the users, service availability pretty much equals service reliability. I.e., if the service is running users can most likely get to the service. It’s a different story when the service is running in the cloud and users need to access the service over the WAN. Lets face it, Internet connections go down. Speeds fluctuate. Granted, downtime for this reason doesn’t happen often, but when it does things can be very frustrating.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_z3BYpxQRvUs/SudS4JzxznI/AAAAAAAAAFQ/oNor_hvoSgQ/s1600-h/img0103.jpg"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="system down due to storm" border="0" alt="system down due to storm" src="http://lh6.ggpht.com/_z3BYpxQRvUs/SudS4SJRXgI/AAAAAAAAAFU/9RTJBC6i3kI/img010_thumb1.jpg?imgmax=800" width="644" height="484" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h3&gt;What the vendors don’t tell you&lt;/h3&gt;  &lt;p&gt;Now I’d like to point out some of cloud computing’s dirty little secrets. Few people in the industry talk about these, and customers don’t find out until after they’ve signed a 1-year contract.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Single sign-on&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Single sign-on (SSO) is the concept that a user has to enter his or her credentials into one system, and that the credentials would get propagated into all other systems that the user needs to access. For example, a user would login to his or her desktop computer and would be able to access the organization’s email and portal systems without additional logins. For most organizations running Microsoft software in-house, this is a daily reality because all of the organizations systems are running off of the same user directory service, the organization’s Active Directory. But what happens when the organization makes use of the hosted service in the cloud? That service has its own usernames and passwords. Users now have an additional login for the hosted service. Web browsers can help by caching user credentials on their desktops, but there are other desktop applications that don’t do as good a job with that. The issue multiplies as the organization adds additional services, each service requiring its own username and password.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;WAN vs. LAN bandwidth&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;How much bandwidth do most organizations have on their LANs? Most have 1000 Mbps. How much bandwidth do these organizations have on their WANs? Usually less than 10 Mbps. That means that most organizations have roughly 100 times the bandwidth on the LANs as no their WANs. That’s important since the organizations’ users access cloud services through the WAN. Users will perceive even well-implemented cloud services as being much slower and unresponsive as compared to mediocrely implemented in0house services. The cloud service is slower, the problem lies with the users’ limited bandwidth in accessing the cloud service.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;WAN vs. LAN reliability &lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;How often does your LAN go down? How often does your WAN go down? Imagine losing access to all of your organization’s services in the event of an Internet connection loss? More is available in the previous section of this post titled “&lt;strong&gt;service availability”&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;System integration&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;One of the best outcomes to increasing numbers of software vendors’ adoption of open interfaces and API standards in their software is customers’ ability to make the systems their organizations rely on to operate as a single system, rather than a collection of desperate applications. New business capabilities like business intelligence were now possible. What if an organization wanted this capability but relied on hosted services for some of its systems? Let’s say that an organization had an internal Active Directory and mail system, but made use of one vendors hosted ecommerce service and another vendor’s hosted CRM service. Seems reasonable so far? The organization wants to to answer a simple question: how many customers who have purchased from the organization within the past 6 months have emailed their sales representative directly after a purchase? This question requires data from the AD, email, ecommerce, and CRM systems. Getting to that data is hard, because the CRM and ecommerce systems must be accessed over a WAN connection. This makes the processes of getting to the vast data the systems hold very painful. We also hope that there is some way to correlate the various data entities between the systems: orders, customers, email addresses, sales people, etc.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h3&gt;Conclusion&lt;/h3&gt;  &lt;p&gt;There’s a lot of buzz about delivering software as a service (SaaS). I think that SaaS / cloud computing / utility computing will definitely be a good delivery model for some types of computing capabilities. But, there are just too many benefits to running services co-located with users to make locally running services go away anytime soon. My colleague, &lt;a href="http://www.blackbladeinc.com/en-us/aboutus/Pages/BradleyThomasSmith.aspx" target="_blank"&gt;Brad Smith&lt;/a&gt; came up with a much better alternative to either model: localized software as a service (LSaaS). Briefly put, the LSaaS software delivery model makes use of hosted services as a pure SaaS model does. However, rather than users accessing a hosted service directly, the LSaaS model places an extension to the hosted service into an organization’s office. Users access the service local extension over the LAN. That service extension may communicate with the hosted service in the cloud on an as-needed basis. See my &lt;a href="http://thingsthatshouldbeeasy.blogspot.com/2009/10/getting-paid-for-your-sharepoint.html"&gt;previous post on how an LSaaS software delivery model&lt;/a&gt; can simplify software licensing and copy protection while avoiding the pitfalls with a pure SaaS delivery model. I believe that more and more vendors will start using the LSaaS software deliver model in the next few years.We certainly will.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:d2962511-5039-4eb6-af8c-086684550e0d" class="wlWriterEditableSmartContent"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/SaaS" rel="tag"&gt;SaaS&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Cloud+computing" rel="tag"&gt;Cloud computing&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Utility+computing" rel="tag"&gt;Utility computing&lt;/a&gt;,&lt;a href="http://technorati.com/tags/LSaaS" rel="tag"&gt;LSaaS&lt;/a&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13524907-573013100285255619?l=thingsthatshouldbeeasy.blogspot.com'/&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/Tes_I1I0N2RxRhfNkAvDMHZv2mE/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Tes_I1I0N2RxRhfNkAvDMHZv2mE/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/Tes_I1I0N2RxRhfNkAvDMHZv2mE/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Tes_I1I0N2RxRhfNkAvDMHZv2mE/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ThingsThatShouldBeEasy/~4/CLOD19QUDvY" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://thingsthatshouldbeeasy.blogspot.com/feeds/573013100285255619/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=13524907&amp;postID=573013100285255619" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/13524907/posts/default/573013100285255619?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/13524907/posts/default/573013100285255619?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ThingsThatShouldBeEasy/~3/CLOD19QUDvY/stormy-skies-for-cloud-computing.html" title="Stormy Skies for Cloud Computing" /><author><name>Eugene Rosenfeld [former MOSS MVP]</name><uri>http://www.blogger.com/profile/07177988916544941383</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="04308528651051363456" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://thingsthatshouldbeeasy.blogspot.com/2009/10/stormy-skies-for-cloud-computing.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Dk4FRnozcSp7ImA9WxNVEUk.&quot;"><id>tag:blogger.com,1999:blog-13524907.post-4946175277812387028</id><published>2009-10-21T13:08:00.001-04:00</published><updated>2009-10-21T13:08:37.489-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-10-21T13:08:37.489-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Facebook" /><category scheme="http://www.blogger.com/atom/ns#" term="Cloud computing" /><category scheme="http://www.blogger.com/atom/ns#" term="Twitter" /><category scheme="http://www.blogger.com/atom/ns#" term="Microsoft" /><title>The Next Web: Twitter-Facebook AND Twitter-Microsoft deal confirmed</title><content type="html">&lt;p&gt;The Next Web reports that a &lt;a href="http://thenextweb.com/2009/10/21/breaking-twitterfacebook-twittermicrosoft-deal-confirmed" target="_blank"&gt;deal between Twitter and Microsoft&lt;/a&gt; will be announced at the Web 2.0 Summit. &lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;“What’s particularly unique is the deal is with both Microsoft AND Facebook and the company plans to integrate deeply with both company’s products and services, namely Bing and Facebook.com.”&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Microsoft has already announced &lt;a href="http://thenextweb.com/2009/06/01/microsoft-brings-twitter-facebook-xbox/" target="_blank"&gt;Twitter and Facebook integration with XBox Live&lt;/a&gt;. What’s next? Twitter and Facebook integration with SharePoint 2010? Here’s hoping. That would make for some real SharePoint 2010 cloud integration.&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:cba02c1b-099b-4263-a94a-a493147366f4" class="wlWriterEditableSmartContent"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/Microsoft" rel="tag"&gt;Microsoft&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Twitter" rel="tag"&gt;Twitter&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Facebook" rel="tag"&gt;Facebook&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Cloud+computing" rel="tag"&gt;Cloud computing&lt;/a&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13524907-4946175277812387028?l=thingsthatshouldbeeasy.blogspot.com'/&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/TrWoHCewR6SxXGq7EeVuSS6RBvw/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/TrWoHCewR6SxXGq7EeVuSS6RBvw/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/TrWoHCewR6SxXGq7EeVuSS6RBvw/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/TrWoHCewR6SxXGq7EeVuSS6RBvw/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ThingsThatShouldBeEasy/~4/WKPNtzT61qw" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://thingsthatshouldbeeasy.blogspot.com/feeds/4946175277812387028/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=13524907&amp;postID=4946175277812387028" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/13524907/posts/default/4946175277812387028?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/13524907/posts/default/4946175277812387028?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ThingsThatShouldBeEasy/~3/WKPNtzT61qw/next-web-twitter-facebook-and-twitter.html" title="The Next Web: Twitter-Facebook AND Twitter-Microsoft deal confirmed" /><author><name>Eugene Rosenfeld [former MOSS MVP]</name><uri>http://www.blogger.com/profile/07177988916544941383</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="04308528651051363456" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://thingsthatshouldbeeasy.blogspot.com/2009/10/next-web-twitter-facebook-and-twitter.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEcNR3Y9cCp7ImA9WxNVEEs.&quot;"><id>tag:blogger.com,1999:blog-13524907.post-6883822134441968880</id><published>2009-10-20T15:14:00.001-04:00</published><updated>2009-10-20T15:14:56.868-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-10-20T15:14:56.868-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="x64" /><category scheme="http://www.blogger.com/atom/ns#" term="SharePoint 2010" /><category scheme="http://www.blogger.com/atom/ns#" term="SharePoint" /><category scheme="http://www.blogger.com/atom/ns#" term="WSS" /><category scheme="http://www.blogger.com/atom/ns#" term="MOSS" /><title>SharePoint 2010 public beta and general release announced</title><content type="html">&lt;p&gt;Microsoft issued a press release announcing the both the public beta of SharePoint 2010 and its general release. The public beta will be available November 2009, along with the public betas of Office 2010, Project 2010 and Visio 2010. The general release for SharePoint 2010 is slated for the first half of 2010.&lt;/p&gt;  &lt;p&gt;From the &lt;a href="http://www.microsoft.com/presspass/press/2009/oct09/10-19mssharepointconf09pr.mspx" target="_blank"&gt;Microsoft press release&lt;/a&gt;:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;em&gt;The public betas of Microsoft SharePoint Server 2010, Office 2010, Project 2010 and Visio 2010 will become available in November 2009; more information is available at &lt;/em&gt;&lt;a href="http://go.microsoft.com/?linkid=9689707"&gt;&lt;em&gt;http://go.microsoft.com/?linkid=9689707&lt;/em&gt;&lt;/a&gt;&lt;em&gt;. &lt;/em&gt;&lt;/p&gt;    &lt;p&gt;&lt;em&gt;Microsoft SharePoint Server 2010 will be available in the first half of 2010. More information about Microsoft SharePoint Server 2010 can be found at &lt;/em&gt;&lt;a href="http://www.microsoft.com/sharepoint"&gt;&lt;em&gt;http://www.microsoft.com/sharepoint&lt;/em&gt;&lt;/a&gt;&lt;em&gt;. &lt;/em&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Remember that SharePoint 2010 will be an x64-only release. That means you will need to install it onto an x64 version of Windows Server.&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:a7c1849d-736d-465e-9a1c-7f8be1567b95" class="wlWriterEditableSmartContent"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/SharePoint" rel="tag"&gt;SharePoint&lt;/a&gt;,&lt;a href="http://technorati.com/tags/WSS" rel="tag"&gt;WSS&lt;/a&gt;,&lt;a href="http://technorati.com/tags/MOSS+2007" rel="tag"&gt;MOSS 2007&lt;/a&gt;,&lt;a href="http://technorati.com/tags/SharePoint+2010" rel="tag"&gt;SharePoint 2010&lt;/a&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13524907-6883822134441968880?l=thingsthatshouldbeeasy.blogspot.com'/&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/UtKpRBIjlXYhMGWf7Xj7PkG1OaQ/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/UtKpRBIjlXYhMGWf7Xj7PkG1OaQ/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/UtKpRBIjlXYhMGWf7Xj7PkG1OaQ/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/UtKpRBIjlXYhMGWf7Xj7PkG1OaQ/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ThingsThatShouldBeEasy/~4/TTvLTgRCtaI" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://thingsthatshouldbeeasy.blogspot.com/feeds/6883822134441968880/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=13524907&amp;postID=6883822134441968880" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/13524907/posts/default/6883822134441968880?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/13524907/posts/default/6883822134441968880?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ThingsThatShouldBeEasy/~3/TTvLTgRCtaI/sharepoint-2010-public-beta-and-general.html" title="SharePoint 2010 public beta and general release announced" /><author><name>Eugene Rosenfeld [former MOSS MVP]</name><uri>http://www.blogger.com/profile/07177988916544941383</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="04308528651051363456" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://thingsthatshouldbeeasy.blogspot.com/2009/10/sharepoint-2010-public-beta-and-general.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkIMSHY4cCp7ImA9WxNVEEg.&quot;"><id>tag:blogger.com,1999:blog-13524907.post-2185133140223293612</id><published>2009-10-20T13:09:00.001-04:00</published><updated>2009-10-20T13:09:49.838-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-10-20T13:09:49.838-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="SharePoint Conference 2009" /><category scheme="http://www.blogger.com/atom/ns#" term="SharePoint Foundation" /><category scheme="http://www.blogger.com/atom/ns#" term="SharePoint 2010" /><category scheme="http://www.blogger.com/atom/ns#" term="SharePoint" /><category scheme="http://www.blogger.com/atom/ns#" term="WSS" /><category scheme="http://www.blogger.com/atom/ns#" term="MOSS" /><title>Watch SharePoint Conference 2009 video highlights on demand</title><content type="html">&lt;p&gt;Do you wish you were at the Microsoft SharePoint Conference 2009? Me too. Watch selected conference video highlights here:&lt;/p&gt;  &lt;p&gt;&lt;a title="http://www.mssharepointconference.com/Pages/videohighlights.aspx" href="http://www.mssharepointconference.com/Pages/videohighlights.aspx"&gt;http://www.mssharepointconference.com/Pages/videohighlights.aspx&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Tom Rizzo, Senior Director for SharePoint, recaps the news and announcements that Steve Ballmer and Jeff Teper shared with the SharePoint Conference 2009 attendees. He also shared some fun facts that you might not have know about the conference. &lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.mssharepointconference.com/pages/videoplayer.aspx?vhid=1"&gt;&lt;img border="0" src="http://www.mssharepointconference.com/SCSPictures/icon_spc2009video.gif" /&gt;&lt;/a&gt;    &lt;br /&gt;&lt;a name="1"&gt;&lt;/a&gt;&lt;b&gt;&lt;a href="http://www.mssharepointconference.com/pages/videoplayer.aspx?vhid=1"&gt;Tom Rizzo's News of the Day&lt;/a&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Before diving in to the SharePoint 2010 take a moment to look back at the amazing solutions customers have built on Microsoft Office SharePoint 2007.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.mssharepointconference.com/pages/videoplayer.aspx?vhid=4"&gt;&lt;img border="0" src="http://www.mssharepointconference.com/SCSPictures/SP_Open_FINAL.png" /&gt;&lt;/a&gt;    &lt;br /&gt;&lt;a name="4"&gt;&lt;/a&gt;&lt;b&gt;&lt;a href="http://www.mssharepointconference.com/pages/videoplayer.aspx?vhid=4"&gt;SharePoint Conference 2009 Opening Video&lt;/a&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Hear what our customers are already saying about SharePoint 2010. See what they’re most excited about after trying it out and their plans for future deployment.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.mssharepointconference.com/pages/videoplayer.aspx?vhid=5"&gt;&lt;img border="0" src="http://www.mssharepointconference.com/SCSPictures/Prod_Excitement_Master.png" /&gt;&lt;/a&gt;    &lt;br /&gt;&lt;a name="5"&gt;&lt;/a&gt;&lt;b&gt;&lt;a href="http://www.mssharepointconference.com/pages/videoplayer.aspx?vhid=5"&gt;SharePoint 2010 Customer Excitement&lt;/a&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Watch this short video to see SharePoint Conference 2009 come together on location in Las Vegas and learn what it takes to bring it together, such as the number of labor days and the miles of CAT 5e cable.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.mssharepointconference.com/pages/videoplayer.aspx?vhid=6"&gt;&lt;img border="0" src="http://www.mssharepointconference.com/SCSPictures/icon_spc2009video.gif" /&gt;&lt;/a&gt;    &lt;br /&gt;&lt;a name="6"&gt;&lt;/a&gt;&lt;b&gt;&lt;a href="http://www.mssharepointconference.com/pages/videoplayer.aspx?vhid=6"&gt;Time Lapse Footage&lt;/a&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:4c700e36-d94a-442c-82d7-8404ac3085c7" class="wlWriterEditableSmartContent"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/SharePoint" rel="tag"&gt;SharePoint&lt;/a&gt;,&lt;a href="http://technorati.com/tags/WSS" rel="tag"&gt;WSS&lt;/a&gt;,&lt;a href="http://technorati.com/tags/SharePoint+Conference+2009" rel="tag"&gt;SharePoint Conference 2009&lt;/a&gt;,&lt;a href="http://technorati.com/tags/SharePoint+2010" rel="tag"&gt;SharePoint 2010&lt;/a&gt;,&lt;a href="http://technorati.com/tags/SharePoint+Foundation" rel="tag"&gt;SharePoint Foundation&lt;/a&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13524907-2185133140223293612?l=thingsthatshouldbeeasy.blogspot.com'/&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/Y2TC5dKzt9bn1HKKR1Vv8-rBfgc/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Y2TC5dKzt9bn1HKKR1Vv8-rBfgc/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/Y2TC5dKzt9bn1HKKR1Vv8-rBfgc/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Y2TC5dKzt9bn1HKKR1Vv8-rBfgc/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ThingsThatShouldBeEasy/~4/_OahGj2mVYI" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://thingsthatshouldbeeasy.blogspot.com/feeds/2185133140223293612/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=13524907&amp;postID=2185133140223293612" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/13524907/posts/default/2185133140223293612?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/13524907/posts/default/2185133140223293612?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ThingsThatShouldBeEasy/~3/_OahGj2mVYI/watch-sharepoint-conference-2009-video.html" title="Watch SharePoint Conference 2009 video highlights on demand" /><author><name>Eugene Rosenfeld [former MOSS MVP]</name><uri>http://www.blogger.com/profile/07177988916544941383</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="04308528651051363456" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total><feedburner:origLink>http://thingsthatshouldbeeasy.blogspot.com/2009/10/watch-sharepoint-conference-2009-video.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkUMSH84fyp7ImA9WxNVEEg.&quot;"><id>tag:blogger.com,1999:blog-13524907.post-8693449609551012245</id><published>2009-10-20T13:04:00.001-04:00</published><updated>2009-10-20T13:04:49.137-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-10-20T13:04:49.137-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="SharePoint Conference 2009" /><category scheme="http://www.blogger.com/atom/ns#" term="SharePoint Foundation" /><category scheme="http://www.blogger.com/atom/ns#" term="SharePoint 2010" /><category scheme="http://www.blogger.com/atom/ns#" term="SharePoint" /><category scheme="http://www.blogger.com/atom/ns#" term="WSS" /><category scheme="http://www.blogger.com/atom/ns#" term="MOSS" /><category scheme="http://www.blogger.com/atom/ns#" term="Microsoft" /><title>Watch the SharePoint Conference 2009 keynote on demand</title><content type="html">&lt;p&gt;Do you wish you were at the Microsoft SharePoint Conference 2009? Me too. But, you can watch the keynote here:&lt;/p&gt;  &lt;p&gt;&lt;a title="http://www.mssharepointconference.com/Pages/default.aspx" href="http://www.mssharepointconference.com/Pages/default.aspx"&gt;http://www.mssharepointconference.com/Pages/default.aspx&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;The keynote had lots of great content including loads of SharePoint demos such as the new SharePoint UI, Excel Services, Performance Point, FAST Search, and more. See Steve Ballmer, Jeff Teper, and others deliver the first true glimpses of what promises to be the best release of SharePoint ever.&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:7cd0f261-f5e4-4dfe-8493-ddb6ab2fcdca" class="wlWriterEditableSmartContent"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/SharePoint" rel="tag"&gt;SharePoint&lt;/a&gt;,&lt;a href="http://technorati.com/tags/SharePoint+2010" rel="tag"&gt;SharePoint 2010&lt;/a&gt;,&lt;a href="http://technorati.com/tags/WSS" rel="tag"&gt;WSS&lt;/a&gt;,&lt;a href="http://technorati.com/tags/MOSS+2007" rel="tag"&gt;MOSS 2007&lt;/a&gt;,&lt;a href="http://technorati.com/tags/SharePoint+Foundation" rel="tag"&gt;SharePoint Foundation&lt;/a&gt;,&lt;a href="http://technorati.com/tags/SharePoint+Conference+2009" rel="tag"&gt;SharePoint Conference 2009&lt;/a&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13524907-8693449609551012245?l=thingsthatshouldbeeasy.blogspot.com'/&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/_bbioatiGj6tEkiifw0NYayeAqs/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/_bbioatiGj6tEkiifw0NYayeAqs/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/_bbioatiGj6tEkiifw0NYayeAqs/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/_bbioatiGj6tEkiifw0NYayeAqs/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ThingsThatShouldBeEasy/~4/Ug9b5uIIGIY" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://thingsthatshouldbeeasy.blogspot.com/feeds/8693449609551012245/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=13524907&amp;postID=8693449609551012245" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/13524907/posts/default/8693449609551012245?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/13524907/posts/default/8693449609551012245?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ThingsThatShouldBeEasy/~3/Ug9b5uIIGIY/watch-sharepoint-conference-2009.html" title="Watch the SharePoint Conference 2009 keynote on demand" /><author><name>Eugene Rosenfeld [former MOSS MVP]</name><uri>http://www.blogger.com/profile/07177988916544941383</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="04308528651051363456" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://thingsthatshouldbeeasy.blogspot.com/2009/10/watch-sharepoint-conference-2009.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEMEQnY8fCp7ImA9WxNVEE4.&quot;"><id>tag:blogger.com,1999:blog-13524907.post-274931251563541746</id><published>2009-10-20T07:00:00.001-04:00</published><updated>2009-10-20T07:00:03.874-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-10-20T07:00:03.874-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="SharePoint 2010" /><category scheme="http://www.blogger.com/atom/ns#" term="SharePoint" /><category scheme="http://www.blogger.com/atom/ns#" term="WSS" /><category scheme="http://www.blogger.com/atom/ns#" term="Speaking" /><category scheme="http://www.blogger.com/atom/ns#" term="MOSS" /><title>Getting paid for your SharePoint software, part 4</title><content type="html">&lt;h3&gt;Table of contents&lt;/h3&gt;  &lt;div&gt;&lt;a href="http://thingsthatshouldbeeasy.blogspot.com/2009/07/getting-paid-for-your-sharepoint.html" target="_blank"&gt;Part 1&lt;/a&gt;     &lt;br /&gt;&lt;a href="http://thingsthatshouldbeeasy.blogspot.com/2009/07/getting-paid-for-your-sharepoint_11.html" target="_blank"&gt;Part 2&lt;/a&gt;     &lt;br /&gt;&lt;a href="http://thingsthatshouldbeeasy.blogspot.com/2009/07/getting-paid-for-your-sharepoint_16.html" target="_blank"&gt;Part 3&lt;/a&gt;     &lt;br /&gt;Part 4&amp;#160;&amp;#160; &amp;lt;--- You are here     &lt;br /&gt;    &lt;br /&gt;    &lt;hr /&gt;    &lt;br /&gt;This is the fourth part of my series on getting paid for your SharePoint software. If you have not already done so, please read &lt;a href="http://thingsthatshouldbeeasy.blogspot.com/2009/07/getting-paid-for-your-sharepoint.html"&gt;part 1&lt;/a&gt;, &lt;a href="http://thingsthatshouldbeeasy.blogspot.com/2009/07/getting-paid-for-your-sharepoint_11.html"&gt;part 2&lt;/a&gt;, and &lt;a href="http://thingsthatshouldbeeasy.blogspot.com/2009/07/getting-paid-for-your-sharepoint_16.html"&gt;part 3&lt;/a&gt;.     &lt;br /&gt;    &lt;br /&gt;In part 1, I discussed how you need to be able to do four things to transform a piece of software into a product that you can get paid for: &lt;/div&gt;  &lt;ol&gt;   &lt;li&gt;Distribute the software &lt;/li&gt;    &lt;li&gt;Deploy the software &lt;/li&gt;    &lt;li&gt;License the software &lt;/li&gt;    &lt;li&gt;Copy protect the software &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;Of these, licensing and copy-protecting the software prove to be the most difficult on the SharePoint platform. &lt;/p&gt;  &lt;p&gt;In part 2, I laid out two options that address licensing and copy-protecting SharePoint software:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Licensing and copy-protecting the installer &lt;/li&gt;    &lt;li&gt;Licensing and copy-protecting the application assemblies &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;While the first option is the easiest way to get started, it also provides the least amount of protection and capabilities. The second option is what you would ultimately want to get to, but it can require a significant level of effort to implement, somewhere between several weeks to several months.&lt;/p&gt;  &lt;p&gt;In part 3 I showed how we could use a services or cloud computing application architecture to give us additional licensing and copy-protection options beyond what I covered in part 2. Unfortunately, we uncovered new challenges that arise from this architecture, namely:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Customer’s WAN bandwidth limitations &lt;/li&gt;    &lt;li&gt;Security and multi-tenancy concerns about the hosted service &lt;/li&gt;    &lt;li&gt;User context maintenance and single sign on (SSO) &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;So does that mean that a services architecture just exchanges one set of problems for another? Not necessarily. In fact, we can see that all of the issues arise from the fact that the service was hosted outside of the customer’s environment and shared among many customers. Let us examine a an alternate approach where the service the web parts access is hosted not on the Internet but in the customer’s network. My colleague &lt;a href="http://www.blackbladeinc.com/en-us/aboutus/Pages/BradleyThomasSmith.aspx" target="_blank"&gt;Bradley Smith&lt;/a&gt; termed this approach as &lt;strong&gt;Localized Software as a Service (LSaaS)&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h3&gt;&lt;strong&gt;&lt;font size="4"&gt;Option 4: Localized Software as a Service (LSaaS)&lt;/font&gt;&lt;/strong&gt;&lt;/h3&gt;  &lt;p&gt;The LSaaS application architecture leverages the benefits on services oriented architecture (SOA) and cloud computing application delivery models. However, LSaaS extends “the cloud” into the customer’s data center. Whereas a SaaS software delivery model requires that all service requests traverse the customer’s WAN to the service vendor’s Internet-based service instance, LSaaS instantiates one or more instances of the service in the customer’s datacenter.&lt;/p&gt;  &lt;p&gt;The main advantage of LSaaS over traditional SaaS is that LSaaS gains the benefits that SaaS offers in terms of ease of licensing and copy protection, but LSaaS mitigates the issues that arise with a pure SaaS approach, namely:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Limited WAN bandwidth &lt;/li&gt;    &lt;li&gt;Risks of multi-tenancy &lt;/li&gt;    &lt;li&gt;Loss of user context when invoking the service &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;For a more detailed description of these potential issues, please see the “&lt;strong&gt;All services all the time?”&lt;/strong&gt; section of &lt;a href="http://thingsthatshouldbeeasy.blogspot.com/2009/07/getting-paid-for-your-sharepoint_16.html" target="_blank"&gt;part 3&lt;/a&gt; of this series. Let’s see what our licensing and copy protection options look like:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Licensing – LSaaS licensing options are very similar to the SaaS options discussed in part 3. Additionally, LSaaS software delivery schemes also allow for service-instance-based licensing models. The idea is that each instantiation of your service running at the customer’s site can deliver a well-defined, quantifiable amount of service capacity. If the customer needs additional capacity, they will require additional instances of the service. Each additional service instance requires the customer pay an additional fee.      &lt;br /&gt;&amp;#160; &lt;br /&gt;The key to making this licensing model work is that the service instance must deliver a predictable, quantifiable level of service capacity. How you define the capacity depends on what your service does. Popular capacity quantifiers include data storage, processing speed, processing throughput,&amp;#160; Here are some examples of companies using service-instance-based license models to deliver their software as LSaaS:       &lt;br /&gt;&amp;#160; &lt;ul&gt;       &lt;li&gt;Black Blade Associate’s &lt;a href="http://www.blackbladeinc.com/pages/docblock.aspx" target="_blank"&gt;docBlock Ascend&lt;/a&gt; (disclaimer: I work for Black Blade)           &lt;br /&gt;&amp;#160; &lt;br /&gt;The docBlock Ascend provides virtual document processing to the SharePoint platform. Black Blade charges a flat fee for each docBlock server appliance. Each appliance has two load-balanced processing modules. For the purposes of licensing, you can think of each processing module as a virtual document service instance. Each processing module (service instance) can process 4 virtual documents per minute. “4 virtual documents per minute” is the quantifiable service capacity per service instance.           &lt;br /&gt;          &lt;br /&gt;If the customer needs to process more than 8 virtual documents per minute, they must order additional docBlock devices. There are no per-user, per site collection, per SharePoint server, or any other types of additional fees or license complexity. Simple huh?           &lt;br /&gt;&lt;/li&gt;        &lt;li&gt;&lt;a href="http://www.google.com/enterprise/search/gsa.html" target="_blank"&gt;Google Search Appliance&lt;/a&gt;           &lt;br /&gt;          &lt;br /&gt;The Google Search Appliance (GSA) provides enterprise search capability for a variety of content sources. Each GSA is a single service instance and can index 1,000,000 documents, the service capacity. If a customer needs to index more documents, they buy more GSAs.           &lt;br /&gt;          &lt;br /&gt;The SharePoint connectors for the GSA are free and even code with source code. Why doesn’t Google charge for the connectors too? The more document repositories are connected to a GSA, the faster the customer will exceed the GSAs service capacity and buy another GSA.           &lt;br /&gt;          &lt;br /&gt;&lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;Copy-protection – As with the SaaS software distribution option discussed in part 3, copy-protection is no longer needed for the web parts or other components deployed to the customer’s SharePoint farm, as these components are just the service client and should be freely distributable.      &lt;br /&gt;&amp;#160; &lt;br /&gt;However, unlike the SaaS option, the LSaaS service instance you are deploying to the customer’s site does need to be copy protected. The best way to achieve this is to create a service deployment model that ensures that only your service is running on a given operating system instance. That way you can write management code that ensures that everything on the operating system instance, including the operating system components, conforms to a valid instance of you service. Black Blade, Google, and other vendors accomplish this copy protection by distributing their service instances as server hardware appliances.       &lt;br /&gt;&amp;#160; &lt;/li&gt;    &lt;li&gt;Level of effort - As with the SaaS software distribution option discussed in part 3, the level of effort for actually doing the licensing and copy protection is fairly low. However, architecting or re-architecting an application to use a service model can be high, especially if a high percentage of the application’s codebase makes direct calls into the SharePoint object model. There is also additional effort involved beyond that which was required for a hosted service in creating an administration and management interface for your service instances. While you can get away with running direct SQL queries and editing raw XML files to configure your hosted service, I would strongly advise creating a more end-user friendly administration experience for the LSaaS service instances you deploy to customer sites. If you are going the appliance route for your LSaaS service instances, you will need to become familiar with shell scripting, writing unmanaged (C/C++) code, and WMI.      &lt;br /&gt;&lt;/li&gt; &lt;/ul&gt;  &lt;h3&gt;Which option is best?&lt;/h3&gt;  &lt;p&gt;It depends. You weren’t expecting a more definitive answer, were you :-) Let me elaborate a bit. If you are just getting started with a product idea, have a product that is mostly user interface, or have limited resources to implement licensing and copy-protection components, I would suggest starting with option 1 (adding licensing and copy protection to the installer only), discussed in &lt;a href="http://thingsthatshouldbeeasy.blogspot.com/2009/07/getting-paid-for-your-sharepoint_11.html" target="_blank"&gt;part 2&lt;/a&gt; of this series. Once you have a product that is generating some income and you have some more resources to devote to implementing licensing and copy-protection, look at option 2 (adding licensing and copy protection to the installer and the application assemblies), discussed in &lt;a href="http://thingsthatshouldbeeasy.blogspot.com/2009/07/getting-paid-for-your-sharepoint_11.html" target="_blank"&gt;part 2&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;If you have some serious resources you can devote to implementing or revamping your product (say 3-6+ moths worth) and your product provides value through more than just a nice user interface, i.e. the product has a service layer, you will be able to look at option 3 (delivering the product using a SaaS model), discussed in &lt;a href="http://thingsthatshouldbeeasy.blogspot.com/2009/07/getting-paid-for-your-sharepoint_16.html" target="_blank"&gt;part 3&lt;/a&gt; or option 4 (delivering the product using a LSaaS model), discussed above. Although option 4 has a higher level of effort than option 3, both options require roughly the same magnitude of effort to implement. The key question to ask to determine to which service model (SaaS or LSaaS) you should use to deliver your product is: Where does the bulk of the data the service needs to process reside, at the customer’s site or on the Internet? By that I mean which location has the most data, measured in bytes, that the service needs to act upon, the client’s site or the Internet? &lt;/p&gt;  &lt;p&gt;If the bulk of the data, again measured in bytes, resides on the Internet, then you can easily use a SaaS model (option 3) for delivering your software. If the bulk of the data the service needs resides in the customer’s site, then you should use an LSaaS model (option 4) to deploy your service. This is not just an academic exercise. I went through this decision process for each of the products we sell at &lt;a href="http://www.blackbladeinc.com/en-us/products" target="_blank"&gt;Black Blade Associates&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h3&gt;Conclusion &lt;/h3&gt;  &lt;p&gt;This concludes my “Getting paid for your SharePoint software” series. My goal in writing this series was to encourage more developers to start thinking about getting real returns on their SharePoint expertise by monetizing their SharePoint software. A platform like SharePoint can only achieve true success if customers can procure additional platform capability as supported products, not just consulting services. With the impending release of SharePoint 2010, this is a great time to start developing sellable software products for the SharePoint platform.&lt;/p&gt;  &lt;div&gt;&amp;#160;&lt;/div&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:8aedb0b4-fc3b-41b6-a360-da3636dc99d3" class="wlWriterEditableSmartContent"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/SharePoint" rel="tag"&gt;SharePoint&lt;/a&gt;,&lt;a href="http://technorati.com/tags/WSS" rel="tag"&gt;WSS&lt;/a&gt;,&lt;a href="http://technorati.com/tags/MOSS+2007" rel="tag"&gt;MOSS 2007&lt;/a&gt;,&lt;a href="http://technorati.com/tags/SharePoint+2010" rel="tag"&gt;SharePoint 2010&lt;/a&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13524907-274931251563541746?l=thingsthatshouldbeeasy.blogspot.com'/&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/a7nDREYhnBwFGeWzqs5Oo9unqEI/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/a7nDREYhnBwFGeWzqs5Oo9unqEI/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/a7nDREYhnBwFGeWzqs5Oo9unqEI/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/a7nDREYhnBwFGeWzqs5Oo9unqEI/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ThingsThatShouldBeEasy/~4/kj1Js76zObE" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://thingsthatshouldbeeasy.blogspot.com/feeds/274931251563541746/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=13524907&amp;postID=274931251563541746" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/13524907/posts/default/274931251563541746?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/13524907/posts/default/274931251563541746?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ThingsThatShouldBeEasy/~3/kj1Js76zObE/getting-paid-for-your-sharepoint.html" title="Getting paid for your SharePoint software, part 4" /><author><name>Eugene Rosenfeld [former MOSS MVP]</name><uri>http://www.blogger.com/profile/07177988916544941383</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="04308528651051363456" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total><feedburner:origLink>http://thingsthatshouldbeeasy.blogspot.com/2009/10/getting-paid-for-your-sharepoint.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0UHRnw8fip7ImA9WxNVEEk.&quot;"><id>tag:blogger.com,1999:blog-13524907.post-6861733889283334162</id><published>2009-10-20T07:00:00.000-04:00</published><updated>2009-10-20T10:33:57.276-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-10-20T10:33:57.276-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="SharePoint Designer 2007" /><category scheme="http://www.blogger.com/atom/ns#" term="SharePoint 2010" /><category scheme="http://www.blogger.com/atom/ns#" term="SharePoint" /><category scheme="http://www.blogger.com/atom/ns#" term="WSS" /><category scheme="http://www.blogger.com/atom/ns#" term="C#" /><category scheme="http://www.blogger.com/atom/ns#" term="Visual Studio" /><category scheme="http://www.blogger.com/atom/ns#" term="MOSS" /><title>Visual Studio 2010 Beta 2 has new SharePoint 2010 development tools</title><content type="html">&lt;p&gt;Download the Visual Studio 2010 beta and check out the SharePoint 2010 walkthroughs and how to’s here:&lt;/p&gt;  &lt;p&gt;&lt;a title="http://msdn.microsoft.com/en-us/vstudio/dd441784.aspx" href="http://msdn.microsoft.com/en-us/vstudio/dd441784.aspx"&gt;http://msdn.microsoft.com/en-us/vstudio/dd441784.aspx&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Walkthroughs&lt;/strong&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ee231604(VS.100).aspx"&gt;Add Feature Event Receivers&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ee231593(VS.100).aspx"&gt;Create a Custom Field, Content Type, List Definition, and List Instance&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ee231583(VS.100).aspx"&gt;Create a Site Definition Project&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ee231580(VS.100).aspx"&gt;Import a SharePoint Designer Reusable Workflow into Visual Studio 2010&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ee231603(VS.100).aspx"&gt;Import Items from an Existing SharePoint Site&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ee231551(VS.100).aspx"&gt;Creating a Web Part for SharePoint&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ee231546(VS.100).aspx"&gt;Creating a Web Part for SharePoint by Using a Designer&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ee231574(VS.100).aspx"&gt;Create a Custom Site Workflow Activity&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ee231590(VS.100).aspx"&gt;Creating a Workflow with Association and Initiation Forms&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ee231573(VS.100).aspx"&gt;Creating and Debugging a SharePoint Workflow Solution&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ee231598(VS.100).aspx"&gt;Add an Application Page to a Workflow&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ee231557(VS.100).aspx"&gt;Creating an Application Page&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ee231515(VS.100).aspx"&gt;Creating an External List in SharePoint List by Using Business Data&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ee231526(VS.100).aspx"&gt;Deploying a Project Task List Definition&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;strong&gt;How To...&lt;/strong&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ee231571(VS.100).aspx"&gt;Add and Remove Features to a Package by Using the Package Designer&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ee231549(VS.100).aspx"&gt;Add or Remove SharePoint Connections&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ee231601(VS.100).aspx"&gt;Create a BDC Model&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ee231563(VS.100).aspx"&gt;Create an Event Receiver&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ee231599(VS.100).aspx"&gt;Customize a SharePoint Feature&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;The Catch&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;What’s the catch? The SharePoint development tools included in Visual Studio 2010 are exclusively for SharePoint 2010.&amp;#160; What can you use to accelerate your SharePoint 2007 development today? Check out &lt;a href="http://www.codeplex.com/wspbuilder" target="_blank"&gt;WSPBuilder&lt;/a&gt;. WSPBuilder is an open-source tool and add-in for Visual Studio 2008 that not only automates a lot of the manual tasks of creating a SharePoint solution package (WSP file), but also comes with lots of Visual Studio templates for SharePoint artifacts, like web parts, features, content types, etc…. There’s a &lt;a href="http://www.zimmergren.net/archive/2009/04/08/wspbuilder-walkthrough-of-the-visual-studio-add-in.aspx" target="_blank"&gt;great WSPBuilder walkthrough by Tobias Zimmergren&lt;/a&gt; here. &lt;/p&gt;  &lt;p&gt;Then. look at &lt;a href="http://www.codeplex.com/sharepointinstaller" target="_blank"&gt;SharePoint Solution Installer&lt;/a&gt;. SharePoint Solution Installer will take any WSP package and wrap it in a very friendly wizard interface. Next, next, next, and the WSP you created using WSPBuilder is deployed to the entire SharePoint farm.&lt;/p&gt;  &lt;p&gt;&lt;img title="InstallerCheck.jpg" alt="InstallerCheck.jpg" src="http://i3.codeplex.com/Project/Download/FileDownload.aspx?ProjectName=sharepointinstaller&amp;amp;DownloadId=18625" /&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:d1c3f292-55eb-435a-8cd0-711faa3f7eac" class="wlWriterEditableSmartContent"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/C%23" rel="tag"&gt;C#&lt;/a&gt;,&lt;a href="http://technorati.com/tags/SharePoint+2010" rel="tag"&gt;SharePoint 2010&lt;/a&gt;,&lt;a href="http://technorati.com/tags/SharePoint" rel="tag"&gt;SharePoint&lt;/a&gt;,&lt;a href="http://technorati.com/tags/WSS" rel="tag"&gt;WSS&lt;/a&gt;,&lt;a href="http://technorati.com/tags/MOSS" rel="tag"&gt;MOSS&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Visual+Studio" rel="tag"&gt;Visual Studio&lt;/a&gt;,&lt;a href="http://technorati.com/tags/SharePoint+Designer" rel="tag"&gt;SharePoint Designer&lt;/a&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13524907-6861733889283334162?l=thingsthatshouldbeeasy.blogspot.com'/&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/uO8Dhizxnx5Gj_KDthktfsjikOk/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/uO8Dhizxnx5Gj_KDthktfsjikOk/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/uO8Dhizxnx5Gj_KDthktfsjikOk/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/uO8Dhizxnx5Gj_KDthktfsjikOk/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ThingsThatShouldBeEasy/~4/ofv_B-_J-4U" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://thingsthatshouldbeeasy.blogspot.com/feeds/6861733889283334162/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=13524907&amp;postID=6861733889283334162" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/13524907/posts/default/6861733889283334162?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/13524907/posts/default/6861733889283334162?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ThingsThatShouldBeEasy/~3/ofv_B-_J-4U/visual-studio-2010-beta-1-has-new.html" title="Visual Studio 2010 Beta 2 has new SharePoint 2010 development tools" /><author><name>Eugene Rosenfeld [former MOSS MVP]</name><uri>http://www.blogger.com/profile/07177988916544941383</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="04308528651051363456" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://thingsthatshouldbeeasy.blogspot.com/2009/10/visual-studio-2010-beta-1-has-new.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A04MRHs7fCp7ImA9WxNWFEU.&quot;"><id>tag:blogger.com,1999:blog-13524907.post-4354098779773757821</id><published>2009-10-13T07:05:00.000-04:00</published><updated>2009-10-13T23:13:05.504-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-10-13T23:13:05.504-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="SharePoint Portal Server 2003" /><category scheme="http://www.blogger.com/atom/ns#" term="SharePoint" /><category scheme="http://www.blogger.com/atom/ns#" term="WSS" /><category scheme="http://www.blogger.com/atom/ns#" term="C#" /><category scheme="http://www.blogger.com/atom/ns#" term="MOSS" /><title>Impersonation options in SharePoint code</title><content type="html">&lt;p&gt;When creating web parts, event receivers, timer jobs and other SharePoint code, I often find that I need to temporarily grant the code more permissions than the current user has. I’ve found that many developers either don’t know what options they have for user impersonation through code or are confused as to the subtle differences between the various options. &lt;/p&gt;  &lt;h3&gt;Impersonate the application pool identity&lt;/h3&gt;  &lt;p&gt;WSS V3 introduced the RunWithElevatedPrivileges method of the SPSecurity class. The RunWithElevatedPrivileges method impersonates the identity of the IIS application pool serving the current SharePoint request. The RunWithElevatedPrivileges method accepts a delegate method with no parameters. The RunWithElevatedPrivileges method impersonates the identity of the IIS application pool serving the current SharePoint request just prior to executing the user-specified delegate method. Once the delegate method has completed execution, the RunWithElevatedPrivileges method reverts the identity back to current user identity. Best of all: you don’t even need to know the username or password of the application pool identity. Here is some sample code that deletes a tasks list while impersonating the application pool identity:&lt;/p&gt;  &lt;div id="codeSnippetWrapper"&gt;   &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;Guid siteid = SPContext.Current.Site.ID;&lt;br /&gt;Guid webid = SPContext.Current.Web.ID;&lt;br /&gt; &lt;br /&gt;SPSecurity.RunWithElevatedPrivileges(&lt;span style="color: #0000ff"&gt;delegate&lt;/span&gt;()&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;using&lt;/span&gt; (SPSite site = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; SPSite(siteid))&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;using&lt;/span&gt; (SPWeb web = site.OpenWeb(webid))&lt;br /&gt;        {&lt;br /&gt;            SPList taskList = web.Lists[&lt;span style="color: #006080"&gt;&amp;quot;Tasks&amp;quot;&lt;/span&gt;];&lt;br /&gt;            taskList.Delete();&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;});&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;  &lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;There are a few gotchas of which you should be aware when using the RunWithElevatedPrivileges method:&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;br /&gt;  &lt;li&gt;You code will need a the proper level of code access security (CAS) permissions in order to run the RunWithElevatedPrivileges method. &lt;/li&gt;&lt;br /&gt;&lt;br /&gt;  &lt;li&gt;While impersonating the IIS application pool identity will give your code the highest level of permission within the current SharePoint web application, your code will have minimal permissions within other SharePoint web applications. This usually makes the RunWithElevatedPrivileges method a poor choice if you need to access a different SharePoint web application from the one in which the code is currently executing. &lt;/li&gt;&lt;br /&gt;&lt;br /&gt;  &lt;li&gt;According to SharePoint deployment best practices, IIS application pool identities should have minimal permissions on the SharePoint web servers. This means that your code may have minimal access to the underlying web server while executing within the RunWithElevatedPrivileges delegate method. You may not be able to do things like write to the Windows Event logs, work with temporary files, access the registry, or any other web server resource that requires a high privilege level. &lt;/li&gt;&lt;br /&gt;&lt;br /&gt;  &lt;li&gt;This method was implemented in WSS V3, so it will be unavailable in WSS V2 or SharePoint Portal Server 2003. &lt;/li&gt;&lt;br /&gt;&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&amp;#160;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Impersonate the application pool identity, take 2&lt;/h3&gt;&lt;br /&gt;&lt;br /&gt;&lt;h6&gt;&lt;/h6&gt;&lt;br /&gt;&lt;br /&gt;&lt;hr /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;font color="#ff8000"&gt;Update&lt;/font&gt;: Thanks to &lt;a href="http://www.blogger.com/profile/09737649506812317658" target="_blank"&gt;Jonas&lt;/a&gt; for correcting me and apologies to &lt;a href="http://sharepoint.mindsharpblogs.com/Todd" target="_blank"&gt;Todd&lt;/a&gt; for misquoting him. &lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;hr /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;a href="http://mindsharpblogs.com/todd/archive/2005/05/03/467.aspx" target="_blank"&gt;Todd Bleaker, SharePoint MVP&lt;/a&gt;, clued me in to this technique. Normally the .Net Framework System.Security.Principal.WindowsIdentity.Impersonate method accepts an integer value corresponding to a Win32 logon token. However, there is a neat trick you can use with the method: if you pass in a zero pointer (System.IntPtr.Zero), the method will allow your code to run as the identity of the IIS application pool serving the current SharePoint request. As with the RunWithElevatedPrivileges method, you do not need a username or password to do the impersonation. However, unlike the RunWithElevatedPrivileges method, you can use this technique with WSS V2 and SharePoint Portal Server 2003. Here is the same code as in the previous example, but altered to use this impersonation method:&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;div id="codeSnippetWrapper"&gt;&lt;br /&gt;  &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;&lt;span style="color: #0000ff"&gt;private&lt;/span&gt; WindowsImpersonationContext ctx = &lt;span style="color: #0000ff"&gt;null&lt;/span&gt;;&lt;br /&gt;ctx = WindowsIdentity.Impersonate(System.IntPtr.Zero);&lt;br /&gt; &lt;br /&gt;&lt;span style="color: #0000ff"&gt;using&lt;/span&gt; (SPSite site = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; SPSite(siteid))&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;using&lt;/span&gt; (SPWeb web = site.OpenWeb(webid))&lt;br /&gt;    {&lt;br /&gt;        SPList taskList = web.Lists[&lt;span style="color: #006080"&gt;&amp;quot;Tasks&amp;quot;&lt;/span&gt;];&lt;br /&gt;        taskList.Delete();&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt; &lt;br /&gt;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (ctx != &lt;span style="color: #0000ff"&gt;null&lt;/span&gt;)&lt;br /&gt;    ctx.Undo();&lt;br /&gt; &lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;  &lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div id="codeSnippetWrapper"&gt;&lt;br /&gt;  &lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;This impersonation method has the same caveats as the RunWithElevatedPrivileges method technique, except that this will work with WSS V2 and SharePoint Portal Server 2003:&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;br /&gt;  &lt;li&gt;You code will need a the proper level of code access security (CAS) permissions in order to run the impersonation, WSS_Medium, according to &lt;a href="http://mindsharpblogs.com/todd/archive/2005/05/03/467.aspx" target="_blank"&gt;Todd Bleaker’s article&lt;/a&gt;. &lt;/li&gt;&lt;br /&gt;&lt;br /&gt;  &lt;li&gt;While impersonating the IIS application pool identity will give your code the highest level of permission within the current SharePoint web application, your code will have minimal permissions within other SharePoint web applications. This usually makes impersonating the application pool identity a poor choice if you need to access a different SharePoint web application from the one in which the code is currently executing. &lt;/li&gt;&lt;br /&gt;&lt;br /&gt;  &lt;li&gt;According to SharePoint deployment best practices, IIS application pool identities should have minimal permissions on the SharePoint web servers. This means that your code may have minimal access to the underlying web server while executing within the RunWithElevatedPrivileges delegate method. You may not be able to do things like write to the Windows Event logs, work with temporary files, access the registry, or any other web server resource that requires a high privilege level. &lt;/li&gt;&lt;br /&gt;&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&amp;#160;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Impersonate a named user account&lt;a href="http://thingsthatshouldbeeasy.blogspot.com/2009/08/runas-in-c.html" target="_blank"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;While you can use the System.Security.Principal.WindowsIdentity.Impersonate method to impersonate the Local System account, the real purpose of the method is to allow you to impersonate named user accounts, such as mydomain\jsmith. The .Net Framework has a nice model for handling the impersonation context once you have a logon token but is somewhat vague on the mechanics of actually getting logon tokens. My &lt;a href="http://thingsthatshouldbeeasy.blogspot.com/2009/08/runas-in-c.html" target="_blank"&gt;RunAs in C#&lt;/a&gt; article with source code details how to get these elusive logon tokens and execute your code in the generated impersonation context. The article wraps the LogonUser Win32 API. The main benefit to this approach is that you can execute code as any user you want, as long as you know the user’s username and password. This includes doing highly privileged operations within SharePoint, SharePoint farm servers, or any other server on the network. Here is a code sample that executes a file move using user-supplied credentials:&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;div id="codeSnippetWrapper"&gt;&lt;br /&gt;  &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;BlackBlade.Utilities.SecurityUtilities.RunAs(&lt;span style="color: #0000ff"&gt;delegate&lt;/span&gt;()&lt;br /&gt;    {&lt;br /&gt;        File.Move(“local_file”, “network_file_location”);&lt;br /&gt;    },&lt;br /&gt;    “a_username”,&lt;br /&gt;    “some_password”);&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;  &lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;What are the catches:&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;br /&gt;  &lt;li&gt;You need to know the username and password of the account you want to impersonate. &lt;/li&gt;&lt;br /&gt;&lt;br /&gt;  &lt;li&gt;Accessing the Win32 API can generate non-intuitive error messages and be tough to debug. &lt;/li&gt;&lt;br /&gt;&lt;br /&gt;  &lt;li&gt;Finding a secure place to store the username and password of the account your impersonating can be tough. I recommend looking at the &lt;a href="http://technet.microsoft.com/en-us/library/cc262932.aspx" target="_blank"&gt;MOSS 2007 SSO infrastructure&lt;/a&gt;. &lt;/li&gt;&lt;br /&gt;&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&amp;#160;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Impersonate the Local System Account&lt;/h3&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Normally the LogonUser Win32 function used to get logon tokens for .Net impersonation requires a domain, username, and password to get a logon token. However, there is a neat trick you can use with the method: if you pass in “NT AUTHORITY” for the domain and “Local System” as the username, the method will allow your code to run as the Local System account. You do not need a password. The Development Hole blog has a great &lt;a href="http://geek.hubkey.com/2008/02/impersonating-built-in-service-account.html" target="_blank"&gt;article with code detailing how to impersonate Built-In service accounts&lt;/a&gt;. The Local System account can do pretty much anything on any SharePoint server in the farm. As with the other impersonation methods, you will need to manually revert the impersonation context. Here is some code that uses the Impersonate method to write an entry to the local SharePoint server’s Application event log:&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;div id="codeSnippetWrapper"&gt;&lt;br /&gt;  &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;using&lt;/span&gt; (Impersonation imp = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; Impersonation(BuiltinUser.NetworkService))&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.EventLog.WriteEntry(&lt;span style="color: #006080"&gt;&amp;quot;This line would throw an exception for most SharePoint users or even most application pool identities&amp;quot;&lt;/span&gt;);&lt;br /&gt;}&lt;br /&gt; &lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;  &lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div id="codeSnippetWrapper"&gt;If this method allows you to impersonate the Local System account and act as a local SharePoint server administrator at will, why would you not always want to use this impersonation method? Here are a couple of reasons:&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;br /&gt;  &lt;li&gt;This method always impersonates the web server’s Local System account, regardless of in which SharePoint web application the code is running. This can make it very difficult to track which web application is accessing the web server’s resources. &lt;/li&gt;&lt;br /&gt;&lt;br /&gt;  &lt;li&gt;In most cases, the Local System account will not have rights to any network resources, including SharePoint content or administrative tasks. While you’ll be able to do anything you want on the local web server, you will not be able to engage in any SharePoint-related activities. &lt;/li&gt;&lt;br /&gt;&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&amp;#160;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;&lt;br /&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:c71e7b6f-052e-4533-a269-39189e05f070" class="wlWriterEditableSmartContent"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/WSS" rel="tag"&gt;WSS&lt;/a&gt;,&lt;a href="http://technorati.com/tags/SharePoint" rel="tag"&gt;SharePoint&lt;/a&gt;,&lt;a href="http://technorati.com/tags/MOSS+2007" rel="tag"&gt;MOSS 2007&lt;/a&gt;,&lt;a href="http://technorati.com/tags/C%23" rel="tag"&gt;C#&lt;/a&gt;&lt;/div&gt;&lt;/h3&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13524907-4354098779773757821?l=thingsthatshouldbeeasy.blogspot.com'/&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/EhhDNz5O6dF5gnfVn0WdDwwIn9A/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/EhhDNz5O6dF5gnfVn0WdDwwIn9A/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/EhhDNz5O6dF5gnfVn0WdDwwIn9A/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/EhhDNz5O6dF5gnfVn0WdDwwIn9A/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ThingsThatShouldBeEasy/~4/6VX1xf011SY" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://thingsthatshouldbeeasy.blogspot.com/feeds/4354098779773757821/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=13524907&amp;postID=4354098779773757821" title="5 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/13524907/posts/default/4354098779773757821?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/13524907/posts/default/4354098779773757821?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ThingsThatShouldBeEasy/~3/6VX1xf011SY/impersonation-options-in-sharepoint.html" title="Impersonation options in SharePoint code" /><author><name>Eugene Rosenfeld [former MOSS MVP]</name><uri>http://www.blogger.com/profile/07177988916544941383</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="04308528651051363456" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">5</thr:total><feedburner:origLink>http://thingsthatshouldbeeasy.blogspot.com/2009/10/impersonation-options-in-sharepoint.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkQGQX0_fCp7ImA9WxNWEEw.&quot;"><id>tag:blogger.com,1999:blog-13524907.post-28281422139533843</id><published>2009-10-08T12:12:00.001-04:00</published><updated>2009-10-08T12:12:00.344-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-10-08T12:12:00.344-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="VMWare" /><category scheme="http://www.blogger.com/atom/ns#" term="Windows 7" /><category scheme="http://www.blogger.com/atom/ns#" term="Virtualization" /><title>VMware Workstation networking not working in Windows 7</title><content type="html">&lt;p&gt;I just upgraded my Vista x64 computer to Windows 7. When I started VMware Workstation 6.5.3 for the first time after the upgrade and launched a virtual machine, VMware displayed the following error:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;em&gt;The virtual network drivers on the host are incompatible with the installed VMware application. Expected version 5. Please reinstall the product.&lt;/em&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;a href="http://lh3.ggpht.com/_z3BYpxQRvUs/Ss4PSoq20BI/AAAAAAAAAFA/s9y_B96SiZU/s1600-h/image4.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://lh5.ggpht.com/_z3BYpxQRvUs/Ss4PTZ_hIBI/AAAAAAAAAFE/p32zrCIGPww/image_thumb6.png?imgmax=800" width="644" height="341" /&gt;&lt;/a&gt; &lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;The error sounds a lot worse than it actually is. Turns out that all I had to do to get things working was run a repair on VMware Workstation. You will need the VMware Workstation installation program. &lt;strong&gt;Do not &lt;/strong&gt;run the repair option from the &lt;strong&gt;Programs and Features&lt;/strong&gt; section of the Windows 7 Control Panel. If you do, you will receive a message box telling you to run the original VMware Workstation installation software, and the network repair will not complete properly.&lt;/p&gt;  &lt;p&gt;The repair process will take a while to complete, about 15 minutes on my computer. The installation software will remove and reinstall all of the virtual drivers, including the networking, on the host computer. You will need to restart your computer after the repair is complete.&lt;/p&gt;  &lt;p&gt;Once you restart your host computer, you may get an this error message:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;em&gt;Device driver software was not successfully installed.&lt;/em&gt;&lt;/p&gt;    &lt;p&gt;&lt;a href="http://lh6.ggpht.com/_z3BYpxQRvUs/Ss4PTvcVtgI/AAAAAAAAAFI/_pCorCTaxwA/s1600-h/image%5B5%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://lh3.ggpht.com/_z3BYpxQRvUs/Ss4PTyDBgvI/AAAAAAAAAFM/W15lQJ_-ZQg/image_thumb%5B2%5D.png?imgmax=800" width="672" height="256" /&gt;&lt;/a&gt; &lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;This is actually referring to the two network drivers VMware installs. I’ve only seen this on one computer so far, but as near as I can tell, there are no adverse affects yet.&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:13f2a970-96ca-4be8-a595-9d5002ce63cd" class="wlWriterEditableSmartContent"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/VMware" rel="tag"&gt;VMware&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Virtualization" rel="tag"&gt;Virtualization&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Windows+7" rel="tag"&gt;Windows 7&lt;/a&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13524907-28281422139533843?l=thingsthatshouldbeeasy.blogspot.com'/&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/yl0BpYwAn0jiZ9uo1Pu4F3mDdkw/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/yl0BpYwAn0jiZ9uo1Pu4F3mDdkw/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/yl0BpYwAn0jiZ9uo1Pu4F3mDdkw/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/yl0BpYwAn0jiZ9uo1Pu4F3mDdkw/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ThingsThatShouldBeEasy/~4/Mt8l3KuTGIo" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://thingsthatshouldbeeasy.blogspot.com/feeds/28281422139533843/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=13524907&amp;postID=28281422139533843" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/13524907/posts/default/28281422139533843?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/13524907/posts/default/28281422139533843?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ThingsThatShouldBeEasy/~3/Mt8l3KuTGIo/vmware-workstation-networking-not.html" title="VMware Workstation networking not working in Windows 7" /><author><name>Eugene Rosenfeld [former MOSS MVP]</name><uri>http://www.blogger.com/profile/07177988916544941383</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="04308528651051363456" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://thingsthatshouldbeeasy.blogspot.com/2009/10/vmware-workstation-networking-not.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0ADRX84cCp7ImA9WxNRFUU.&quot;"><id>tag:blogger.com,1999:blog-13524907.post-8389147130545882206</id><published>2009-09-10T07:19:00.000-04:00</published><updated>2009-09-10T07:22:54.138-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-09-10T07:22:54.138-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="SharePoint" /><category scheme="http://www.blogger.com/atom/ns#" term="WSS" /><category scheme="http://www.blogger.com/atom/ns#" term="C#" /><category scheme="http://www.blogger.com/atom/ns#" term="MOSS" /><title>How to: Add a folder to a SharePoint list using C#</title><content type="html">&lt;p&gt;Unlike adding folders to document libraries, adding folders to lists requires a bit more work in order for the folder to appear in the list view. For example, the following code will add a folder to the list, but the folder will be hidden and not show up in the list view:&lt;/p&gt;  &lt;div id="codeSnippetWrapper"&gt;   &lt;div style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;     &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum1"&gt;   1:&lt;/span&gt; &lt;span style="color: #008000"&gt;//get a reference to the SharePoint objects&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum2"&gt;   2:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;using&lt;/span&gt;(SPSite reportingSiteCollection = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; SPSite(“http:&lt;span style="color: #008000"&gt;//localhost”))&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum3"&gt;   3:&lt;/span&gt; {&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum4"&gt;   4:&lt;/span&gt;     &lt;span style="color: #0000ff"&gt;using&lt;/span&gt;(SPWeb reportingSite = reportingSiteCollection.OpenWeb())   &lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum5"&gt;   5:&lt;/span&gt;     {&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum6"&gt;   6:&lt;/span&gt;         &lt;span style="color: #008000"&gt;//get a reference to the list&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum7"&gt;   7:&lt;/span&gt;         SPList reportingList = reportingSite.Lists[“Reporting List”];&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum8"&gt;   8:&lt;/span&gt;         &lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum9"&gt;   9:&lt;/span&gt;         &lt;span style="color: #008000"&gt;//the following line will in fact create the folder, but the folder within the list, but there will be no list item associated with the folder, so the folder will not appear in any list views&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum10"&gt;  10:&lt;/span&gt;         reportingList.RootFolder.SubFolders.Add(“New_Folder_Name”); &lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum11"&gt;  11:&lt;/span&gt;     }&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum12"&gt;  12:&lt;/span&gt; }&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Instead, you need to add a list item using the SPFileSystemObjectType.Folder enumeration and call the update method on the newly created list item so that the folder the item represents will not only be added to the list but also be visible as a list item:&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;div id="codeSnippetWrapper"&gt;&lt;br /&gt;  &lt;div style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum1"&gt;   1:&lt;/span&gt; &lt;span style="color: #008000"&gt;//get a reference to the SharePoint objects&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum2"&gt;   2:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;using&lt;/span&gt;(SPSite reportingSiteCollection = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; SPSite(“http:&lt;span style="color: #008000"&gt;//localhost”))&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum3"&gt;   3:&lt;/span&gt; {&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum4"&gt;   4:&lt;/span&gt;     &lt;span style="color: #0000ff"&gt;using&lt;/span&gt;(SPWeb reportingSite = reportingSiteCollection.OpenWeb())&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum5"&gt;   5:&lt;/span&gt;     {&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum6"&gt;   6:&lt;/span&gt;         SPList reportingList = reportingSite.Lists[“Reporting List”];&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum7"&gt;   7:&lt;/span&gt;         &lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum8"&gt;   8:&lt;/span&gt;         &lt;span style="color: #008000"&gt;//the following line will in fact create the folder, but the folder within the list, but there will be no list item associated with the folder, so the folder will not appear in any list views&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum9"&gt;   9:&lt;/span&gt;         SPListItem newFolder = reportingList.Items.Add(reportingList.RootFolder.ServerRelativeUrl, SPFileSystemObjectType.Folder, “New_Folder_Name”); &lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum10"&gt;  10:&lt;/span&gt;         &lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum11"&gt;  11:&lt;/span&gt;         &lt;span style="color: #008000"&gt;//the following line will associate a list item with the newly created folder and make the folder visible in the list views&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum12"&gt;  12:&lt;/span&gt;         newFolder.Update();&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum13"&gt;  13:&lt;/span&gt;     }&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum14"&gt;  14:&lt;/span&gt; }&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:86d39886-e00f-4146-9a6a-8985a6253379" class="wlWriterEditableSmartContent"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/C%23" rel="tag"&gt;C#&lt;/a&gt;,&lt;a href="http://technorati.com/tags/WSS" rel="tag"&gt;WSS&lt;/a&gt;,&lt;a href="http://technorati.com/tags/SharePoint" rel="tag"&gt;SharePoint&lt;/a&gt;,&lt;a href="http://technorati.com/tags/MOSS" rel="tag"&gt;MOSS&lt;/a&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13524907-8389147130545882206?l=thingsthatshouldbeeasy.blogspot.com'/&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/DUzE5NFgqEtRB78Eke30UIILPwE/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/DUzE5NFgqEtRB78Eke30UIILPwE/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/DUzE5NFgqEtRB78Eke30UIILPwE/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/DUzE5NFgqEtRB78Eke30UIILPwE/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ThingsThatShouldBeEasy/~4/Cz_SZiqrkFE" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://thingsthatshouldbeeasy.blogspot.com/feeds/8389147130545882206/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=13524907&amp;postID=8389147130545882206" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/13524907/posts/default/8389147130545882206?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/13524907/posts/default/8389147130545882206?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ThingsThatShouldBeEasy/~3/Cz_SZiqrkFE/how-to-add-folder-to-sharepoint-list.html" title="How to: Add a folder to a SharePoint list using C#" /><author><name>Eugene Rosenfeld [former MOSS MVP]</name><uri>http://www.blogger.com/profile/07177988916544941383</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="04308528651051363456" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://thingsthatshouldbeeasy.blogspot.com/2009/09/how-to-add-folder-to-sharepoint-list.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUACQnk7eCp7ImA9WxNRFU0.&quot;"><id>tag:blogger.com,1999:blog-13524907.post-6095688115486532798</id><published>2009-09-09T09:41:00.000-04:00</published><updated>2009-09-09T09:42:43.700-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-09-09T09:42:43.700-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="SharePoint" /><category scheme="http://www.blogger.com/atom/ns#" term="WSS" /><category scheme="http://www.blogger.com/atom/ns#" term="MOSS" /><title>GetItems List Query Returns no Items</title><content type="html">&lt;p&gt;SharePoint’s SPList class contains the &lt;strong&gt;GetItems &lt;/strong&gt;method which is used to query the contents of a SharePoint list. Rather than iterating through all of the list’s items, the GetItems method allows you to specify a collaborative application markup language (CAML) query to return just the collection of items in which you are interested. It is like sending a SQL query to the SharePoint list. Clearly this is an indispensible method to know about when dealing with any non-trivial list.&lt;/p&gt;  &lt;p&gt;One would expect that in order for a call to GetItems to return data, the user invoking the code would need only Read permissions to the list. However, I have run into situations where a user had Read permissions to a list but the call to GetItems returned no data. I had already validated that the query worked by invoking the call to GetItems from another user.&lt;/p&gt;  &lt;p&gt;In those situations I could not get a call to GetItems to return any data unless the user had at least &lt;strong&gt;Contribute &lt;/strong&gt;permissions to the SharePoint web site that contained the list. This was the case even if the user had Contribute permissions to the list. Read permission to the SharePoint site or list were insufficient.&lt;/p&gt;  &lt;p&gt;I have not yet had time to nail down exactly what circumstances or configuration settings trigger this behavior. If others have seen this behavior and have more insight, I’d love to hear about it. For now, if you have a GetItems call that should be returning data but is not, before spending hours or days&amp;#160; changing around your code, try invoking the call from a user who has Contribute permissions to the site.&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:9fcae5b3-d9df-4564-b649-e0a3dca5be34" class="wlWriterEditableSmartContent"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/WSS" rel="tag"&gt;WSS&lt;/a&gt;,&lt;a href="http://technorati.com/tags/SharePoint" rel="tag"&gt;SharePoint&lt;/a&gt;,&lt;a href="http://technorati.com/tags/MOSS" rel="tag"&gt;MOSS&lt;/a&gt;,&lt;a href="http://technorati.com/tags/SPList" rel="tag"&gt;SPList&lt;/a&gt;,&lt;a href="http://technorati.com/tags/GetItems" rel="tag"&gt;GetItems&lt;/a&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13524907-6095688115486532798?l=thingsthatshouldbeeasy.blogspot.com'/&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/TW-agPRSYwl_r9f43rfHfGToLis/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/TW-agPRSYwl_r9f43rfHfGToLis/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/TW-agPRSYwl_r9f43rfHfGToLis/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/TW-agPRSYwl_r9f43rfHfGToLis/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ThingsThatShouldBeEasy/~4/uwokkp7Lf0c" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://thingsthatshouldbeeasy.blogspot.com/feeds/6095688115486532798/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=13524907&amp;postID=6095688115486532798" title="4 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/13524907/posts/default/6095688115486532798?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/13524907/posts/default/6095688115486532798?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ThingsThatShouldBeEasy/~3/uwokkp7Lf0c/getitems-list-query-returns-no-items.html" title="GetItems List Query Returns no Items" /><author><name>Eugene Rosenfeld [former MOSS MVP]</name><uri>http://www.blogger.com/profile/07177988916544941383</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="04308528651051363456" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">4</thr:total><feedburner:origLink>http://thingsthatshouldbeeasy.blogspot.com/2009/09/getitems-list-query-returns-no-items.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEADQ3c8fip7ImA9WxNRFEw.&quot;"><id>tag:blogger.com,1999:blog-13524907.post-4915741962425897432</id><published>2009-09-08T09:32:00.000-04:00</published><updated>2009-09-08T09:32:52.976-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-09-08T09:32:52.976-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="SharePoint" /><category scheme="http://www.blogger.com/atom/ns#" term="WSS" /><category scheme="http://www.blogger.com/atom/ns#" term="C#" /><category scheme="http://www.blogger.com/atom/ns#" term="MOSS" /><title>SharePoint WebConfigModifications.Add deletes elements from web.config</title><content type="html">&lt;p&gt;I was writing a SharePoint feature that had to register a custom HTTP module. Naturally I started looking at the SPWebConfigModification class and soon had some code that looked like it would add my HTTP module to the httpModules element in the SharePoint web.config file. I compiled, deployed, and activated the feature, and sure enough it worked. My HTTP module was added to the the httpModules element, and the code was even smart enough to detect that if my HTTP module were already registered it would not be registered more than once.&lt;/p&gt;  &lt;p&gt;I could have stopped there, but instead I stared getting fancy. I thought: I should check for the existence of the httpModules element itself. I recompiled, redeployed, reactivated the feature, and …. SharePoint died :( I checked the web.config and found that the only HTTP module registered was my HTTP module. All of SharePoint’s default HTTP modules were gone.&lt;/p&gt;  &lt;p&gt;I was dumbfounded. How could adding an element end up removing elements? I tried revising my code many different ways but to no avail. I looked at many code samples online that seemed to do the same thing I was doing and comments indicated that those code sample worked.&lt;/p&gt;  &lt;p&gt;Finally, a theory occurred to me. There was one difference I could think of between the code samples I saw and my coed: my code was checking for the existence of an element that is created by default when SharePoint creates a new IIS web site, while the online code samples were all checking for the existence of completely custom elements. I did a little digging and found that SharePoint seems use a static web.config file template rather than the SPWebConfigModification infrastructure to generate its baseline web.config files. As such, SPWebConfigModification.SPWebConfigModificationType.EnsureSection will not detect the existence of&amp;#160; element provisioned through the file, because there are no records in the SharePoint hierarchical object store regarding those elements. For your reference, the template web.config file is located at:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\12\CONFIG\web.config&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Where does that leave a coder who needs to add entries to SharePoint web.config files? Sadly it looks like the code needs to have two different logic paths: one logical path for adding completely custom element that needs to check for each part of the element path being added, and one logical path that only checks for the existence of custom elements within an element path that is part of an element provisioned from the web.config template file referenced above. Using this split logical flow, I’ve generated a code base that can reliably add web.config elements to any part of a SharePoint web.config file.&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:389ee28e-5a6b-4cf3-a117-61fa3b082a0a" class="wlWriterEditableSmartContent"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/WSS" rel="tag"&gt;WSS&lt;/a&gt;,&lt;a href="http://technorati.com/tags/MOSS" rel="tag"&gt;MOSS&lt;/a&gt;,&lt;a href="http://technorati.com/tags/SharePoint" rel="tag"&gt;SharePoint&lt;/a&gt;,&lt;a href="http://technorati.com/tags/SPWebConfigModification" rel="tag"&gt;SPWebConfigModification&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Web.config" rel="tag"&gt;Web.config&lt;/a&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13524907-4915741962425897432?l=thingsthatshouldbeeasy.blogspot.com'/&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/B4KUuKyL3HxRL-MydkglAmTaAZU/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/B4KUuKyL3HxRL-MydkglAmTaAZU/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/B4KUuKyL3HxRL-MydkglAmTaAZU/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/B4KUuKyL3HxRL-MydkglAmTaAZU/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ThingsThatShouldBeEasy/~4/-0badQnPbWg" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://thingsthatshouldbeeasy.blogspot.com/feeds/4915741962425897432/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=13524907&amp;postID=4915741962425897432" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/13524907/posts/default/4915741962425897432?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/13524907/posts/default/4915741962425897432?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ThingsThatShouldBeEasy/~3/-0badQnPbWg/sharepoint-webconfigmodificationsadd.html" title="SharePoint WebConfigModifications.Add deletes elements from web.config" /><author><name>Eugene Rosenfeld [former MOSS MVP]</name><uri>http://www.blogger.com/profile/07177988916544941383</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="04308528651051363456" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total><feedburner:origLink>http://thingsthatshouldbeeasy.blogspot.com/2009/09/sharepoint-webconfigmodificationsadd.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DE4BR349cCp7ImA9WxNRFEw.&quot;"><id>tag:blogger.com,1999:blog-13524907.post-2657445231252569069</id><published>2009-09-08T09:19:00.000-04:00</published><updated>2009-09-08T09:35:56.068-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-09-08T09:35:56.068-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Blog Readership" /><title>Expanding your blog readership</title><content type="html">&lt;p&gt;In a previous post I was happy the my readership &lt;a href="http://thingsthatshouldbeeasy.blogspot.com/2009/07/over-3000-visits-last-month.html" target="_blank"&gt;increased to 3000 readers per month&lt;/a&gt;, and I promised to share how some of my strategy reaching my next goal: 10,000 readers per month. Here’s some of advise I got from fellow MVPs, some Internet research, and my wife, who was involved in marketing for some big-name advertising agencies…&lt;/p&gt;  &lt;p&gt;Post regularly. It is better to post smaller amounts of content on a regular basis, than to post a lot of content sporadically. This will help you to get a reader base that is used to checking back with your blog on a regular basis rather than relying on the search engines to keep bringing you fresh readers with each post. In the past I would write very long articles that would take me a few weeks to complete. Now if I have a long article, I will break it into a multi-part series and publish each part as a separate post.&lt;/p&gt;  &lt;p&gt;Read and comment on other blogs. While writing your own content is great, you should also take the time to read other people’s posts on similar topics to your own. Comment on the posts. Many blogging engines allow you to associate you blog Url with the profile you use to make the comment. This will attract readers in two ways:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;People who read the other posts may visit your blog if they feel that you have content similar to the post they are already interested and reading.&lt;/li&gt;    &lt;li&gt;Search engines will see that other sites are linking to your blog and will increase your blog’s standing in the search results.&lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;Don’t mis-interpret what I’m suggesting. I’m not promoting spamming other people’s blog comments. What I am saying is that you should be active in the online community of which your blog is a part, beyond your own blog.&lt;/p&gt;  &lt;p&gt;My wife had told to me that the best time to send out a newsletter or announcement email was on Tuesday or Wednesday morning. Timing the an email that way could dramatically increase the likelihood that it would get read over sending it out on other days or times of days. I thought I would try and apply this same strategy to timing the publishing of my blog posts. No longer would I publish a post at 2:00 AM on a Thursday even if that is when I wrote the post. I would wait until the next Tuesday morning and publish the post by 9 AM local time. That way the new publication is at the top of everyone’s lists of new posts in the morning of a work day (Tuesday) when they’ve had a chance to catch up from the weekend (usually people catch up on Monday).&lt;/p&gt;  &lt;p&gt;So how are things going? So far so good. In the past 30 days, my readership has increased to 4,300 visits. That’s an increase of 43%. I’ll keep you posted.&lt;/p&gt;  &lt;div style="margin: 0px; padding: 0px; display: inline; float: none;" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:3baddcc8-6ce9-4c26-a8dc-1a9db450e451" class="wlWriterEditableSmartContent"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/Blog+readership" rel="tag"&gt;Blog readership&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13524907-2657445231252569069?l=thingsthatshouldbeeasy.blogspot.com'/&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/tekxGgmMJWJCc2LGYl7pmg1Z-CY/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/tekxGgmMJWJCc2LGYl7pmg1Z-CY/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/tekxGgmMJWJCc2LGYl7pmg1Z-CY/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/tekxGgmMJWJCc2LGYl7pmg1Z-CY/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ThingsThatShouldBeEasy/~4/ihOz90dcSKE" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://thingsthatshouldbeeasy.blogspot.com/feeds/2657445231252569069/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=13524907&amp;postID=2657445231252569069" title="4 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/13524907/posts/default/2657445231252569069?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/13524907/posts/default/2657445231252569069?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ThingsThatShouldBeEasy/~3/ihOz90dcSKE/expanding-your-blog-readership.html" title="Expanding your blog readership" /><author><name>Eugene Rosenfeld [former MOSS MVP]</name><uri>http://www.blogger.com/profile/07177988916544941383</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="04308528651051363456" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">4</thr:total><feedburner:origLink>http://thingsthatshouldbeeasy.blogspot.com/2009/09/expanding-your-blog-readership.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Dk8ERXcyeCp7ImA9WxNSGUo.&quot;"><id>tag:blogger.com,1999:blog-13524907.post-3086570821493382819</id><published>2009-09-03T06:46:00.001-04:00</published><updated>2009-09-03T06:46:44.990-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-09-03T06:46:44.990-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="SharePoint" /><category scheme="http://www.blogger.com/atom/ns#" term="WSS" /><category scheme="http://www.blogger.com/atom/ns#" term="ASP.Net" /><category scheme="http://www.blogger.com/atom/ns#" term="MOSS" /><title>How to: Choose between an ASP.Net Web Part and a SharePoint Web Part</title><content type="html">&lt;p&gt;A colleague of mine recently asked me if the WebPart he was writing should inherit from the ASP.Net WebPart class or the SharePoint WebPart class. He was a bit confused because he had seen a few articles online that talked about the benefits of inheriting from one class or the other. &lt;/p&gt;  &lt;p&gt;Some articles recommend using ASP.Net WebPart class for general ASP.Net interoperability while other articles recommend using the SharePoint WebPart class to gain access to its additional features. This &lt;a href="http://msdn.microsoft.com/en-us/library/ms415560.aspx" target="_blank"&gt;MSDN article&lt;/a&gt; enumerates the list of features provided exclusively by the Windows SharePoint Services &lt;strong&gt;WebPart&lt;/strong&gt; class:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;     &lt;p&gt;Cross page connections&lt;/p&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;p&gt;Connections between Web Parts that are outside of a Web Part zone&lt;/p&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;p&gt;Client-side connections (Web Part Page Services Component)&lt;/p&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;p&gt;A data caching infrastructure that allows caching to the content database&lt;/p&gt;   &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;My colleague was confused. He wanted the ASP.Net interoperability but he wasn’t sure if he would regret not having access to the additional SharePoint WebPart class’ feature.&lt;/p&gt;  &lt;p&gt;To my mind, the decision is very simple for most SharePoint developers: use the the SharePoint WebPart class. While the idea of general ASP.Net interoperability is nice, it is not likely to pan out. The reason: if you are writing a web part for SharePoint, you will likely want access to the SharePoint object model to work with list and document data, get SharePoint context, etc…. As soon as you add a reference to the Microsoft.SharePoint.dll assembly to your project and use any of its types, your assembly has already been strongly tied to SharePoint and will not work on a plain ASP.Net web site. If your assembly is already tied to SharePoint, then you may as well get the added functionality of the SharePoint WebPart by inheriting from it.&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:f509e707-d509-46a5-83ff-2e9d2d712ac0" class="wlWriterEditableSmartContent"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/WSS" rel="tag"&gt;WSS&lt;/a&gt;,&lt;a href="http://technorati.com/tags/SharePoint" rel="tag"&gt;SharePoint&lt;/a&gt;,&lt;a href="http://technorati.com/tags/MOSS" rel="tag"&gt;MOSS&lt;/a&gt;,&lt;a href="http://technorati.com/tags/ASP.Net" rel="tag"&gt;ASP.Net&lt;/a&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13524907-3086570821493382819?l=thingsthatshouldbeeasy.blogspot.com'/&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/0RdMfOCqrH8tHGttjWDN7wmXR9s/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/0RdMfOCqrH8tHGttjWDN7wmXR9s/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/0RdMfOCqrH8tHGttjWDN7wmXR9s/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/0RdMfOCqrH8tHGttjWDN7wmXR9s/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ThingsThatShouldBeEasy/~4/5SzyGpfQuxo" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://thingsthatshouldbeeasy.blogspot.com/feeds/3086570821493382819/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=13524907&amp;postID=3086570821493382819" title="7 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/13524907/posts/default/3086570821493382819?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/13524907/posts/default/3086570821493382819?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ThingsThatShouldBeEasy/~3/5SzyGpfQuxo/how-to-choose-between-aspnet-web-part.html" title="How to: Choose between an ASP.Net Web Part and a SharePoint Web Part" /><author><name>Eugene Rosenfeld [former MOSS MVP]</name><uri>http://www.blogger.com/profile/07177988916544941383</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="04308528651051363456" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">7</thr:total><feedburner:origLink>http://thingsthatshouldbeeasy.blogspot.com/2009/09/how-to-choose-between-aspnet-web-part.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkUEQHw4eSp7ImA9WxNSGE4.&quot;"><id>tag:blogger.com,1999:blog-13524907.post-588261637741340412</id><published>2009-09-01T16:50:00.001-04:00</published><updated>2009-09-01T16:50:01.231-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-09-01T16:50:01.231-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="SharePoint" /><category scheme="http://www.blogger.com/atom/ns#" term="WSS" /><title>How to: Get started with SharePoint on the cheap</title><content type="html">&lt;p&gt;I’ve seen a lot of articles about how it costs a lot of money to stand up a SharePoint server. I will show that this is simply not the case. In fact, you can stand up a production SharePoint server for less than $1100 USD, including both hardware and software costs. Now, I am specifically refereeing to doing so in production environment, so while you can use MSDN licenses for development, you can not use those here. Still, $1100 for hardware and software… that’s not too bad at all. Let’s see how.&lt;/p&gt;  &lt;p&gt;We need to start with the base operating system. SharePoint runs on the Windows Server operating system. Most SKUs of Windows Server require a client access license (CAL), except for Windows Server Web Edition. &lt;a href="http://www.microsoft.com/windowsserver2008/en/us/pricing.aspx" target="_blank"&gt;Windows Server Web Edition&lt;/a&gt; retails for $470 USD per server. The only catch is that the 2003 version of Windows Server Web Edition does not allow you to install the database software SharePoint uses for its database. You can of course run the database on a separate SQL Server instance, but that is more costly. Since we want to do SharePoint on the cheap, I will show you another option.&lt;/p&gt;  &lt;p&gt;Use SQL Server Express Edition. SQL Server 2005 or 2008 Express Edition is free, $0 USD. It has everything you need to stand up a single-server (not to be confused with Standalone) instance of SharePoint. Combine it with the SQL Server Express with Advanced Features, and you will also get a limited version of Reporting Services and SQL Server Management Studio. There is a nice description here about the &lt;a href="http://www.directionsonmicrosoft.com/sample/DOMIS/update/2008/02feb/0208ws2plp.htm" target="_blank"&gt;licensing terms of Windows Server Web Edition&lt;/a&gt; and its restrictions.&lt;/p&gt;  &lt;p&gt;Next, we need SharePoint. Since we’re doing this on the cheap, we’re obviously not looking at Microsoft Office SharePoint Server 2007 (MOSS) or Microsoft SharePoint Server 2010 (SharePoint 2010). We’re looking at Windows SharePoint Services 3.0 or 4.0 (WSS). WSS is an add-on for Windows Server. There is no additional server license cost or CAL associated with WSS. Once you pay for Windows Server, WSS is free, $0 USD.&lt;/p&gt;  &lt;p&gt;Finally we need some hardware. Thankfully hardware capable of running WSS has really come down in price over the past few years. Windows Web Server edition can handle up to 4 CPUs and 32 GB RAM. while the more quad-processor systems are still on the expensive side, you can pick up a dual-processor, multi-core system with up to 16 GB RAM for a very reasonable price. And, if you go for a refurbished system from a reputable reseller, you can walk away with a steel. My colleague found &lt;a href="http://www.buy.com/prod/dell-poweredge-sc1425-dual-xeon-3-6ghz-4gb-160gb-cd-1u-server-w-video/q/loc/101/listingid/45946152/211409429.html?adid=17992" target="_blank"&gt;this advertisement&lt;/a&gt; on Buy.com: Dell PowerEdge SC1425 Dual Xeon 3.6GHz 4GB 160GB CD 1U Server with 4 GB RAM onboard, expandable to 12 GB RAM for $320. Max out the RAM with an &lt;a href="http://www.crucial.com/search/searchresults.aspx?keywords=PowerEdge%20SC1425" target="_blank"&gt;additional 8 GB for $260&lt;/a&gt; and add an optional 3-year warranty for $50, and you’ve got a very capable SharePoint server for $630 USD.&lt;/p&gt;  &lt;p&gt;Here’s the final price list:&lt;/p&gt;  &lt;table border="0" cellspacing="0" cellpadding="2" width="707"&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td valign="top" width="613"&gt;&lt;strong&gt;Item&lt;/strong&gt;&lt;/td&gt;        &lt;td valign="top" width="92"&gt;         &lt;p align="right"&gt;&lt;strong&gt;Cost&lt;/strong&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="613"&gt;Windows Server 2008 x64 Web Edition&lt;/td&gt;        &lt;td valign="top" width="92"&gt;         &lt;p align="right"&gt;$470&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="613"&gt;Client Access Licensees&lt;/td&gt;        &lt;td valign="top" width="92"&gt;         &lt;p align="right"&gt;$0&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="613"&gt;SQL Server 2008 Express Edition with Advanced Features&lt;/td&gt;        &lt;td valign="top" width="92"&gt;         &lt;p align="right"&gt;$0&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="613"&gt;Windows SharePoint Services V3&lt;/td&gt;        &lt;td valign="top" width="92"&gt;         &lt;p align="right"&gt;$0&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="613"&gt;1U, Dual Proc server with 12 GB RAM, refurbished&lt;/td&gt;        &lt;td valign="top" width="92"&gt;         &lt;p align="right"&gt;$630&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="613"&gt;&lt;strong&gt;Total&lt;/strong&gt;&lt;/td&gt;        &lt;td valign="top" width="92"&gt;         &lt;p align="right"&gt;&lt;strong&gt;$1100&lt;/strong&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;p&gt;This setup would make for a great workgroup or even departmental server. it could easily handle the a 500 user load. It’s not quite free SharePoint, but for $1100, it’s pretty darn close.&lt;/p&gt;  &lt;p&gt;   &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:efdf7fa1-9b55-4831-b5b4-27dbce7bbd75" class="wlWriterEditableSmartContent"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/WSS" rel="tag"&gt;WSS&lt;/a&gt;,&lt;a href="http://technorati.com/tags/SharePoint" rel="tag"&gt;SharePoint&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Free" rel="tag"&gt;Free&lt;/a&gt;&lt;/div&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13524907-588261637741340412?l=thingsthatshouldbeeasy.blogspot.com'/&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/tKyHzVHjOyOpAxH2i4mBFGgjAWc/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/tKyHzVHjOyOpAxH2i4mBFGgjAWc/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/tKyHzVHjOyOpAxH2i4mBFGgjAWc/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/tKyHzVHjOyOpAxH2i4mBFGgjAWc/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ThingsThatShouldBeEasy/~4/IFIv0o-QtMI" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://thingsthatshouldbeeasy.blogspot.com/feeds/588261637741340412/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=13524907&amp;postID=588261637741340412" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/13524907/posts/default/588261637741340412?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/13524907/posts/default/588261637741340412?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ThingsThatShouldBeEasy/~3/IFIv0o-QtMI/how-to-get-started-with-sharepoint-on.html" title="How to: Get started with SharePoint on the cheap" /><author><name>Eugene Rosenfeld [former MOSS MVP]</name><uri>http://www.blogger.com/profile/07177988916544941383</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="04308528651051363456" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://thingsthatshouldbeeasy.blogspot.com/2009/09/how-to-get-started-with-sharepoint-on.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkABRXs-fyp7ImA9WxNTF0Q.&quot;"><id>tag:blogger.com,1999:blog-13524907.post-3897637609421776918</id><published>2009-08-20T13:51:00.000-04:00</published><updated>2009-08-20T13:52:34.557-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-08-20T13:52:34.557-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="x64" /><category scheme="http://www.blogger.com/atom/ns#" term="SharePoint" /><category scheme="http://www.blogger.com/atom/ns#" term="WSS" /><category scheme="http://www.blogger.com/atom/ns#" term="Speaking" /><category scheme="http://www.blogger.com/atom/ns#" term="MOSS" /><category scheme="http://www.blogger.com/atom/ns#" term="Office" /><title>Server-side Office Development with SharePoint</title><content type="html">&lt;p&gt;I’ve talked to many developers who have recently started doing some SharePoint programming and have gotten hooked. In fact, they like SharePoint development so much, especially the event receivers, that these developers are starting to think about using SharePoint as a central clearinghouse for document processing. &lt;/p&gt;  &lt;p&gt;SharePoint event receivers allow developers to programmatically interact and alter data before or after the data is saved into, updated in, or removed from SharePoint. Event receivers can work on list items as well as documents, including Office documents. &lt;/p&gt;  &lt;h3&gt;A world of possibilities&lt;/h3&gt;  &lt;p&gt;Combined with SharePoint’s metadata storage and workflow capabilities, you can imaging some pretty compelling applications built using event receivers. For example, you could create some code to run as a document is saved into SharePoint. If the document is in a draft state according to its metadata, the code would alter the document to include a “Draft” watermark right in the contents of the document. Once the metadata changes to a published status, the code could remove the watermark and also save a PDF copy of the document.&lt;/p&gt;  &lt;h3&gt;What not to do&lt;/h3&gt;  &lt;p&gt;A common implementation strategy is to use a SharePoint event receiver or workflow to invoke the Word object model using&amp;#160; the office primary interop assemblies (OPIA). Then using the OPIA add or remove the watermark or otherwise after the contents of the document according to the metadata associated with the document.&lt;/p&gt;  &lt;p&gt;This is a bad architecture.&lt;/p&gt;  &lt;p&gt;For details on why this does not work, please see my post: “&lt;a href="http://thingsthatshouldbeeasy.blogspot.com/2009/08/anycpu-x86-x64-whats-difference.html"&gt;AnyCPU, x86, x64 – What’s the Difference?&lt;/a&gt;” To summarize that post, when SharePoint is installed on a 64-bit operating system, the various SharePoint processes are running in 64-bit mode, therefore your assemblies will be running in 64-bit mode. A 64-bit process can not load a 32-bit DLL. Office is a 32-bit application and so are the primary interop assemblies most .Net developers use to automate Office. So you will receive a &lt;a href="http://msdn.microsoft.com/en-us/library/system.badimageformatexception.aspx"&gt;BadImageFormatException&lt;/a&gt; when trying to invoke any of the Office applications from your SharePoint code when SharePoint is running on an x64 operating system.&lt;/p&gt;  &lt;p&gt;Beyond the issue of x86 vs. x64 interoperability, there are other reasons to avoid this software design. First, to save money many developers will implement the software in a way that requires installing Office on the SharePoint web front end servers. That’s a very bad idea, period. Security, threading, and DCOM issues will make the software a nightmare to maintain.&lt;/p&gt;  &lt;p&gt;Even if the approach functions on the developer’s x86 development SharePoint machine with a single user and the test documents are 20 KB, what will happen in a production environment where there are thousands of users and 10 MB documents? What happens when 20 documents per minute are being checked in and need to be processed?&lt;/p&gt;  &lt;h3&gt;A better idea&lt;/h3&gt;  &lt;p&gt;Don’t get me wrong. I am not saying that you should not try to write an application that does document processing using the SharePoint and Office technology stacks. Document processing applications can serve to increase the data quality of documents and increase worker productivity by reducing the labor involved in document maintenance. Just don’t use the approach outlined earlier. Use the shared a services approach instead.&lt;/p&gt;  &lt;h3&gt;Document processing as a shared services&lt;/h3&gt;  &lt;p&gt;The concept of shared services was introduced in SharePoint Portal Server 2003 (SPS) and greatly expanded upon in Microsoft Office SharePoint Server 2007 (MOSS). In a nutshell, the bulk of SharePoint is content driven. Shared services provide data storage and processing that are available globally to the SharePoint farm and are not tied to a particular SharePoint content repository.&lt;/p&gt;  &lt;p&gt;Content indexing is a good example. The content indexer is a process that runs outside the scope of any SharePoint web application. The data the indexer stores is not user content and so does not go into any SharePoint content database. The data the indexer collects and processing the indexer performs is available to all SharePoint web applications in the farm, and potentially to other farms.&lt;/p&gt;  &lt;p&gt;I am advocating that the document processing operations described earlier should be treated the same way. Sure the documents themselves are user content and reside in a SharePoint content database, but the process of adding a watermark to or removing a watermark from a Word document has nothing to do with a SharePoint web application and thus should not be performed in an event receiver, or from anywhere within the w3wp.exe process.&lt;/p&gt;  &lt;h3&gt;How do you Easily create a SharePoint Shared Service?&lt;/h3&gt;  &lt;p&gt;There are a couple of constraints our solution needs to adhere to in order to function properly. The solution needs to be able to:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;detect document changes&lt;/li&gt;    &lt;li&gt;process document changes&lt;/li&gt;    &lt;li&gt;process long-running operations&lt;/li&gt;    &lt;li&gt;support both x86 and x64 SharePoint installations&lt;/li&gt;    &lt;li&gt;support both XML (.docx) and legacy file formats (.doc)&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Detecting document changes is fairly easy. Use a list item event receiver to catch the changes.&lt;/p&gt;  &lt;p&gt;Processing the document changes, especially changes to large documents can be more involved. If you throw in the requirement to support legacy Office document formats and x64 installations, there seems to be only one way to do it: create a Windows Service (can’t use a timer job) that is compiled with the x86 option. See my post on the &lt;a href="http://thingsthatshouldbeeasy.blogspot.com/2009/08/anycpu-x86-x64-whats-difference.html" target="_blank"&gt;differences between AnyCPU, x86, and x64 compiler options&lt;/a&gt; for details on why we need to be explicit about the target platform. This service can reside on one of the SharePoint application servers in the farm, on on a server that is outside of the farm. How?&lt;/p&gt;  &lt;p&gt;Create a web service interface that accepts document processing requests and triggers the processing service to do its work. The web service doesn’t actually do any work, it simply accepts documents as input and drops them into a folder on the file system that the processing service is watching. The web service must be compiled with the AnyCPU option so that it will run properly on IIS on both x86 and x64 systems. Because the document acceptor web service and the document processing Windows service are communicating out of process, the web service can run as an x64 process for compatibility with x64 IIS, and the Windows service can run as an x86 process for compatibility with Office.&lt;/p&gt;  &lt;p&gt;That reminds me, Office will need to be installed on the server that is running the document processing service. While it is easy to work with the XML Office file formats without Office, working with the legacy file formats either requires that you have Office installed or that you use third party middleware.&lt;/p&gt;  &lt;h3&gt;Putting everything together&lt;/h3&gt;  &lt;p&gt;What does the final solution look like and how does it operate? The list item event receiver detects a change to a document that needs processing. The event receiver invokes the document acceptor web service running on a SharePoint application server or on an external server. The document acceptor service receives the file to be processed and save the file to a file system folder. The document processor service sees the saved file on the file system and processes the file. Once processing is complete, the document processing service saves the file back to the SharePoint document library.&lt;/p&gt;  &lt;p&gt;For a more in-depth discussion of using Shared Service architectures in a SharePoint environment, join me at the Best Practices Conference. I will be covering this and related topics in my presentation: &lt;a href="http://thingsthatshouldbeeasy.blogspot.com/2009/07/speaking-at-sharepoint-best-practices.html" target="_blank"&gt;Using Service Oriented Methodologies to Create SharePoint Products&lt;/a&gt;. &lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:3b3a2d36-9e99-4b6d-b099-2128bd2164be" class="wlWriterEditableSmartContent"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/x64" rel="tag"&gt;x64&lt;/a&gt;,&lt;a href="http://technorati.com/tags/SharePoint" rel="tag"&gt;SharePoint&lt;/a&gt;,&lt;a href="http://technorati.com/tags/WSS" rel="tag"&gt;WSS&lt;/a&gt;,&lt;a href="http://technorati.com/tags/MOSS" rel="tag"&gt;MOSS&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Office" rel="tag"&gt;Office&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Best+Practices+Conference" rel="tag"&gt;Best Practices Conference&lt;/a&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13524907-3897637609421776918?l=thingsthatshouldbeeasy.blogspot.com'/&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/E3MNMOD09eJ918-LuuizPYcHa0s/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/E3MNMOD09eJ918-LuuizPYcHa0s/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/E3MNMOD09eJ918-LuuizPYcHa0s/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/E3MNMOD09eJ918-LuuizPYcHa0s/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ThingsThatShouldBeEasy/~4/Fdku8XsOKj4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://thingsthatshouldbeeasy.blogspot.com/feeds/3897637609421776918/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=13524907&amp;postID=3897637609421776918" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/13524907/posts/default/3897637609421776918?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/13524907/posts/default/3897637609421776918?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ThingsThatShouldBeEasy/~3/Fdku8XsOKj4/server-side-office-development-with.html" title="Server-side Office Development with SharePoint" /><author><name>Eugene Rosenfeld [former MOSS MVP]</name><uri>http://www.blogger.com/profile/07177988916544941383</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="04308528651051363456" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://thingsthatshouldbeeasy.blogspot.com/2009/08/server-side-office-development-with.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkYEQX85fCp7ImA9WxNTFUw.&quot;"><id>tag:blogger.com,1999:blog-13524907.post-3554354290439363521</id><published>2009-08-17T07:55:00.000-04:00</published><updated>2009-08-17T07:55:00.124-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-08-17T07:55:00.124-04:00</app:edited><title>Run STSADM commands remotely</title><content type="html">&lt;p&gt;Are you tired of having to bring up a Remote Desktop to your SharePoint server just to run an stsadm command? I sure was. Here’s a very simple way to remotely execute stsadm commands against any SharePoint server to which you have a LAN connection. Best of all, unlike some other methods out there, &lt;strong&gt;this method does not require deploying anything to the SharePoint server&lt;/strong&gt;. However, this method is primarily for LAN scenarios, and it is very unlikely to work over the Internet.&lt;/p&gt;  &lt;h3&gt;What you’ll need&lt;/h3&gt;  &lt;p&gt;&lt;a href="http://technet.microsoft.com/en-us/sysinternals/bb897553.aspx" target="_blank"&gt;PsExec.exe&lt;/a&gt; by Sysinternals (now part of Microsoft) is a great utility that allows you to execute any command line against any Windows computer to which you have a LAN connection and proper credentials without installing any software on the remote server. PsExec sits on the workstation computer that you are using. Since stsadm is a command line tool and PsExec is designed to execute command lines, we can combine stsadm with PsExec to create a very nifty way to work on SharePoint servers remotely using only a command prompt.&lt;/p&gt;  &lt;p&gt;PsExec uses Windows RPC ports to execute the commands, so if you will need to have the RPC ports open between your workstation and the SharePoint server that you want to manage. This is why it is unlikely to work over the Internet. This article has a &lt;a href="http://support.microsoft.com/kb/832017" target="_blank"&gt;nice primer on Windows TCP ports&lt;/a&gt; and references to other resources.&lt;/p&gt;  &lt;h3&gt;How to use PsExec with Stsadm&lt;/h3&gt;  &lt;p&gt;Here’s what you do. Remember that you will do all of these steps from your desktop computer, not the SharePoint server.&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Download PsExec from Microsoft’s web site to &lt;strong&gt;your computer&lt;/strong&gt;, not to the SharePoint server.&lt;/li&gt;    &lt;li&gt;Open a command prompt (in administrative mode if you are using Vista with UAC enabled), and change to the directory where you have downloaded and extracted the PsExec tool.&lt;/li&gt;    &lt;li&gt;Execute stsadm.exe through the PsExec command. Use the following format:     &lt;br /&gt;&lt;strong&gt;psexec \\[SharePoint_Server_NetBIOS_Name] –u [username] –p [password] “C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\12\BIN\stsadm.exe” –o [stsadm_parameters]       &lt;br /&gt;        &lt;br /&gt;Note: &lt;/strong&gt;You need “\\” in front of the remote SharePoint computer’s name.&lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;Notice that all files names and paths should be absolute paths and in the context of the remote SharePoint on which you are executing the stsadm command.&lt;/p&gt;  &lt;h3&gt;A few sample commands&lt;/h3&gt;  &lt;p&gt;Here’s a sample that will enumerate all solutions:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;psexec \\wss01 –u mydomain\administrator –p password “C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\12\BIN\stsadm.exe” –o enumsolutions     &lt;br /&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Here’s a sample that will do a SharePoint backup to the “c:\backup folder” directory on the SharePoint server. Notice that parameters that contain spaces need to be enclosed in quotes:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;psexec \\wss01 –u mydomain\administrator –p password “C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\12\BIN\stsadm.exe -o backup –directory “c:\backup folder” -backupmethod full     &lt;br /&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Here’s a sample that will copy a WSP solution to a remote SharePoint server, add the solution to the solution store, and deploy the solution to the farm&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;REM Set an environment variable to point to stsadm. This is just for convenience&lt;/p&gt;    &lt;p&gt;set s=“C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\12\BIN\stsadm.exe”&lt;/p&gt;    &lt;p&gt;REM Copy the WSP solution file to the remote SharePoint server through the admin$ administrative share. This share points to the Windows directory. You must have administrative rights on the server to access this share. The “net use” command will establish credentials on the remote server share.&lt;/p&gt;    &lt;p&gt;net use \\wss01\admin$ /USER:mydomain\administrator password&lt;/p&gt;    &lt;p&gt;copy C:\Deploy\MySolution.WSP \\wss01\admin$\temp\MySolution.WSP&lt;/p&gt; &lt;/blockquote&gt;  &lt;blockquote&gt;   &lt;p&gt;REM Add the WSP solution to the solution store&lt;/p&gt;    &lt;p&gt;psexec \\wss01 –u mydomain\administrator –p password “%s%” –o addsolution –filename c:\windows\temp\MySolution.WSP&lt;/p&gt;    &lt;p&gt;REM Create a timer job to deploy the solution to all content web applications in the SharePoint farm&lt;/p&gt;    &lt;p&gt;psexec \\wss01 –u mydomain\administrator –p password “%s%” –o deploysolution -name MySolution.WSP –allcontenturls –allowgacdeployment –immediate&lt;/p&gt;    &lt;p&gt;REM Start the deployment timer job&lt;/p&gt;    &lt;p&gt;psexec \\wss01 –u mydomain\administrator –p password “%s%” –o execadmsvcjobs     &lt;br /&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;h3&gt;Why not PowerShell&lt;/h3&gt;  &lt;p&gt;You’ve probably noticed that I’ve been using all batch command statements in this article. The natural question to ask is: “Why not use PowerShell&amp;quot; instead?” After all, PowerShell is certainly far more powerful than the dated DOS commands that are available through batch files. While this is true, the fact is that PowerShell is not installed on a fairly large portion of SharePoint servers because PowerShell was not released when Windows Server 2003 came out, which still forms a very large percentage of the base operating system used for SharePoint deployments. Because one of the goals of this article was to come up with a remote SharePoint management method that could be used with all LAN SharePoint servers with no additional server software install, PowerShell was out.&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:a050eaa3-0f80-43b0-8925-e73b5293d12c" class="wlWriterEditableSmartContent"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/WSS" rel="tag"&gt;WSS&lt;/a&gt;,&lt;a href="http://technorati.com/tags/SharePoint" rel="tag"&gt;SharePoint&lt;/a&gt;,&lt;a href="http://technorati.com/tags/MOSS" rel="tag"&gt;MOSS&lt;/a&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13524907-3554354290439363521?l=thingsthatshouldbeeasy.blogspot.com'/&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/PtCenQTaoh-ZlNq5PJWGove1cF4/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/PtCenQTaoh-ZlNq5PJWGove1cF4/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/PtCenQTaoh-ZlNq5PJWGove1cF4/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/PtCenQTaoh-ZlNq5PJWGove1cF4/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ThingsThatShouldBeEasy/~4/CMXt5hBirno" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://thingsthatshouldbeeasy.blogspot.com/feeds/3554354290439363521/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=13524907&amp;postID=3554354290439363521" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/13524907/posts/default/3554354290439363521?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/13524907/posts/default/3554354290439363521?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ThingsThatShouldBeEasy/~3/CMXt5hBirno/run-stsadm-commands-remotely.html" title="Run STSADM commands remotely" /><author><name>Eugene Rosenfeld [former MOSS MVP]</name><uri>http://www.blogger.com/profile/07177988916544941383</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="04308528651051363456" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total><feedburner:origLink>http://thingsthatshouldbeeasy.blogspot.com/2009/08/run-stsadm-commands-remotely.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEICQXw6fCp7ImA9WxJaGU0.&quot;"><id>tag:blogger.com,1999:blog-13524907.post-6360527758300746109</id><published>2009-08-10T08:16:00.000-04:00</published><updated>2009-08-10T08:16:00.214-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-08-10T08:16:00.214-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Impersonation" /><category scheme="http://www.blogger.com/atom/ns#" term="C#" /><category scheme="http://www.blogger.com/atom/ns#" term=".Net" /><title>RunAs in C#</title><content type="html">&lt;p&gt;I do a lot of server programming. I frequently need to be able to run some code as a different user than the currently logged-in user. Unfortunately, the .Net Framework does not make this particularly easy. Sure, there is the WindowsIdentity class and its Impersonate method. But how do you create an instance of a WindowsIdentity object? You need to pass the constructor a logon token. How do you get a logon token? Well, .Net is rather silent on that point.&lt;/p&gt;  &lt;h3&gt;PInvoke is your friend&lt;/h3&gt;  &lt;p&gt;The Win32 API does have a LogonUser function in the advapi32.dll DLL. Thanks to the wonderful work of PInvoke (now part of RedGate), you can easily get the signature of the &lt;a href="http://www.pinvoke.net/default.aspx/advapi32/LogonUser.html" target="_blank"&gt;LogonUser function translated into .Net&lt;/a&gt;. It looks like this:&lt;/p&gt;  &lt;pre class="csharpcode"&gt;[DllImport(&lt;span class="str"&gt;&amp;quot;advapi32.dll&amp;quot;&lt;/span&gt;, SetLastError = &lt;span class="kwrd"&gt;true&lt;/span&gt;)]  &lt;br /&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;extern&lt;/span&gt; &lt;span class="kwrd"&gt;bool&lt;/span&gt; LogonUser(&lt;span class="kwrd"&gt;string&lt;/span&gt; lpszUserName, &lt;span class="kwrd"&gt;string&lt;/span&gt; lpszDomain, &lt;span class="kwrd"&gt;string&lt;/span&gt; lpszPassword, &lt;span class="kwrd"&gt;int&lt;/span&gt; dwLogonType, &lt;span class="kwrd"&gt;int&lt;/span&gt; dwLogonProvider, &lt;span class="kwrd"&gt;out&lt;/span&gt; IntPtr phToken);&lt;/pre&gt;&lt;br /&gt;&lt;style type="text/css"&gt;&lt;br /&gt;.csharpcode, .csharpcode pre&lt;br /&gt;{&lt;br /&gt;	font-size: small;&lt;br /&gt;	color: black;&lt;br /&gt;	font-family: consolas, "Courier New", courier, monospace;&lt;br /&gt;	background-color: #ffffff;&lt;br /&gt;	/*white-space: pre;*/&lt;br /&gt;}&lt;br /&gt;.csharpcode pre { margin: 0em; }&lt;br /&gt;.csharpcode .rem { color: #008000; }&lt;br /&gt;.csharpcode .kwrd { color: #0000ff; }&lt;br /&gt;.csharpcode .str { color: #006080; }&lt;br /&gt;.csharpcode .op { color: #0000c0; }&lt;br /&gt;.csharpcode .preproc { color: #cc6633; }&lt;br /&gt;.csharpcode .asp { background-color: #ffff00; }&lt;br /&gt;.csharpcode .html { color: #800000; }&lt;br /&gt;.csharpcode .attr { color: #ff0000; }&lt;br /&gt;.csharpcode .alt &lt;br /&gt;{&lt;br /&gt;	background-color: #f4f4f4;&lt;br /&gt;	width: 100%;&lt;br /&gt;	margin: 0em;&lt;br /&gt;}&lt;br /&gt;.csharpcode .lnum { color: #606060; }&lt;/style&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;I found a nice code &lt;a href="http://www.dotnetspider.com/resources/29092-Copy-files-from-remote-machine.aspx" target="_blank"&gt;snippet by Viji RAJKUMAR&lt;/a&gt; that showed how to use the LogonUser function, handle the Win32 error codes, and handle the .Net impersonation contexts. But do you really want deal with all of that whenever you have to run some code as someone else? I sure don’t.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Inspiration from SharePoint’s RunWithElevatedPrivileges&lt;/h3&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;One thing that the SharePoint API has is a very handy method on the SPSecurity class called RunWithElevatedPrivileges. RunWithElevatedPrivileges takes a function pointer (called a delegate in .Net) and executes the code in the function in the context of a pre-defined user identity (the identity of the IIS application pool in which the code is running). I really liked the ease of invocation of RunWithElevatedPrivileges method, but I needed to have a method that allowed me to specify the user name and password of any arbitrary user account.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;The &lt;strong&gt;RunAs &lt;/strong&gt;method is born&lt;/h3&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;I used Viji’s code snippet as a starting point, and enhanced it to accept a delegate function. The result is that I can easily call &lt;strong&gt;RunAs&lt;/strong&gt;, passing in a username and password, and a block of code I want executed under that user’s identity. Calling RunAs looks like this:&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="csharpcode"&gt;&lt;br /&gt;  &lt;pre&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;BlackBlade.Utilities.SecurityUtilities.RunAs(&lt;span class="kwrd"&gt;delegate&lt;/span&gt;()&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;  &lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;    {&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;  &lt;pre&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;        File.Move(“local_file”, “network_file_location”);&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;  &lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;    },&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;  &lt;pre&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;    “a_username”,&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;  &lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;    “some_password”);&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;style type="text/css"&gt;&lt;br /&gt;.csharpcode, .csharpcode pre&lt;br /&gt;{&lt;br /&gt;	font-size: small;&lt;br /&gt;	color: black;&lt;br /&gt;	font-family: consolas, "Courier New", courier, monospace;&lt;br /&gt;	background-color: #ffffff;&lt;br /&gt;	/*white-space: pre;*/&lt;br /&gt;}&lt;br /&gt;.csharpcode pre { margin: 0em; }&lt;br /&gt;.csharpcode .rem { color: #008000; }&lt;br /&gt;.csharpcode .kwrd { color: #0000ff; }&lt;br /&gt;.csharpcode .str { color: #006080; }&lt;br /&gt;.csharpcode .op { color: #0000c0; }&lt;br /&gt;.csharpcode .preproc { color: #cc6633; }&lt;br /&gt;.csharpcode .asp { background-color: #ffff00; }&lt;br /&gt;.csharpcode .html { color: #800000; }&lt;br /&gt;.csharpcode .attr { color: #ff0000; }&lt;br /&gt;.csharpcode .alt &lt;br /&gt;{&lt;br /&gt;	background-color: #f4f4f4;&lt;br /&gt;	width: 100%;&lt;br /&gt;	margin: 0em;&lt;br /&gt;}&lt;br /&gt;.csharpcode .lnum { color: #606060; }&lt;/style&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Line 3 in the above code snippet is the code that will be executed with the credentials supplied to the RunAs method. You can have as many lines of code between lines 2 and 4. And those lines of code can interact with variables outside the code block. The RunAs method takes care of the details of interoperating with the Win32 API and handling the impersonation and reversion of .Net security contexts.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;RunAs implemented&lt;/h3&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Here’s the full implementation of the RunAs method. Less than 75 lines of code. You can compile this as an assembly and reference it form other projects. It’s very handy. &lt;/p&gt;&lt;br /&gt;&lt;style type="text/css"&gt;&lt;br /&gt;.csharpcode, .csharpcode pre&lt;br /&gt;{&lt;br /&gt;	font-size: small;&lt;br /&gt;	color: black;&lt;br /&gt;	font-family: consolas, "Courier New", courier, monospace;&lt;br /&gt;	background-color: #ffffff;&lt;br /&gt;	/*white-space: pre;*/&lt;br /&gt;}&lt;br /&gt;.csharpcode pre { margin: 0em; }&lt;br /&gt;.csharpcode .rem { color: #008000; }&lt;br /&gt;.csharpcode .kwrd { color: #0000ff; }&lt;br /&gt;.csharpcode .str { color: #006080; }&lt;br /&gt;.csharpcode .op { color: #0000c0; }&lt;br /&gt;.csharpcode .preproc { color: #cc6633; }&lt;br /&gt;.csharpcode .asp { background-color: #ffff00; }&lt;br /&gt;.csharpcode .html { color: #800000; }&lt;br /&gt;.csharpcode .attr { color: #ff0000; }&lt;br /&gt;.csharpcode .alt &lt;br /&gt;{&lt;br /&gt;	background-color: #f4f4f4;&lt;br /&gt;	width: 100%;&lt;br /&gt;	margin: 0em;&lt;br /&gt;}&lt;br /&gt;.csharpcode .lnum { color: #606060; }&lt;/style&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="csharpcode"&gt;&lt;br /&gt;  &lt;pre&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;  &lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Collections.Generic;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;  &lt;pre&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Text;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;  &lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;  &lt;pre&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Security.Principal;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;  &lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Runtime.InteropServices;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;  &lt;pre&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;  &lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt;&lt;span class="kwrd"&gt;namespace&lt;/span&gt; BlackBlade.Utilities&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;  &lt;pre&gt;&lt;span class="lnum"&gt;   9:  &lt;/span&gt;{&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;  &lt;pre&gt;&lt;span class="lnum"&gt;  10:  &lt;/span&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; SecurityUtilities&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;  &lt;pre&gt;&lt;span class="lnum"&gt;  11:  &lt;/span&gt;    {&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;  &lt;pre&gt;&lt;span class="lnum"&gt;  12:  &lt;/span&gt;        [DllImport(&lt;span class="str"&gt;&amp;quot;advapi32.dll&amp;quot;&lt;/span&gt;, SetLastError = &lt;span class="kwrd"&gt;true&lt;/span&gt;)]&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;  &lt;pre&gt;&lt;span class="lnum"&gt;  13:  &lt;/span&gt;        &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;extern&lt;/span&gt; &lt;span class="kwrd"&gt;bool&lt;/span&gt; LogonUser(&lt;span class="kwrd"&gt;string&lt;/span&gt; lpszUserName, &lt;span class="kwrd"&gt;string&lt;/span&gt; lpszDomain, &lt;span class="kwrd"&gt;string&lt;/span&gt; lpszPassword, &lt;span class="kwrd"&gt;int&lt;/span&gt; dwLogonType, &lt;span class="kwrd"&gt;int&lt;/span&gt; dwLogonProvider, &lt;span class="kwrd"&gt;out&lt;/span&gt; IntPtr phToken);&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;  &lt;pre&gt;&lt;span class="lnum"&gt;  14:  &lt;/span&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;delegate&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; RunAsDelegate();&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;  &lt;pre&gt;&lt;span class="lnum"&gt;  15:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;  &lt;pre&gt;&lt;span class="lnum"&gt;  16:  &lt;/span&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; RunAs(RunAsDelegate MethodToRunAs, &lt;span class="kwrd"&gt;string&lt;/span&gt; Username, &lt;span class="kwrd"&gt;string&lt;/span&gt; Password)&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;  &lt;pre&gt;&lt;span class="lnum"&gt;  17:  &lt;/span&gt;        {&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;  &lt;pre&gt;&lt;span class="lnum"&gt;  18:  &lt;/span&gt;            &lt;span class="kwrd"&gt;string&lt;/span&gt; userName;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;  &lt;pre&gt;&lt;span class="lnum"&gt;  19:  &lt;/span&gt;            &lt;span class="kwrd"&gt;string&lt;/span&gt; domain;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;  &lt;pre&gt;&lt;span class="lnum"&gt;  20:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;  &lt;pre&gt;&lt;span class="lnum"&gt;  21:  &lt;/span&gt;            &lt;span class="kwrd"&gt;if&lt;/span&gt; (Username.IndexOf(&lt;span class="str"&gt;'\\'&lt;font color="#000000"&gt;) &amp;gt; 0)&lt;/font&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;  &lt;pre&gt;&lt;span class="lnum"&gt;  22:  &lt;/span&gt;            {&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;  &lt;pre&gt;&lt;span class="lnum"&gt;  23:  &lt;/span&gt;                &lt;span class="rem"&gt;//a domain name was supplied&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;  &lt;pre&gt;&lt;span class="lnum"&gt;  24:  &lt;/span&gt;                string[] usernameArray = Username.Split('&lt;/span&gt;\\');&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;  &lt;pre&gt;&lt;span class="lnum"&gt;  25:  &lt;/span&gt;                userName = usernameArray[1];&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;  &lt;pre&gt;&lt;span class="lnum"&gt;  26:  &lt;/span&gt;                domain = usernameArray[0];&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;  &lt;pre&gt;&lt;span class="lnum"&gt;  27:  &lt;/span&gt;            }&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;  &lt;pre&gt;&lt;span class="lnum"&gt;  28:  &lt;/span&gt;            &lt;span class="kwrd"&gt;else&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;  &lt;pre&gt;&lt;span class="lnum"&gt;  29:  &lt;/span&gt;            {&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;  &lt;pre&gt;&lt;span class="lnum"&gt;  30:  &lt;/span&gt;                &lt;span class="rem"&gt;//there was no domain name supplied&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;  &lt;pre&gt;&lt;span class="lnum"&gt;  31:  &lt;/span&gt;                userName = Username;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;  &lt;pre&gt;&lt;span class="lnum"&gt;  32:  &lt;/span&gt;                domain = &lt;span class="str"&gt;&amp;quot;.&amp;quot;&lt;/span&gt;;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;  &lt;pre&gt;&lt;span class="lnum"&gt;  33:  &lt;/span&gt;            }&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;  &lt;pre&gt;&lt;span class="lnum"&gt;  34:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;  &lt;pre&gt;&lt;span class="lnum"&gt;  35:  &lt;/span&gt;            RunAs(MethodToRunAs, userName, Password, domain);&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;  &lt;pre&gt;&lt;span class="lnum"&gt;  36:  &lt;/span&gt;        }&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;  &lt;pre&gt;&lt;span class="lnum"&gt;  37:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;  &lt;pre&gt;&lt;span class="lnum"&gt;  38:  &lt;/span&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; RunAs(RunAsDelegate MethodToRunAs, &lt;span class="kwrd"&gt;string&lt;/span&gt; Username, &lt;span class="kwrd"&gt;string&lt;/span&gt; Password, &lt;span class="kwrd"&gt;string&lt;/span&gt; Domain)&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;  &lt;pre&gt;&lt;span class="lnum"&gt;  39:  &lt;/span&gt;        {&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;  &lt;pre&gt;&lt;span class="lnum"&gt;  40:  &lt;/span&gt;            IntPtr imp_token;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;  &lt;pre&gt;&lt;span class="lnum"&gt;  41:  &lt;/span&gt;            WindowsIdentity wid_admin = &lt;span class="kwrd"&gt;null&lt;/span&gt;;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;  &lt;pre&gt;&lt;span class="lnum"&gt;  42:  &lt;/span&gt;            WindowsImpersonationContext wic = &lt;span class="kwrd"&gt;null&lt;/span&gt;;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;  &lt;pre&gt;&lt;span class="lnum"&gt;  43:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;  &lt;pre&gt;&lt;span class="lnum"&gt;  44:  &lt;/span&gt;            &lt;span class="kwrd"&gt;try&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;  &lt;pre&gt;&lt;span class="lnum"&gt;  45:  &lt;/span&gt;            {&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;  &lt;pre&gt;&lt;span class="lnum"&gt;  46:  &lt;/span&gt;                &lt;span class="kwrd"&gt;if&lt;/span&gt; (LogonUser(Username, &lt;span class="kwrd"&gt;string&lt;/span&gt;.IsNullOrEmpty(Domain) ? &lt;span class="str"&gt;&amp;quot;.&amp;quot;&lt;/span&gt; : Domain, Password, 9, 0, &lt;span class="kwrd"&gt;out&lt;/span&gt; imp_token))&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;  &lt;pre&gt;&lt;span class="lnum"&gt;  47:  &lt;/span&gt;                {&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;  &lt;pre&gt;&lt;span class="lnum"&gt;  48:  &lt;/span&gt;                    &lt;span class="rem"&gt;//the impersonation suceeded&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;  &lt;pre&gt;&lt;span class="lnum"&gt;  49:  &lt;/span&gt;                    wid_admin = &lt;span class="kwrd"&gt;new&lt;/span&gt; WindowsIdentity(imp_token);&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;  &lt;pre&gt;&lt;span class="lnum"&gt;  50:  &lt;/span&gt;                    wic = wid_admin.Impersonate();&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;  &lt;pre&gt;&lt;span class="lnum"&gt;  51:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;  &lt;pre&gt;&lt;span class="lnum"&gt;  52:  &lt;/span&gt;                    &lt;span class="rem"&gt;//run the delegate method&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;  &lt;pre&gt;&lt;span class="lnum"&gt;  53:  &lt;/span&gt;                    MethodToRunAs();&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;  &lt;pre&gt;&lt;span class="lnum"&gt;  54:  &lt;/span&gt;                }&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;  &lt;pre&gt;&lt;span class="lnum"&gt;  55:  &lt;/span&gt;                &lt;span class="kwrd"&gt;else&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;  &lt;pre&gt;&lt;span class="lnum"&gt;  56:  &lt;/span&gt;                    &lt;span class="kwrd"&gt;throw&lt;/span&gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; Exception(&lt;span class="kwrd"&gt;string&lt;/span&gt;.Format(&lt;span class="str"&gt;&amp;quot;Could not impersonate user {0} in domain {1} with the specified password.&amp;quot;&lt;/span&gt;, Username, Domain));&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;  &lt;pre&gt;&lt;span class="lnum"&gt;  57:  &lt;/span&gt;            }&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;  &lt;pre&gt;&lt;span class="lnum"&gt;  58:  &lt;/span&gt;            &lt;span class="kwrd"&gt;catch&lt;/span&gt; (Exception se)&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;  &lt;pre&gt;&lt;span class="lnum"&gt;  59:  &lt;/span&gt;            {&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;  &lt;pre&gt;&lt;span class="lnum"&gt;  60:  &lt;/span&gt;                &lt;span class="kwrd"&gt;int&lt;/span&gt; ret = Marshal.GetLastWin32Error();&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;  &lt;pre&gt;&lt;span class="lnum"&gt;  61:  &lt;/span&gt;                &lt;span class="kwrd"&gt;if&lt;/span&gt; (wic != &lt;span class="kwrd"&gt;null&lt;/span&gt;)&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;  &lt;pre&gt;&lt;span class="lnum"&gt;  62:  &lt;/span&gt;                    wic.Undo();&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;  &lt;pre&gt;&lt;span class="lnum"&gt;  63:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;  &lt;pre&gt;&lt;span class="lnum"&gt;  64:  &lt;/span&gt;                &lt;span class="kwrd"&gt;throw&lt;/span&gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; Exception(&lt;span class="str"&gt;&amp;quot;Error code: &amp;quot;&lt;/span&gt; + ret.ToString(), se);&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;  &lt;pre&gt;&lt;span class="lnum"&gt;  65:  &lt;/span&gt;            }&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;  &lt;pre&gt;&lt;span class="lnum"&gt;  66:  &lt;/span&gt;            &lt;span class="kwrd"&gt;finally&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;  &lt;pre&gt;&lt;span class="lnum"&gt;  67:  &lt;/span&gt;            {&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;  &lt;pre&gt;&lt;span class="lnum"&gt;  68:  &lt;/span&gt;                &lt;span class="rem"&gt;//revert to self&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;  &lt;pre&gt;&lt;span class="lnum"&gt;  69:  &lt;/span&gt;                &lt;span class="kwrd"&gt;if&lt;/span&gt; (wic != &lt;span class="kwrd"&gt;null&lt;/span&gt;)&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;  &lt;pre&gt;&lt;span class="lnum"&gt;  70:  &lt;/span&gt;                    wic.Undo();&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;  &lt;pre&gt;&lt;span class="lnum"&gt;  71:  &lt;/span&gt;            }&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;  &lt;pre&gt;&lt;span class="lnum"&gt;  72:  &lt;/span&gt;        }&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;  &lt;pre&gt;&lt;span class="lnum"&gt;  73:  &lt;/span&gt;    }&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;  &lt;pre&gt;&lt;span class="lnum"&gt;  74:  &lt;/span&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Line 53 in the previous code block invokes the caller-supplied code that should be run unsung the new impersonation context.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:beecb4a2-d543-4412-93ee-6568bd045a24" class="wlWriterEditableSmartContent"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/.Net" rel="tag"&gt;.Net&lt;/a&gt;,&lt;a href="http://technorati.com/tags/C%23" rel="tag"&gt;C#&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Impersonation" rel="tag"&gt;Impersonation&lt;/a&gt;,&lt;a href="http://technorati.com/tags/LogonUser" rel="tag"&gt;LogonUser&lt;/a&gt;&lt;/div&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13524907-6360527758300746109?l=thingsthatshouldbeeasy.blogspot.com'/&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/_DhFCxoG8n0YEMbuWS7nTng8tIQ/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/_DhFCxoG8n0YEMbuWS7nTng8tIQ/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/_DhFCxoG8n0YEMbuWS7nTng8tIQ/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/_DhFCxoG8n0YEMbuWS7nTng8tIQ/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ThingsThatShouldBeEasy/~4/CWFigygrFC8" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://thingsthatshouldbeeasy.blogspot.com/feeds/6360527758300746109/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=13524907&amp;postID=6360527758300746109" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/13524907/posts/default/6360527758300746109?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/13524907/posts/default/6360527758300746109?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ThingsThatShouldBeEasy/~3/CWFigygrFC8/runas-in-c.html" title="RunAs in C#" /><author><name>Eugene Rosenfeld [former MOSS MVP]</name><uri>http://www.blogger.com/profile/07177988916544941383</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="04308528651051363456" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total><feedburner:origLink>http://thingsthatshouldbeeasy.blogspot.com/2009/08/runas-in-c.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0IHSH0_fyp7ImA9WxJaFUU.&quot;"><id>tag:blogger.com,1999:blog-13524907.post-987615488668457722</id><published>2009-08-06T13:57:00.001-04:00</published><updated>2009-08-06T13:58:59.347-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-08-06T13:58:59.347-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Windows 7" /><category scheme="http://www.blogger.com/atom/ns#" term="MSDN" /><title>Windows 7 RTM now available for MSDN Subscribers</title><content type="html">&lt;p&gt;The Windows 7 RTM along with support and technical content is now available for download to MSDN subscribers.&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://msdn.microsoft.com"&gt;MSDN&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="http://msdn.microsoft.com/subscriptions/securedownloads/default.aspx?pv=36:350" target="_blank"&gt;Windows 7 Downloads&lt;/a&gt;&lt;/li&gt; &lt;/ul&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:b54f3aed-2d16-4df6-aaf3-33c0cddd0472" class="wlWriterEditableSmartContent"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/Windows+7" rel="tag"&gt;Windows 7&lt;/a&gt;,&lt;a href="http://technorati.com/tags/MSDN" rel="tag"&gt;MSDN&lt;/a&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13524907-987615488668457722?l=thingsthatshouldbeeasy.blogspot.com'/&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/VS21Dq-7cj_wofESnrZGKd5G0n0/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/VS21Dq-7cj_wofESnrZGKd5G0n0/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/VS21Dq-7cj_wofESnrZGKd5G0n0/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/VS21Dq-7cj_wofESnrZGKd5G0n0/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ThingsThatShouldBeEasy/~4/ieXGYTQ8qf8" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://thingsthatshouldbeeasy.blogspot.com/feeds/987615488668457722/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=13524907&amp;postID=987615488668457722" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/13524907/posts/default/987615488668457722?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/13524907/posts/default/987615488668457722?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ThingsThatShouldBeEasy/~3/ieXGYTQ8qf8/windows-7-rtm-now-available-for-msdn.html" title="Windows 7 RTM now available for MSDN Subscribers" /><author><name>Eugene Rosenfeld [former MOSS MVP]</name><uri>http://www.blogger.com/profile/07177988916544941383</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="04308528651051363456" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://thingsthatshouldbeeasy.blogspot.com/2009/08/windows-7-rtm-now-available-for-msdn.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0AHQH89eSp7ImA9WxJaFU8.&quot;"><id>tag:blogger.com,1999:blog-13524907.post-206563734047520787</id><published>2009-08-05T21:20:00.000-04:00</published><updated>2009-08-05T21:22:11.161-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-08-05T21:22:11.161-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="TFS" /><category scheme="http://www.blogger.com/atom/ns#" term="Visual Studio" /><title>Missing History in TFS</title><content type="html">&lt;p&gt;A few months ago our Team Foundation Server (TFS) box failed and we lost some data. I thought our new TFS box was headed for the same end the other day when I pulled up a history list for a Visual Studio project and saw that there were not nearly as many entries in the history list as there should have been.&lt;/p&gt;  &lt;p&gt;A few minutes and a few valiums later, I figured out why there were so few entries in the history list. It turns out there are &lt;strong&gt;two ways to get the TFS history from Visual Studio&lt;/strong&gt;. &lt;/p&gt;  &lt;h3&gt;View History from Solution Explorer&lt;/h3&gt;  &lt;p&gt;The first way is to select the View History option from the context menu of a file in in the Visual Studio Solution Explorer (see screenshot below). This way of viewing TFS history only pulls up the history items for the specifically selected item (the selected project file in this case), and &lt;strong&gt;not a rolled-up history for its child items &lt;/strong&gt;(the files within the project). The screenshot below and the right shows the history list for just the selected project.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_z3BYpxQRvUs/SnowOZvVu4I/AAAAAAAAAEg/eRBus7yJpxM/s1600-h/image%5B17%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="View history from solution explorer" border="0" alt="View history from solution explorer" src="http://lh3.ggpht.com/_z3BYpxQRvUs/SnowOh2e_rI/AAAAAAAAAEk/PQLtUfji6g8/image_thumb%5B37%5D.png?imgmax=800" width="413" height="444" /&gt;&lt;/a&gt;&amp;#160;&amp;#160;&amp;#160; &lt;a href="http://lh4.ggpht.com/_z3BYpxQRvUs/SnowO1-OeyI/AAAAAAAAAEo/Ml4hw7xcApE/s1600-h/image%5B15%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="History for project file" border="0" alt="History for project file" src="http://lh6.ggpht.com/_z3BYpxQRvUs/SnowPUj2mrI/AAAAAAAAAEs/wnDTmgOavZI/image_thumb%5B34%5D.png?imgmax=800" width="412" height="450" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;h3&gt;View History from Source Control Explorer&lt;/h3&gt;  &lt;p&gt;The other way to view TFS from Visual Studio is to do so from an item’s context menu in the Source Control Explorer in Visual Studio. From the screenshot below and to the left, there is no visual distinction between the View History menu item in the Source Control Explorer and the one in the Solution Explorer. However, look at the change-sets returned by the View History menu item from the Source Control Explorer in the screenshot below and to the right. There are three change-sets that for the project that were not present in the history view returned by the Solution Explorer. These additional change-sets represent a rolled-up view of changes that were made to files within the project (code changes), but that did not include changes to the project file itself (like adding a file to or removing a file from the project). The history view from the Source Control Explorer shows a &lt;strong&gt;complete roll-up of all changes &lt;/strong&gt;made to the selected item as well as child items.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_z3BYpxQRvUs/SnowPhCsxoI/AAAAAAAAAEw/niDnreARDGk/s1600-h/image%5B22%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://lh6.ggpht.com/_z3BYpxQRvUs/SnowQB5L5nI/AAAAAAAAAE0/VDSen5C3Uqk/image_thumb%5B46%5D.png?imgmax=800" width="431" height="462" /&gt;&lt;/a&gt;&amp;#160;&amp;#160;&amp;#160; &lt;a href="http://lh4.ggpht.com/_z3BYpxQRvUs/SnowQdDgqgI/AAAAAAAAAE4/-9MY_RHAyQ4/s1600-h/image%5B21%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://lh3.ggpht.com/_z3BYpxQRvUs/SnowQrRCe2I/AAAAAAAAAE8/QQlK3_xKft8/image_thumb%5B42%5D.png?imgmax=800" width="366" height="463" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;h3&gt;Summary&lt;/h3&gt;  &lt;p&gt;The moral of this story is:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;If you want to see TFS change history for just the selected item, use the View History command from the items context menu in the Visual Studio Solution Explorer.&lt;/li&gt;    &lt;li&gt;If you want to see a rolled-up TFS change history for the item and any child items, use the use the View History command from the items context menu in the Visual Studio Source Control Explorer.&lt;/li&gt; &lt;/ul&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13524907-206563734047520787?l=thingsthatshouldbeeasy.blogspot.com'/&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/XopgZdJvhRPwwHAeObXngoqWVL4/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/XopgZdJvhRPwwHAeObXngoqWVL4/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/XopgZdJvhRPwwHAeObXngoqWVL4/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/XopgZdJvhRPwwHAeObXngoqWVL4/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ThingsThatShouldBeEasy/~4/Ax-1GxrfXzE" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://thingsthatshouldbeeasy.blogspot.com/feeds/206563734047520787/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=13524907&amp;postID=206563734047520787" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/13524907/posts/default/206563734047520787?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/13524907/posts/default/206563734047520787?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ThingsThatShouldBeEasy/~3/Ax-1GxrfXzE/missing-history-in-tfs.html" title="Missing History in TFS" /><author><name>Eugene Rosenfeld [former MOSS MVP]</name><uri>http://www.blogger.com/profile/07177988916544941383</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="04308528651051363456" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://thingsthatshouldbeeasy.blogspot.com/2009/08/missing-history-in-tfs.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Ak4GRXY9fyp7ImA9WxJaFEk.&quot;"><id>tag:blogger.com,1999:blog-13524907.post-2246824216223615615</id><published>2009-08-05T01:07:00.000-04:00</published><updated>2009-08-05T01:08:44.867-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-08-05T01:08:44.867-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Java" /><category scheme="http://www.blogger.com/atom/ns#" term="Sun" /><title>Say “No” to Java Trial-ware</title><content type="html">&lt;p&gt;The latest update to the Sun Microsystems’ (Sun) Java Runtime Environment (JRE) for Windows comes with a trial-ware Internet backup service called “Carbonite Online Backup”. Unsuspecting users who install the Java update will also be installing potentially unwanted software that could cost them $5 per month.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_z3BYpxQRvUs/SnkT2uScwVI/AAAAAAAAAEY/R58E8lPPC9U/s1600-h/image%5B5%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://lh3.ggpht.com/_z3BYpxQRvUs/SnkT23UWzuI/AAAAAAAAAEc/fiHRuy410e0/image_thumb%5B1%5D.png?imgmax=800" width="645" height="490" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;I’m a seasoned geek. I’ve grown to expect such antics from less reputable Internet companies. No names need be mentioned. But I’ve generally considered Sun a trust-worthy software provider, especially in terms of its JRE for Windows. This is a low move, trying to sneak trial-ware into a software distribution channel that in the past has had a high degree of integrity. Sun: please remove the trial-ware from future JRE updates.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13524907-2246824216223615615?l=thingsthatshouldbeeasy.blogspot.com'/&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/eVoth6xjUBXx0UxpkQlWXBzx9oY/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/eVoth6xjUBXx0UxpkQlWXBzx9oY/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/eVoth6xjUBXx0UxpkQlWXBzx9oY/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/eVoth6xjUBXx0UxpkQlWXBzx9oY/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ThingsThatShouldBeEasy/~4/WYvMv0UukbY" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://thingsthatshouldbeeasy.blogspot.com/feeds/2246824216223615615/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=13524907&amp;postID=2246824216223615615" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/13524907/posts/default/2246824216223615615?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/13524907/posts/default/2246824216223615615?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ThingsThatShouldBeEasy/~3/WYvMv0UukbY/say-no-to-java-trial-ware.html" title="Say “No” to Java Trial-ware" /><author><name>Eugene Rosenfeld [former MOSS MVP]</name><uri>http://www.blogger.com/profile/07177988916544941383</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="04308528651051363456" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total><feedburner:origLink>http://thingsthatshouldbeeasy.blogspot.com/2009/08/say-no-to-java-trial-ware.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEYARn89cSp7ImA9WxJaFEw.&quot;"><id>tag:blogger.com,1999:blog-13524907.post-6228564259408254525</id><published>2009-08-04T12:37:00.000-04:00</published><updated>2009-08-04T14:55:47.169-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-08-04T14:55:47.169-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="x64" /><title>AnyCPU, x86, x64 – What’s the Difference?</title><content type="html">&lt;p&gt;A colleague of mine recently posed an interesting question: Why would you ever want to specifically target an assembly compilation to x86 or x64? Wouldn’t you always want to use the AnyCPU option?&lt;/p&gt;  &lt;h3&gt;What are the options?&lt;/h3&gt;  &lt;p&gt;Here’s a bit of background on what each option does:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;AnyCPU – The assembly is compiled in a CPU-independent manner. If you are compiling an EXE, the EXE will run as an x64 processes when loaded by an x64 version of the .Net Framework on an x64 operating system. Otherwise the EXE will run as an x86 process. When you’re compiling a DLL, the DLL will load as an x64 DLL when loaded from an x64 process. Otherwise, the DLL will load as an x86 DLL. &lt;/li&gt;    &lt;li&gt;x86 – The assembly will always load as an x86 assembly, regardless of the operating system or .Net Framework version. The assembly will not load from an x64 process. &lt;/li&gt;    &lt;li&gt;x64 – The assembly will always load as an x64 assembly, regardless of the operating system or .Net Framework version. The assembly will not load on an x86 operating system or from an x86 process. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Well, it looks like the AnyCPU option is definitely the way to go. You get the most flexibility with the least amount of headaches due to platform and process differences. In most cases (99 out of 100) that is true.&lt;/p&gt;  &lt;h3&gt;Subtleties of assembly loading&lt;/h3&gt;  &lt;p&gt;However, there is one subtlety to how assemblies load into processes. A process can only load assemblies that are of the same architecture at runtime as the process itself. An x64 process can only load x64 assemblies, and x86 processes can only load x86 assemblies. This restriction still applies to assemblies compiled with the AnyCPU option. Even though assemblies compiled with the AnyCPU option are processor architecture-independent at compile-time, the assemblies do get tied to a particular processor architecture when they are loaded for execution. If a process tries to load an assembly with an incompatible architecture, a &lt;a href="http://msdn.microsoft.com/en-us/library/system.badimageformatexception.aspx" target="_blank"&gt;BadImageFormatException&lt;/a&gt; will be thrown.&lt;/p&gt;  &lt;p&gt;Why does that matter? Wouldn’t all of this be irrelevant if all assemblies were compiled with the AnyCPU option? Yes. Except, that not all code your assembly needs to load or that will be loading your assembly is processor architecture-independent. In particular, this is most apparent when you need to interoperate with un-managed code, such as COM.&lt;/p&gt;  &lt;h3&gt;So what? I only use managed code&lt;/h3&gt;  &lt;p&gt;Many .Net developers believe that all of .Net is a brand new, shiny framework that frees them from the headaches or working with legacy runtimes and unmanaged binaries. This is not true. In fact, a large portion of the .Net Framework simply wraps existing un-managed operating system components, such as the EnterpriseServices and DirectoryServices namespaces. Here’s a screenshot of a COM+ component EnterpriseServices uses to extend transaction support into the .Net Framework:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_z3BYpxQRvUs/SnhzAB4_3FI/AAAAAAAAAEQ/9_Xvh-m1Oww/s1600-h/image%5B4%5D.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title=".Net in Component Services" border="0" alt=".Net in Component Services" src="http://lh6.ggpht.com/_z3BYpxQRvUs/SnhzAp0vL9I/AAAAAAAAAEU/xlEoNk0MU70/image_thumb%5B13%5D.png?imgmax=800" width="608" height="373" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;There are also many components and products that are based on un-managed code and only wraps this code for interoperability with .Net assemblies. Many Microsoft applications fall into this category as well, such as Microsoft Office, even if you are using the &lt;a href="http://msdn.microsoft.com/en-us/library/15s06t57(VS.80).aspx" target="_blank"&gt;Office primary interop assemblies&lt;/a&gt;.&lt;/p&gt;  &lt;h3&gt;When do I need to specify x86 or x64 target for my assembly?&lt;/h3&gt;  &lt;p&gt;Given what we now know about how assemblies are loaded, we can now see that when we need to interoperate with un-managed code, even code that has .Net wrappers, we may need to target our assemblies, particularly when our process or assembly is likely to be loaded as a 64-bit (x64) architecture but the unmanaged code is of 32-bit (x86) architecture.&lt;/p&gt;  &lt;p&gt;For example, say we need to automate a Microsoft Office application and our assembly is running on an x64 operating system. We need to have a 32-bit process, since Office is strictly a 32-bit application (that is until Office 2010 is released), but because our process is running on an x64 operating system, the process will be loaded in x64 mode. In this case, we want to specify that our assembly should always be targeted to x86 architecture, even when running on an x64 operating system.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13524907-6228564259408254525?l=thingsthatshouldbeeasy.blogspot.com'/&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/-l6yynoRxoZq_P3VU5ONepZ9r7Q/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/-l6yynoRxoZq_P3VU5ONepZ9r7Q/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/-l6yynoRxoZq_P3VU5ONepZ9r7Q/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/-l6yynoRxoZq_P3VU5ONepZ9r7Q/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ThingsThatShouldBeEasy/~4/HtAW5q4Eoi8" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://thingsthatshouldbeeasy.blogspot.com/feeds/6228564259408254525/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=13524907&amp;postID=6228564259408254525" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/13524907/posts/default/6228564259408254525?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/13524907/posts/default/6228564259408254525?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ThingsThatShouldBeEasy/~3/HtAW5q4Eoi8/anycpu-x86-x64-whats-difference.html" title="AnyCPU, x86, x64 – What’s the Difference?" /><author><name>Eugene Rosenfeld [former MOSS MVP]</name><uri>http://www.blogger.com/profile/07177988916544941383</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="04308528651051363456" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://thingsthatshouldbeeasy.blogspot.com/2009/08/anycpu-x86-x64-whats-difference.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0cHRHY6eip7ImA9WxJbGUs.&quot;"><id>tag:blogger.com,1999:blog-13524907.post-7371129729435474197</id><published>2009-07-30T10:43:00.001-04:00</published><updated>2009-07-30T10:43:55.812-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-07-30T10:43:55.812-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="x64" /><category scheme="http://www.blogger.com/atom/ns#" term="VMWare" /><category scheme="http://www.blogger.com/atom/ns#" term="Virtualization" /><category scheme="http://www.blogger.com/atom/ns#" term="Microsoft" /><title>Creating 64-bit Virtual Machines</title><content type="html">&lt;p&gt;I’ve heard a bit of confusion recently over just what is needed to create 64-bit virtual machines using Microsoft technologies. Part of the confusion stems from the very liberal use of the term “64-bit support” by much of the Microsoft marketing folks in relation to their virtualization offerings. So lets clear things up.&lt;/p&gt;  &lt;p&gt;First, here’s the list of Microsoft operating system virtualization products:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Virtual PC 2007&lt;/li&gt;    &lt;li&gt;Virtual Server 2005 R2&lt;/li&gt;    &lt;li&gt;Hyper-V for Windows Server 2008&lt;/li&gt;    &lt;li&gt;Hyper-V R2 for Windows Server 2008 R2&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Next, lets get some terms straight:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Host: This is the physical server that is running the operating system virtualization software.&lt;/li&gt;    &lt;li&gt;Guest: This is &lt;strong&gt;the virtual machine &lt;/strong&gt;running within the operating system virtualization software on the host.&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;The confusion I mentioned earlier comes from the Microsoft marketing folks use of the term “64-bit support”. So what does “64-bit support” mean?&lt;/p&gt;  &lt;p&gt;According to Microsoft marketing:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;em&gt;The operating system virtualization software that &lt;strong&gt;can be installed on a 64-bit host&lt;/strong&gt;.&lt;/em&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;According to everyone else:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;em&gt;The virtualization software can be used to &lt;strong&gt;create 64-bit guests&lt;/strong&gt;.&lt;/em&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Now that we have our terms in order, we will answer the real question: what Microsoft products can be used to create 64-bit guests? The answer: Hyper-V and Hyper-V R2. That’s it. Virtual PC and Virtual Server can only create 32-bit guests, even when installed on 64-bit hosts. What does this mean for you? &lt;/p&gt;  &lt;p&gt;If you want to create 64-bit virtual machines using Microsoft products, you need:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Windows Server 2008 x64, Standard or Enterprise or Windows Server 2008 R2 x64, Standard or Enterprise running on a 64-bit host computer&lt;/li&gt;    &lt;li&gt;Hyper-V or Hyper-V R2&lt;/li&gt;    &lt;li&gt;The host computer CPU(s) must have the VT extensions turned on. These are turned off by default on many desktop and workstation class machines.&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;It also means that you &lt;strong&gt;can not run 64-bit guest virtual machines using Microsoft virtualization software &lt;/strong&gt;on Windows XP, Vista, Windows 7, or Windows Server 2003 host operating systems, even if using the 64-bit versions of these operating systems. If you want to run 64-bit guests on any of these operating systems, you will need to look at virtualization software from another vendor, such as &lt;a href="https://www.vmware.com/products/datacenter-virtualization.html" target="_blank"&gt;VMware&lt;/a&gt;, which also has a number of free virtualization offerings: VMware Server and VMware ESXi.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13524907-7371129729435474197?l=thingsthatshouldbeeasy.blogspot.com'/&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/k-l8IfXXYjPCh5x7XytidLWl198/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/k-l8IfXXYjPCh5x7XytidLWl198/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/k-l8IfXXYjPCh5x7XytidLWl198/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/k-l8IfXXYjPCh5x7XytidLWl198/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ThingsThatShouldBeEasy/~4/BNeXm_jO2iQ" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://thingsthatshouldbeeasy.blogspot.com/feeds/7371129729435474197/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=13524907&amp;postID=7371129729435474197" title="3 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/13524907/posts/default/7371129729435474197?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/13524907/posts/default/7371129729435474197?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ThingsThatShouldBeEasy/~3/BNeXm_jO2iQ/creating-64-bit-virtual-machines.html" title="Creating 64-bit Virtual Machines" /><author><name>Eugene Rosenfeld [former MOSS MVP]</name><uri>http://www.blogger.com/profile/07177988916544941383</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="04308528651051363456" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">3</thr:total><feedburner:origLink>http://thingsthatshouldbeeasy.blogspot.com/2009/07/creating-64-bit-virtual-machines.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkcFRXY4eyp7ImA9WxJbGEk.&quot;"><id>tag:blogger.com,1999:blog-13524907.post-4930549922050604767</id><published>2009-07-29T01:06:00.001-04:00</published><updated>2009-07-29T01:06:54.833-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-07-29T01:06:54.833-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Blog Readership" /><title>Over 3000 visits last month</title><content type="html">&lt;p&gt;This blog just hit a milestone: over 3000 visits last month! Now I know that 3000 visits in a month pales in comparison to the stats many of my fellow SharePoint MVPs get on their blogs, but this is a personal best for me. So, I’m twisting open a cap on a 20oz Mountain Dew and tearing open a movie-sized bag of Peanut M&amp;amp;Ms, and I’m celebrating. These stats are just beautiful &amp;lt;wiping away the tears of joy&amp;gt;:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_z3BYpxQRvUs/Sm_Y6saqCdI/AAAAAAAAAEI/B77tztpWNjA/s1600-h/image%5B2%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://lh6.ggpht.com/_z3BYpxQRvUs/Sm_Y7Q7BK4I/AAAAAAAAAEM/LuEQBUYq7xc/image_thumb.png?imgmax=800" width="370" height="245" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;But I’m not resting. I’m going to put some effort in over the next few months to try and expand the readership of this blog. I got a lot of good advice from several of my fellow MVPs, and I wanted to take a moment and thank them:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://www.andrewconnell.com/blog" target="_blank"&gt;Andrew Connell&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="http://weblogs.asp.net/bsimser/" target="_blank"&gt;Bil Simser&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="http://harbar.net/" target="_blank"&gt;Spencer Harbar&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.spsfaq.com" target="_blank"&gt;Stephen Cummins&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="http://arnonel.com" target="_blank"&gt;Arno Nel&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.thorprojects.com/blog" target="_blank"&gt;Robert L. Bogue&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="http://stsadm.blogspot.com" target="_blank"&gt;Gary Lapointe&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.sharepoint-tips.com" target="_blank"&gt;Ishai Sagi&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="http://blog.brainlitter.com" target="_blank"&gt;Sean Walbridge&lt;/a&gt;&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Stay tuned for the progress reports. In my next post on this subject, I’ll tally up what I’ve done so far. And of course, thanks for reading.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13524907-4930549922050604767?l=thingsthatshouldbeeasy.blogspot.com'/&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/bcfb66304BHWG32b4dKr1bdJ5_8/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/bcfb66304BHWG32b4dKr1bdJ5_8/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/bcfb66304BHWG32b4dKr1bdJ5_8/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/bcfb66304BHWG32b4dKr1bdJ5_8/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ThingsThatShouldBeEasy/~4/dNqPwLZoWEU" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://thingsthatshouldbeeasy.blogspot.com/feeds/4930549922050604767/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=13524907&amp;postID=4930549922050604767" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/13524907/posts/default/4930549922050604767?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/13524907/posts/default/4930549922050604767?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ThingsThatShouldBeEasy/~3/dNqPwLZoWEU/over-3000-visits-last-month.html" title="Over 3000 visits last month" /><author><name>Eugene Rosenfeld [former MOSS MVP]</name><uri>http://www.blogger.com/profile/07177988916544941383</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="04308528651051363456" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total><feedburner:origLink>http://thingsthatshouldbeeasy.blogspot.com/2009/07/over-3000-visits-last-month.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0AASHY8fCp7ImA9WxJbF0Q.&quot;"><id>tag:blogger.com,1999:blog-13524907.post-1734798864739540077</id><published>2009-07-28T10:34:00.000-04:00</published><updated>2009-07-28T10:35:49.874-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-07-28T10:35:49.874-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="SharePoint 2010" /><category scheme="http://www.blogger.com/atom/ns#" term="SharePoint" /><category scheme="http://www.blogger.com/atom/ns#" term="WSS" /><category scheme="http://www.blogger.com/atom/ns#" term="Vista" /><category scheme="http://www.blogger.com/atom/ns#" term="MOSS" /><category scheme="http://www.blogger.com/atom/ns#" term="Office" /><title>File not found error uploading multiple files to SharePoint</title><content type="html">&lt;p&gt;A colleague of mine recently had an odd issue when trying to uploading files to a SharePoint site. Here’s what happened…&lt;/p&gt;  &lt;p&gt;When he tried to upload multiple document to a MOSS 2007 document library from a Vista desktop that has IE8, things worked fine if he was using documents that are in his user profile. But when he selected documents that were not in his user profile (Ex: folder on c: drive or USB drive), he got a file not found message when trying to upload.&amp;#160; If he upload a single file from the same location, or if he dragged and dropped via the explorer view he have no issue.&lt;/p&gt;  &lt;p&gt;I hadn’t seen that particular issue before, but I have seen weird behavior with Vista about accessing certain files when UAC is enabled. Basically, Vista wants to raise the UAC dialog box to allow you to access files off of root drive directories, including USB drives. But, I thought I remembered that Vista sometimes cannot or does not display the UAC from Internet Explorer. So IE just fails if it needs to access these files.&lt;/p&gt;  &lt;p&gt;I recommended that he disable UAC on his Vista machine as an easy way to test. Good news: it worked. The moral of the story: if Internet Explorer is behaving oddly when needing to access certain files on a Vista machine, try disabling UAC.&lt;/p&gt;  &lt;p&gt;Microsoft’s &lt;a href="http://blogs.msdn.com/tims/about.aspx" target="_blank"&gt;Tim Sneath&lt;/a&gt; has a how-to on &lt;a href="http://blogs.msdn.com/tims/archive/2006/09/20/763275.aspx" target="_blank"&gt;disabling Vista UAC&lt;/a&gt;.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13524907-1734798864739540077?l=thingsthatshouldbeeasy.blogspot.com'/&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/8Hd5PekbSD-UyloS3UQWVPKdyew/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/8Hd5PekbSD-UyloS3UQWVPKdyew/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/8Hd5PekbSD-UyloS3UQWVPKdyew/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/8Hd5PekbSD-UyloS3UQWVPKdyew/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ThingsThatShouldBeEasy/~4/J3OCpXMtv0U" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://thingsthatshouldbeeasy.blogspot.com/feeds/1734798864739540077/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=13524907&amp;postID=1734798864739540077" title="12 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/13524907/posts/default/1734798864739540077?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/13524907/posts/default/1734798864739540077?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ThingsThatShouldBeEasy/~3/J3OCpXMtv0U/file-not-found-error-uploading-multiple.html" title="File not found error uploading multiple files to SharePoint" /><author><name>Eugene Rosenfeld [former MOSS MVP]</name><uri>http://www.blogger.com/profile/07177988916544941383</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="04308528651051363456" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">12</thr:total><feedburner:origLink>http://thingsthatshouldbeeasy.blogspot.com/2009/07/file-not-found-error-uploading-multiple.html</feedburner:origLink></entry></feed>
