<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" version="2.0"><channel><title>Mark Arend</title><link>http://blogs.msdn.com/b/markarend/</link><description>SharePoint 2010 Explorations</description><dc:language>en</dc:language><generator>Telligent Evolution Platform Developer Build (Build: 5.6.50428.7875)</generator><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/MarkArendSharePoint" /><feedburner:info xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" uri="markarendsharepoint" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item><title>Host Named Site Collections (HNSC) for SharePoint 2010 Architects</title><link>http://blogs.msdn.com/b/markarend/archive/2012/05/30/host-named-site-collections-hnsc-for-sharepoint-2010-architects.aspx</link><pubDate>Wed, 30 May 2012 23:20:07 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10312073</guid><dc:creator>Mark Arend</dc:creator><slash:comments>0</slash:comments><wfw:commentRss>http://blogs.msdn.com/b/markarend/rsscomments.aspx?WeblogPostID=10312073</wfw:commentRss><comments>http://blogs.msdn.com/b/markarend/archive/2012/05/30/host-named-site-collections-hnsc-for-sharepoint-2010-architects.aspx#comments</comments><description>&lt;p&gt;I recently came across a very good blog posting on Host Named Site Collections (HNSC), and I recommend it: &lt;a href="http://blogs.msdn.com/b/kaevans/archive/2012/03/27/what-every-sharepoint-admin-needs-to-know-about-host-named-site-collections.aspx"&gt;What Every SharePoint Admin Needs to Know about Host Named Site Collections&lt;/a&gt; by Kirk Evans.&amp;#160; Kirk has lots of good details here that will help answer questions on this popular feature with some obscure underpinnings.&lt;/p&gt;  &lt;p&gt;However, I worked up other material on HNSC some time ago that’s not found in Kirk’s article.&amp;#160; Mine is targeted more to the SharePoint Architect who is considering the best way to design and use HNSC in a SharePoint farm. &lt;/p&gt;  &lt;p&gt;One small discrepancy with Kirk’s article—he relates a commonly accepted fact of HNSC: “if you are going to implement host named site collections, you should not use a host header for the containing web application that houses the host named site collections or it will not work properly.”&amp;#160; The most unfortunate thing about this is that it requires you to use different IP&amp;#160; addresses or ports if you want more than one web application to host HNSC.&amp;#160; Fortunately, I was able to find that Microsoft does indeed support Host Headers &lt;em&gt;and&lt;/em&gt; HNSC on the same web application; I give the procedure below and tips for verifying support through Microsoft Premier.&amp;#160; This provides an additional degree of flexibility for architecting your SharePoint farm.&lt;/p&gt;  &lt;h4&gt;&lt;a name="_Ref284323877"&gt;Host Named Site Collections&lt;/a&gt;&lt;/h4&gt;  &lt;p&gt;The mechanism for consolidating existing web applications into individual site collections, yet retain their existing URLs, is to use Host-Named Site Collections (HNSC). This is a feature of SharePoint that allows individual site collections to have their own top-level URL. This section explores pertinent points from TechNet article &lt;a href="http://technet.microsoft.com/en-us/library/cc424952.aspx"&gt;Plan for host-named site collections (SharePoint Server 2010)&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Benefits&lt;/b&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Much more scalable for vanity URLs because there can be thousands of site collections per web application, but only 20 web applications per farm.&lt;/li&gt;    &lt;li&gt;Managed paths may still be used on an HNSC web application, so that the more familiar “path-based” site collections may be created.&lt;/li&gt;    &lt;ul&gt;     &lt;li&gt;An explicit or wildcard managed path may be created in the “normal” way, so that non-HNSC site collections may be created on them, as usual. This is done using Central Admin.&lt;/li&gt;      &lt;li&gt;Also, explicit and wildcard managed paths may be created on the web app that will apply to each HNSC site collection created. That is, each HNSC site collection will have the same managed paths that are created this way. This is done using PowerShell scripts; an example below shows adding these kind of managed paths..&lt;/li&gt;   &lt;/ul&gt; &lt;/ul&gt;  &lt;p&gt;&lt;b&gt;Drawbacks&lt;/b&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;HNSC may only be created using PowerShell scripts (or programmatically), not via the SharePoint UI. &lt;/li&gt;    &lt;ul&gt;     &lt;li&gt;This introduces additional effort in creating them, similar to the effort of creating an additional web application, which requires a farm administrator, but with the added requirement of having to execute a PowerShell script on one of the farm servers. This also means that a higher level of access—server administrator—is required to create new HNSC. It would be possible to develop a simple extension to SharePoint that could be executed from Central Administration (or other administration site) to call the appropriate PowerShell script, so that this operation could be delegated back to a farm administrator.&lt;/li&gt;   &lt;/ul&gt;    &lt;li&gt;HNSC cannot use alternate access mappings. Host-named site collections are automatically considered to be in the Default zone, and the URL of the request must not be modified between the end user and the server. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;b&gt;Special considerations &lt;/b&gt;&lt;/p&gt;  &lt;p&gt;For using SSL and SSL with encryption offloading, some special considerations apply.&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Because SharePoint Server 2010 uses the public URL in the Default zone of the Web application to determine whether host-named site collections will be rendered as HTTP or SSL, you can now use host-named site collections with off-box SSL termination. There are 3 requirements to use SSL termination with host-named site collections:&lt;/li&gt;    &lt;ul&gt;     &lt;li&gt;The public URL in the Default zone of the Web application must be an HTTPS-based URL.&lt;/li&gt;      &lt;li&gt;The SSL terminator or reverse proxy must preserve the original HTTP host header from the client.&lt;/li&gt;      &lt;li&gt;If the client SSL request is sent to the default SSL port (443), then the SSL terminator or reverse proxy must forward the decrypted HTTP request to the front-end Web server on the default HTTP port (80). If the client SSL request is sent to a non-default SSL port, then the SSL terminator or reverse proxy must forward the decrypted HTTP request to the front-end Web server on the same non-default port.&lt;/li&gt;   &lt;/ul&gt;    &lt;li&gt;To use host-named site collections with off-box SSL termination, configure your Web application as you normally would for SSL termination and ensure that it meets the requirements described above. In this scenario, SharePoint Server 2010 will render links of its host-named site collections in that Web application using HTTPS instead HTTP.&lt;/li&gt;    &lt;li&gt;SharePoint Server 2010 does not support a host-named site collection using both HTTP- and SSL-based URLs simultaneously. If some host-named site collections need to be available over HTTP while other host-named site collections need to be available over SSL, separate the host-named site collections into two different Web applications dedicated for that type of access. In this scenario, HTTP host-named site collections should be in a Web application dedicated for HTTP access and SSL host-named site collections should be in a Web application dedicated for SSL access.&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Both types of site collections may be mixed on the same web application. Comparison of features:&lt;/p&gt;  &lt;table border="1" cellspacing="0" cellpadding="0"&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td valign="top" width="211"&gt;         &lt;p&gt;&lt;b&gt;Feature&lt;/b&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td width="257"&gt;         &lt;p&gt;&lt;b&gt;Path-Based Site Collection&lt;/b&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td width="257"&gt;         &lt;p&gt;&lt;b&gt;Host-Named Site Collection&lt;/b&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="211"&gt;         &lt;p&gt;Managed Paths&lt;/p&gt;       &lt;/td&gt;        &lt;td width="257"&gt;         &lt;p&gt;YES&lt;/p&gt;       &lt;/td&gt;        &lt;td width="257"&gt;         &lt;p&gt;YES*&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="211"&gt;         &lt;p&gt;Create new site collection at top level&lt;/p&gt;       &lt;/td&gt;        &lt;td width="257"&gt;         &lt;p&gt;SharePoint UI&lt;/p&gt;       &lt;/td&gt;        &lt;td width="257"&gt;         &lt;p&gt;PowerShell Script&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="211"&gt;         &lt;p&gt;Create new site collection on a managed path&lt;/p&gt;       &lt;/td&gt;        &lt;td width="257"&gt;         &lt;p&gt;SharePoint UI&lt;/p&gt;       &lt;/td&gt;        &lt;td width="257"&gt;         &lt;p&gt;PowerShell Script&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="211"&gt;         &lt;p&gt;Authentication Zone&lt;/p&gt;       &lt;/td&gt;        &lt;td width="257"&gt;         &lt;p&gt;Choose: Default, Internet, Intranet, Extranet, Custom&lt;/p&gt;       &lt;/td&gt;        &lt;td width="257"&gt;         &lt;p&gt;Default only&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="211"&gt;         &lt;p&gt;Alternate Access Mapping (AAM)&lt;/p&gt;       &lt;/td&gt;        &lt;td width="257"&gt;         &lt;p&gt;YES&lt;/p&gt;       &lt;/td&gt;        &lt;td width="257"&gt;         &lt;p&gt;No&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="211"&gt;         &lt;p&gt;SSL&lt;/p&gt;       &lt;/td&gt;        &lt;td width="257"&gt;         &lt;p&gt;YES&lt;/p&gt;       &lt;/td&gt;        &lt;td width="257"&gt;         &lt;p&gt;YES&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="211"&gt;         &lt;p&gt;SSL Termination (encryption offloading)&lt;/p&gt;       &lt;/td&gt;        &lt;td width="257"&gt;         &lt;p&gt;YES&lt;/p&gt;       &lt;/td&gt;        &lt;td width="257"&gt;         &lt;p&gt;YES**&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="211"&gt;         &lt;p&gt;Kerberos&lt;/p&gt;       &lt;/td&gt;        &lt;td width="257"&gt;         &lt;p&gt;YES&lt;/p&gt;       &lt;/td&gt;        &lt;td width="257"&gt;         &lt;p&gt;YES&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;p&gt;* Managed paths for HNSC and the site collections created on them must both be created using PowerShell scripts. The example later in this section shows both of these techniques.&lt;/p&gt;  &lt;p&gt;** Offloading encryption for SSL sites is possible with HNSC, but has slightly more stringent requirements for configuration. Specifically: the public URL in the Default zone of the Web application must be an HTTPS-based URL, and the SSL terminator or reverse proxy must preserve the original HTTP host header from the client. Also, best to use standard ports 80 and 443.&lt;/p&gt;  &lt;p&gt;Kerberos authentication works with HNSC as it does with an HH web application—must register a Service Principal Name (SPN) for the external URL on the identity of the application pool that hosts the web app.&lt;/p&gt;  &lt;p&gt;The strategy recommended is:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Create a &lt;b&gt;Host-Named Site Collection&lt;/b&gt; for every request for a site that requires its own “vanity” URL. That these URLs can be either of the format &lt;a href="http://newsite.bcbsfl.com"&gt;http://newsite.customer.com&lt;/a&gt;, or even &lt;a href="http://www.newsite.com"&gt;http://www.newsite.com&lt;/a&gt;, as far as SharePoint is concerned.&lt;/li&gt;    &lt;ul&gt;     &lt;li&gt;DNS must be configured to serve the appropriate addresses.&amp;#160; If there are more than one web application in the farm that contain Host-Named Site Collections, then it will probably not be possible to use a wildcard DNS “A” record such as *.customer.com to direct all traffic correctly, but each HNSC will need a separate DNS “A” record. See analysis of options for creating multiple web apps, below.&lt;/li&gt;      &lt;li&gt;This option is for a less frequent, more “long-term” type of configuration request, justifying the additional effort.&lt;/li&gt;   &lt;/ul&gt;    &lt;li&gt;Create a &lt;b&gt;Path-Based Site Collection&lt;/b&gt; for every request for a site that falls in the category of an existing web application. These use URLs such as &lt;a href="http://teams.bcbsfl.com/sites/TeamOne"&gt;http://teams.customer.com/sites/TeamOne&lt;/a&gt;, where TeamOne is the path-based site collection that may be created through the SharePoint UI. Explicit managed paths may also be used, such as &lt;a href="http://teams.customer.com/TeamTwo"&gt;http://teams.customer.com/TeamTwo&lt;/a&gt;. &lt;/li&gt;    &lt;ul&gt;     &lt;li&gt;This option is for a more frequent type, “immediate” type of configuration request for new teams, communities, projects, etc., and can be accomplished entirely within SharePoint without server or external dependencies.&lt;/li&gt;   &lt;/ul&gt; &lt;/ul&gt;  &lt;p&gt;From an organization standpoint, it may be desirable to use a few individual web applications to organize sites by certain criteria, to better manage different types of sites from a standpoint of security, reliability, performance, scalability or SLA.&amp;#160; For the examples below, we’ll consider two web applications labeled “Standard” and “Sensitive”, then deploy HNSC to each web application.&lt;/p&gt;  &lt;p&gt;Basic instructions for creating HNSC assume there is only one web application that supports these on the farm. When deploying multiple web applications that each will host HNSC, some additional complexity is required to create the web applications correctly. The following table compares the options for accomplishing this.&lt;/p&gt;  &lt;h5&gt;Options for creating multiple web apps for Host-Named Site Collections (HNSC)&lt;/h5&gt;  &lt;p&gt;When creating multiple web applications in SharePoint, they are often configured to use different &lt;b&gt;Host Header&lt;/b&gt; (HH) names to ensure uniqueness, while having the same IP address and port (80 or 443). Host Header names on web applications are largely incompatible with Host-Named Site Collections, but can be made to work in a supported way.&amp;#160; The following table examines each option for creating multiple web apps, and their implications for HNSC:&lt;/p&gt;  &lt;table border="1" cellspacing="0" cellpadding="0"&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td valign="top" width="166"&gt;         &lt;p&gt;&lt;b&gt;Option&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td valign="top" width="386"&gt;         &lt;p&gt;&lt;b&gt;Implications&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td valign="top" width="160"&gt;         &lt;p&gt;&lt;b&gt;Supported?&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="166"&gt;         &lt;p&gt;1. Create web apps using different &lt;b&gt;ports&lt;/b&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td valign="top" width="386"&gt;         &lt;p&gt;Configure entirely through SharePoint UI.&lt;/p&gt;          &lt;p&gt;Some HNSC will require nonstandard ports in URLs; e.g. &lt;a href="http://teams.customer.com:81"&gt;http://teams.customer.com:81&lt;/a&gt;&lt;/p&gt;          &lt;p&gt;All URLs must include port numbers (That is, &lt;i&gt;one&lt;/i&gt; web application hosting HNSC could use default port 80, but any additional web apps hosting HNSC would need to use a different port, and this would be required in all URLs hosted by those web applications.)&lt;/p&gt;       &lt;/td&gt;        &lt;td valign="top" width="160"&gt;         &lt;p&gt;&lt;b&gt;Yes&lt;/b&gt; (out-of-box)&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="166"&gt;         &lt;p&gt;2. Create web apps using different &lt;b&gt;IP addresses&lt;/b&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td valign="top" width="386"&gt;         &lt;p&gt;Requires multiple IP addresses, one per each web app that’s hosting HNSC.&lt;/p&gt;          &lt;p&gt;Must manually configure different IP addresses, per web app, per server.&lt;/p&gt;          &lt;p&gt;Must create VIP for each HNSC web app&lt;/p&gt;          &lt;p&gt;Must configure DNS for each HNSC to appropriate VIP&lt;/p&gt;          &lt;p&gt;Gives desired URLs, consolidated into multiple web applications, separated by category to enforce security, performance, reliability and scalability.&amp;#160; However, there is additional complexity of maintaining different IP addresses and mappings in DNS and the load balancer.&lt;/p&gt;       &lt;/td&gt;        &lt;td valign="top" width="160"&gt;         &lt;p&gt;&lt;b&gt;Yes&lt;/b&gt; (KB927376, applies also to SharePoint 2010)&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="166"&gt;         &lt;p&gt;3. Create web apps using different &lt;b&gt;host headers&lt;/b&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td valign="top" width="386"&gt;         &lt;p&gt;Blocks HNSC URLs being recognized by IIS.&lt;/p&gt;          &lt;p&gt;Must manually configure IIS to bind HNSC URLs to unblock, per web app, per server.&lt;/p&gt;          &lt;p&gt;This option has all the benefits of option 2, with the added benefit that DNS can be configured with wildcard third-level domain names so that creation of a new HNSC does not necessarily require a new DNS record.&lt;/p&gt;       &lt;/td&gt;        &lt;td valign="top" width="160"&gt;         &lt;p&gt;&lt;b&gt;Yes&lt;/b&gt; (reference Microsoft Premier case 111022261144490)&lt;b&gt;&lt;/b&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;h4&gt;Option 1 – Identify by Port&lt;/h4&gt;  &lt;p&gt;This is the simplest approach, described in the reference article &lt;a href="http://technet.microsoft.com/en-us/library/cc424952.aspx"&gt;Plan for host-named site collections (SharePoint Server 2010)&lt;/a&gt;.&amp;#160; &lt;/p&gt;  &lt;p&gt;The problem with this approach is that if you want to configure more than one web application for HNSC, then only one of them may use default port 80 or 443, while the others must use different ports; many organizations don’t wish to require their users to enter ports for URLs to the various sites they plan for their intranet.&lt;/p&gt;  &lt;h4&gt;Option 2 – Identify by IP Address&lt;/h4&gt;  &lt;p&gt;This approach allows the creation of multiple web applications that are uniquely identified by IP address.&amp;#160; This means that “clean” URLs may be presented to the end user, without ports.&amp;#160; The drawbacks here are not necessarily terrible, but worth considering:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Multiple IP addresses are required on the farm WFE servers; one per HNSC web application per WFE server.&amp;#160; This isn’t hard to configure, but some companies have policies against it that must be waived with a business justification.&lt;/li&gt;    &lt;li&gt;Creating a new HNSC web application means a new IP address must be provisioned onto each of the WFE servers, and into the load balancer, with a new Virtual IP (VIP) address as well.&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;b&gt;IP Addresses.&lt;/b&gt; The first web application configured to host HNSC could use the “default” IP address of the server, but each additional web application to host HNSC must have a unique IP address. To accomplish this, the Network Interface Card (NIC) providing user access on each WFE server must be configured with multiple IP addresses. Naturally IP addresses will be different across all servers.&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Load Balancer.&lt;/b&gt; The load balancer that distributes requests across all web front end servers must be configured with multiple Virtual IP (VIP) addresses. Each VIP will load balance out to the IP addresses associated with a separate web application across the WFE servers.&lt;/p&gt;  &lt;p&gt;&lt;b&gt;DNS.&lt;/b&gt; Finally, DNS must be configured with the root URLs of the HNSC, each targeted to the appropriate load-balanced VIP. A wildcard “A” record like &lt;b&gt;*.customer.com&lt;/b&gt; cannot be used, unless DNS can be configured to guarantee that it will first honor all explicit “A” records such as &lt;b&gt;teams.customer.com&lt;/b&gt;.&lt;/p&gt;  &lt;p&gt;The following diagram shows conceptually the relationship among these aspects, also illustrating how non-HNSC web applications are configured:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-68-30-metablogapi/0336.image_5F00_6DAFB3AD.png"&gt;&lt;img style="margin-right: auto; margin-left: auto; float: none; display: block; background-image: none;" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-68-30-metablogapi/2084.image_5F00_thumb_5F00_36F258A9.png" width="653" height="326" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;In this diagram, each WFE has a “default” IP address; this is used for all requests to the server that are not host-named site collections, including Host Header web applications (e.g. mysite.customer.com, app.customer.com) and web applications distinguished with a separate port. Also, one web app hosting HNSC may also use this IP address. Then, additional IP addresses are shown, corresponding to each additional web application serving HNSC. Note, this arrangement minimizes the number of IP addresses required on each server. If that is not of great concern, it will be clearer to simply use a unique IP address for each HNSC web app, &lt;i&gt;not&lt;/i&gt; configuring one of these on the default IP.&lt;/p&gt;  &lt;p&gt;There must be a load-balanced VIP corresponding to each of the separate IP addresses across the WFE servers. VIP.1 is the “typical” VIP that distributes inbound requests to each server’s default IP address. VIP.2 distributes inbound requests to each server’s next additional IP address, and so on.&lt;/p&gt;  &lt;p&gt;Note: for DNS entry &lt;b&gt;*.customer.com&lt;/b&gt;, this will only work if DNS can be configured to examine inbound requests against all other explicit &lt;b&gt;A&lt;/b&gt; records prior to following this wildcard entry.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;How to create web applications with different IP addresses for HNSC&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;The following PowerShell scripts illustrate steps for configuring different IP addresses per web app, per server. This script creates two web apps, configures them to different IP addresses, then creates managed paths and a series of host-named site collections on the web apps. This approach follows &lt;a href="http://support.microsoft.com/kb/927376"&gt;KB article 927376&lt;/a&gt;, which gives the supported method for configuring web applications on different IP addresses. Written for MOSS 2007, KB article &lt;a href="http://support.microsoft.com/kb/927376"&gt;927376&lt;/a&gt; also applies to SharePoint 2010.&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Full example scenario for option 2&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;1. Create web applications on the farm using host header names. Use the SharePoint UI to do this, or a PowerShell script such as the following.&lt;/p&gt;  &lt;table&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td&gt; &lt;/td&gt;        &lt;td bgcolor="#cccccc"&gt;&lt;font face="Courier New"&gt;           &lt;p style="backcolor: #aaaaaa;"&gt;# Create web apps using Host Headers so multiple can be created on port 80.&lt;/p&gt;            &lt;p&gt;# Run this once per farm&lt;/p&gt;            &lt;p&gt;New-SPWebApplication -ApplicationPool &amp;quot;SharePoint Web Apps&amp;quot; -Name &amp;quot;Portal&amp;quot; –HostHeader Portal -DataBaseName &amp;quot;WSS_Content_Portal&amp;quot; -DatabaseServer &amp;quot;FARMSQL&amp;quot; -Path &amp;quot;C:\inetpub\wwwroot\wss\VirtualDirectories\Portal&amp;quot; -Port 80 -URL &amp;quot;http://Portal:80&amp;quot; &lt;/p&gt;            &lt;p&gt;New-SPWebApplication -ApplicationPool &amp;quot;SharePoint Web Apps&amp;quot; -Name &amp;quot;Teams&amp;quot; -HostHeader Teams -DataBaseName &amp;quot;WSS_Content_Teams&amp;quot; -DatabaseServer &amp;quot;FARMSQL&amp;quot; -Path &amp;quot;C:\inetpub\wwwroot\wss\VirtualDirectories\Teams&amp;quot; -Port 80 -URL &amp;quot;http://Teams:80&amp;quot; &lt;/p&gt;         &lt;/font&gt;&lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;p&gt;2. Change the bindings on the web applications just created in order to use IP addresses. It’s recommended to do this using PowerShell because the scripts can be created ahead of time and reviewed for correctness over multiple runs, instead of relying on a manual configuration via IIS manager each time. Note that the IP addresses will be different for each WFE server.&lt;/p&gt;  &lt;table&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td&gt; &lt;/td&gt;        &lt;td bgcolor="#cccccc"&gt;&lt;font face="Courier New"&gt;           &lt;p&gt;# Change bindings on web applications from host headers to IP Addresses&lt;/p&gt;            &lt;p&gt;# Run this once on each WFE server&lt;/p&gt;            &lt;p&gt;# Requires IIS Administration module&lt;/p&gt;            &lt;p&gt;Import-Module WebAdministration&lt;/p&gt;            &lt;p&gt;# Remove bindings with Host Headers from IIS sites&lt;/p&gt;            &lt;p&gt;Remove-WebBinding -Name &amp;quot;Portal&amp;quot; -HostHeader &amp;quot;Portal&amp;quot;&lt;/p&gt;            &lt;p&gt;Remove-WebBinding -Name &amp;quot;Teams&amp;quot; -HostHeader &amp;quot;Teams&amp;quot;&lt;/p&gt;            &lt;p&gt;# Replace with new bindings having unique IP Addresses&lt;/p&gt;            &lt;p&gt;New-WebBinding -Name &amp;quot;Portal&amp;quot; -IPAddress 192.168.3.11 -Port 80&lt;/p&gt;            &lt;p&gt;New-WebBinding -Name &amp;quot;Teams&amp;quot; -IPAddress 192.168.3.12 -Port 80&lt;/p&gt;         &lt;/font&gt;&lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;p&gt;3. Create Host-Named Site Collections on the web applications. PowerShell must be used to do this because the SharePoint UI does not provide this specific configuration option.&lt;/p&gt;  &lt;table&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td&gt; &lt;/td&gt;        &lt;td bgcolor="#cccccc"&gt;&lt;font face="Courier New"&gt;           &lt;p&gt;# Create Host-Named Site Collections (HNSC)&lt;/p&gt;            &lt;p&gt;# Run this once per farm&lt;/p&gt;            &lt;p&gt;# Add managed paths (for all HNSC in farm)&lt;/p&gt;            &lt;p&gt;New-SPManagedPath &amp;quot;it&amp;quot; -Explicit -HostHeader -ErrorAction Continue&lt;/p&gt;            &lt;p&gt;New-SPManagedPath &amp;quot;sec&amp;quot; -Explicit -HostHeader -ErrorAction Continue&lt;/p&gt;            &lt;p&gt;# Create HNSC on Portal&lt;/p&gt;            &lt;p&gt;New-SPSite http://communities.customer.com -HostHeaderWebApplication http://Portal -Name &amp;quot;CUSTOMER Community Sites&amp;quot; -Template &amp;quot;STS#0&amp;quot; -OwnerAlias CUSTOMER\Administrator &lt;/p&gt;            &lt;p&gt;New-SPSite http://intranet.customer.com -HostHeaderWebApplication http://Portal -Name &amp;quot;The Intranet&amp;quot; -Template &amp;quot;BLANKINTERNETCONTAINER#0&amp;quot; -OwnerAlias CUSTOMER\Administrator &lt;/p&gt;            &lt;p&gt;# Create HNSC on Teams, with sites on managed paths&lt;/p&gt;            &lt;p&gt;New-SPSite http://teams.customer.com -HostHeaderWebApplication http://Teams -Name &amp;quot;CUSTOMER Team sites&amp;quot; -Template &amp;quot;STS#1&amp;quot; -OwnerAlias CUSTOMER\Administrator&lt;/p&gt;            &lt;p&gt;New-SPSite http://teams.customer.com/it -HostHeaderWebApplication http://Teams -Name &amp;quot;CUSTOMER IT - Information Technology&amp;quot; -Template &amp;quot;BLOG#0&amp;quot; -OwnerAlias CUSTOMER\Administrator&lt;/p&gt;            &lt;p&gt;New-SPSite http://teams.customer.com/sec -HostHeaderWebApplication http://Teams -Name &amp;quot;CUSTOMER SEC - Information Security&amp;quot; -Template &amp;quot;BLOG#0&amp;quot; -OwnerAlias CUSTOMER\Administrator&lt;/p&gt;            &lt;p&gt;New-SPSite http://project.customer.com -HostHeaderWebApplication http://Teams -Name &amp;quot;Project Tracking&amp;quot; -Template &amp;quot;SGS#0&amp;quot; -OwnerAlias CUSTOMER\Administrator&lt;/p&gt;         &lt;/font&gt;&lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;p&gt; &lt;/p&gt;  &lt;h4&gt;Option 3 – Identify by Host Header&lt;/h4&gt;  &lt;p&gt;The TechNet article we’ve been referencing says several things against this option:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;“In most cases, applying a host header binding at the IIS Web site level makes it impossible to access host-named site collections through the IIS Web site. This is because IIS will not respond to requests for host names that differ from the host header binding.”&lt;/p&gt;    &lt;p&gt;“To ensure that both types of site collections are accessible to users, do not put host header bindings on the IIS Web site assigned to the Default zone of your Web application, if you have host-named site collections in that Web application.”&lt;/p&gt;    &lt;p&gt;“You can manually modify host header bindings on the IIS Web site from the IIS Manager, but this is not recommended. Any changes you make using the IIS Manager will not be recorded in SharePoint Server 2010. If SharePoint Server 2010 tries to provision an IIS Web site on another computer in the farm for the same Web application and zone, the original host header binding is used instead of the modified binding.”&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;However, these can be overcome by following a process to maintain host header bindings on the IIS web site. A proposal to use this approach has been approved by Microsoft Premier as supportable; reference Microsoft Premier case “&lt;b&gt;[REG:111022261144490] prem/SharePoint Server 2010 AL/Requesting RCS for support ability scenario&lt;/b&gt;”&lt;/p&gt;  &lt;p&gt;The main implications of this option are the operational procedures for creating a new HNSC. Instead of using the SharePoint Central Administration console, or the feature for self-service site creation, PowerShell commands must be run, in the following specific order:&lt;/p&gt;  &lt;p&gt;1. On each WFE server in the farm, must add a host header binding to the IIS web site hosting the web application/zone. This could be done via IIS manager, but it’s recommended to use a PowerShell script for accuracy and repeatability. Example of adding the HNSC URL binding for “sitename.customer.com” to the web application whose host header name is “Standard”:&lt;/p&gt;  &lt;table&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td&gt;&amp;nbsp;&lt;/td&gt;        &lt;td bgcolor="#cccccc"&gt;&lt;font face="Courier New"&gt;           &lt;p&gt;New-WebBinding -Name &amp;quot;Standard&amp;quot; -HostHeader &amp;quot;sitename.customer.com&amp;quot;&lt;/p&gt;         &lt;/font&gt;&lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;p&gt;(This requires the IIS Administration Module to be imported for PowerShell)&lt;/p&gt;  &lt;p&gt;2. Once for the whole farm, must create the HNSC using a PowerShell command; it can’t be done via the SharePoint UI. Example of creating the HNSC “sitename.customer.com”&lt;/p&gt;  &lt;table&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td&gt;&amp;#160;&lt;/td&gt;        &lt;td bgcolor="#cccccc"&gt;&lt;font face="Courier New"&gt;           &lt;p&gt;New-SPSite http://sitename.customer.com -HostHeaderWebApplication http://Standard -Name &amp;quot;Our Work Site&amp;quot; -Template &amp;quot;STS#1&amp;quot; -OwnerAlias CUSTOMER\Administrator&lt;/p&gt;         &lt;/font&gt;&lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;p&gt;The steps must be performed in this order so that IIS is configured to respond correctly to the desired HNSC URL before SharePoint is asked to create it.&lt;/p&gt;  &lt;p&gt;&lt;em&gt;Note: if the -Template argument is omitted from the New-SPSite command, then the first access of the site collection will prompt for a choice of site template to be instantiated.&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;&lt;i&gt;Note: this additional operational procedure would be necessary for option 2 also, because that is the recommended technique for creating web applications on different IP addresses.&lt;/i&gt;&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Full example scenario for option 3&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;The PowerShell scripts below are an example showing how a set of web applications and site collections can be created using host headers to uniquely identify the web applications, thus avoiding the drawbacks of the “port” and “ip address” approaches.&lt;/p&gt;  &lt;p&gt;&lt;i&gt;Sample steps only&lt;/i&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Web app “Standard” will host &lt;b&gt;intranet.customer.com&lt;/b&gt; and &lt;b&gt;communities.customer.com&lt;/b&gt;&lt;/li&gt;    &lt;li&gt;Web app “Sensitive” will host &lt;b&gt;teams.customer.com&lt;/b&gt; and &lt;b&gt;projects.customer.com&lt;/b&gt;. In addition, managed paths are added so that teams will also contain &lt;b&gt;teams.customer.com/sec&lt;/b&gt; and &lt;b&gt;teams.customer.com/it&lt;/b&gt;.&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;1. Create web applications on the farm using host header names. Use the SharePoint UI to do this, or a PowerShell script such as the following.&amp;#160; Scripting is recommended for repeatability (dev, test and prod!)&lt;/p&gt;  &lt;table&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td&gt;&amp;#160;&lt;/td&gt;        &lt;td bgcolor="#cccccc"&gt;&lt;font face="Courier New"&gt;           &lt;p&gt;# Create web apps using Host Headers so multiple can be created on port 80.&lt;/p&gt;            &lt;p&gt;# Run this once per farm&lt;/p&gt;            &lt;p&gt;New-SPWebApplication -ApplicationPool &amp;quot;SharePoint Web Apps&amp;quot; -Name &amp;quot;Standard&amp;quot; –HostHeader Standard -DataBaseName &amp;quot;WSS_Content_Standard&amp;quot; -DatabaseServer &amp;quot;FARMSQL&amp;quot; -Path &amp;quot;C:\inetpub\wwwroot\wss\VirtualDirectories\Standard&amp;quot; -Port 80 -URL &amp;quot;http://Standard:80&amp;quot; &lt;/p&gt;            &lt;p&gt;New-SPWebApplication -ApplicationPool &amp;quot;SharePoint Web Apps&amp;quot; -Name &amp;quot;Sensitive&amp;quot; –HostHeader Sensitive -DataBaseName &amp;quot;WSS_Content_Sensitive&amp;quot; -DatabaseServer &amp;quot;FARMSQL&amp;quot; -Path &amp;quot;C:\inetpub\wwwroot\wss\VirtualDirectories\Sensitive&amp;quot; -Port 80 -URL &lt;font face="Courier New"&gt;&amp;quot;http://Sensitive:80&amp;quot;&lt;/font&gt; &lt;/p&gt;         &lt;/font&gt;&lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;p&gt;2. Add new bindings on web applications so IIS recognizes Host-Named Site Collection names&lt;/p&gt;  &lt;table&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td&gt;&amp;nbsp;&lt;/td&gt;        &lt;td bgcolor="#cccccc"&gt;&lt;font face="Courier New"&gt;           &lt;p&gt;# Add HNSC bindings on web applications&lt;/p&gt;            &lt;p&gt;# Run this once on each WFE server&lt;/p&gt;            &lt;p&gt;# Requires IIS Administration module&lt;/p&gt;            &lt;p&gt;Import-Module WebAdministration&lt;/p&gt;            &lt;p&gt;# Add new bindings for HNSC&lt;/p&gt;            &lt;p&gt;New-WebBinding -Name &amp;quot;Standard&amp;quot; -HostHeader &amp;quot;intranet.customer.com&amp;quot;&lt;/p&gt;            &lt;p&gt;New-WebBinding -Name &amp;quot;Standard&amp;quot; -HostHeader &amp;quot;communities.customer.com&amp;quot;&lt;/p&gt;            &lt;p&gt;New-WebBinding -Name &amp;quot;Sensitive&amp;quot; -HostHeader &amp;quot;teams.customer.com&amp;quot;&lt;/p&gt;            &lt;p&gt;New-WebBinding -Name &amp;quot;Sensitive&amp;quot; -HostHeader &amp;quot;projects.customer.com&amp;quot;&lt;/p&gt;         &lt;/font&gt;&lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;p&gt;3. Create Host-Named Site Collections on the web applications.&lt;/p&gt;  &lt;table&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td&gt;&amp;#160;&lt;/td&gt;        &lt;td bgcolor="#cccccc"&gt;&lt;font face="Courier New"&gt;           &lt;p&gt;# Create Host-Named Site Collections (HNSC)&lt;/p&gt;            &lt;p&gt;# Run this once per farm&lt;/p&gt;            &lt;p&gt;# Add managed paths (for all HNSC in farm)&lt;/p&gt;            &lt;p&gt;New-SPManagedPath &amp;quot;it&amp;quot; -Explicit -HostHeader -ErrorAction Continue&lt;/p&gt;            &lt;p&gt;New-SPManagedPath &amp;quot;sec&amp;quot; -Explicit -HostHeader -ErrorAction Continue&lt;/p&gt;            &lt;p&gt;# Create HNSC on Standard&lt;/p&gt;            &lt;p&gt;New-SPSite http://intranet.customer.com -HostHeaderWebApplication http://Standard -Name &amp;quot;The Intranet&amp;quot; -Template &amp;quot;BLANKINTERNETCONTAINER#0&amp;quot; -OwnerAlias CUSTOMER\Administrator &lt;/p&gt;            &lt;p&gt;New-SPSite http://communities.customer.com -HostHeaderWebApplication http://Standard -Name &amp;quot;Community Sites&amp;quot; -Template &amp;quot;STS#0&amp;quot; -OwnerAlias CUSTOMER\Administrator &lt;/p&gt;            &lt;p&gt;# Create HNSC on Sensitive, with sites on managed paths&lt;/p&gt;            &lt;p&gt;New-SPSite http://teams.customer.com -HostHeaderWebApplication http://Sensitive -Name &amp;quot;Team sites&amp;quot; -Template &amp;quot;STS#1&amp;quot; -OwnerAlias CUSTOMER\Administrator&lt;/p&gt;            &lt;p&gt;New-SPSite http://teams.customer.com/it -HostHeaderWebApplication http://Sensitive -Name &amp;quot;IT - Information Technology&amp;quot; -Template &amp;quot;BLOG#0&amp;quot; -OwnerAlias CUSTOMER\Administrator&lt;/p&gt;            &lt;p&gt;New-SPSite http://teams.customer.com/sec -HostHeaderWebApplication http://Sensitive -Name &amp;quot;HR – Human Resources&amp;quot; -Template &amp;quot;BLOG#0&amp;quot; -OwnerAlias CUSTOMER\Administrator&lt;/p&gt;            &lt;p&gt;New-SPSite http://projects.customer.com -HostHeaderWebApplication http://Sensitive -Name &amp;quot; Project sites&amp;quot; -Template &amp;quot;SGS#0&amp;quot; -OwnerAlias CUSTOMER\Administrator&lt;/p&gt;         &lt;/font&gt;&lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;p&gt;&lt;em&gt;Note: Wildcard managed paths for HNSC can also be added, by omitting the -Explicit parameter from New_SPManagedPath.&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;This type of configuration is supported, and illustrates a way to partially automate this configuration on each WFE in the farm.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10312073" width="1" height="1"&gt;&lt;img src="http://feeds.feedburner.com/~r/MarkArendSharePoint/~4/gpMPH8blSjk" height="1" width="1"/&gt;</description><category domain="http://blogs.msdn.com/b/markarend/archive/tags/SharePoint+2010/">SharePoint 2010</category><category domain="http://blogs.msdn.com/b/markarend/archive/tags/2010/">2010</category><category domain="http://blogs.msdn.com/b/markarend/archive/tags/Code+Samples/">Code Samples</category><category domain="http://blogs.msdn.com/b/markarend/archive/tags/Host+Named+Site+Collections/">Host Named Site Collections</category><category domain="http://blogs.msdn.com/b/markarend/archive/tags/Architecture/">Architecture</category></item><item><title>Measuring Concurrent Site Users – SharePoint 2010 and other</title><link>http://blogs.msdn.com/b/markarend/archive/2012/02/24/measuring-concurrent-site-users.aspx</link><pubDate>Sat, 25 Feb 2012 01:35:25 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10272756</guid><dc:creator>Mark Arend</dc:creator><slash:comments>2</slash:comments><wfw:commentRss>http://blogs.msdn.com/b/markarend/rsscomments.aspx?WeblogPostID=10272756</wfw:commentRss><comments>http://blogs.msdn.com/b/markarend/archive/2012/02/24/measuring-concurrent-site-users.aspx#comments</comments><description>&lt;p&gt;This post was written as I was working to analyze traffic on SharePoint 2010, but it could be used for any website log traffic analysis.&lt;/p&gt;  &lt;p&gt;Measuring concurrent users on your web site over time is important to understand characteristics of the site’s performance—its overall throughput—based on its load.&amp;#160; In fact, planning worksheets on TechNet tell us to find a number for concurrent users, but they don’t tell us how to get that number.&lt;/p&gt;  &lt;p&gt;However, the idea of &lt;em&gt;concurrent &lt;/em&gt;users is hard to pin down.&amp;#160; What exactly does that mean?&amp;#160; Conceptually, you might think of it as the number of users who are hitting the site &lt;em&gt;right now&lt;/em&gt;.&amp;#160; Ok, but what does &lt;em&gt;right now &lt;/em&gt;mean?&amp;#160; We really must define it as a specific duration of time, but how long?&amp;#160; I’ve seen many calculations count the number of unique users every hour.&amp;#160; Is that meaningful?&amp;#160; I think in many cases, it’s not.&lt;/p&gt;  &lt;p&gt;Let’s assume for the moment that your web site doesn’t use session state, it just gets requests and returns results.&amp;#160; For this, it’s got to do some work to assemble the result.&amp;#160; SharePoint especially has a lot of construction to do, gathering data from the database, the user profile, the file system, applying master pages, page layouts, maybe executing page controls and web parts, phew!&amp;#160; So this is going to take some time on the server, and if another user sends a request, then those tasks will add to the overall load.&amp;#160; But if that doesn’t happen until later in the same hour, then those tasks &lt;em&gt;don’t &lt;/em&gt;really add to the overall load.&amp;#160; So I think the duration should be less than an hour.&amp;#160; Note, if your site &lt;em&gt;does&lt;/em&gt; use session state, that changes things slightly… more later.&lt;/p&gt;  &lt;p&gt;How short should the duration be?&lt;/p&gt;  &lt;p&gt;Let’s look at the impact of measuring logs using different durations.&amp;#160; I used LogParser to query through some logs from a small SharePoint 2010 farm; 8 million requests over a 2 week period, collated and quantized into behavior per hour of day.&amp;#160; This graph counts the number of distinct (unique) IP addresses that were found in four different-sized “buckets of time” which I’m calling quanta.&amp;#160; It does not show the number of requests.&amp;#160; For 5 minute quanta, I count the total number of unique IP addresses in each 5 minute period throughout the day, then average those results over each hour.&amp;#160; For 60 minute quanta, I count the total number of unique IP addresses in that whole hour.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-68-30-metablogapi/8547.image_5F00_53FC6687.png"&gt;&lt;img style="display: inline; background-image: none;" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-68-30-metablogapi/6888.image_5F00_thumb_5F00_478E435E.png" width="644" height="331" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Wow, that’s quite a difference.&amp;#160; If we quantize users into 5 minute buckets versus 60-minute buckets, we find a wide range of results.&amp;#160; Designing a production infrastructure for SharePoint, I’m certainly going to want to know if it has to support 20 or 120 concurrent users during those busy parts of the day.&lt;/p&gt;  &lt;p&gt;Abstractly, I think the size of the quanta into which we count distinct users hitting the farm should be somewhat longer than it would take the server to “come to rest” after a heavy stream of incoming requests suddenly stopped, allowing all requests to be finished and results returned.&amp;#160; It seems to me that after this time, since the server is done processing those requests, it can take more without additional load.&amp;#160; Am I going to try and compute this time? Erm, no. I’m going to WAG it at about 5 minutes in general, based on some undocumented experiences over many years. But maybe the server could only finish all of its work in that time because nothing else was coming in. Ok, so let’s double it: 10 minutes.&lt;/p&gt;  &lt;p&gt;Of course there’s a body of knowledge around load testing that might help us here.&amp;#160; One site that has a lot of great detailed technical information about load testing is the &lt;a href="http://www.webperformance.com/load-testing/blog/"&gt;blog at webperformance.com&lt;/a&gt;.&amp;#160; For load testing, ramp-up is more important than the ramp-down abstraction above.&amp;#160; They like to ramp-up over a long period—many minutes to several hours—in order to understand the behavior of the system under different loads.&amp;#160; But ramp-down is more about leaving the system in a stable state, allowing all user requests to complete normally, instead of just killing all virtual user threads in-request.&amp;#160; In this case, the ramp-down is dependent mostly on maximum request processing time, which is pretty much page latency.&amp;#160; Now, we may want our page latency to be just a few seconds in most cases, allowing more on pages that do “complex” things like generate reports.&amp;#160; But even with relatively fast pages, ramp-down takes a while longer.&amp;#160; Following this line of thinking, the 5 minute and 10 minute durations for concurrency continue to seem more reasonable than larger buckets.&lt;/p&gt;  &lt;p&gt;For another sanity check.&amp;#160; How do people typically use SharePoint and other publishing/collaboration intranet sites?&amp;#160; Again from personal experience, I tend to use individual sites in relatively short bursts.&amp;#160; If I’m searching for information, I’ll want some results in just a few minutes, or I’m going to give up and try something different.&amp;#160; Or if I’m collaborating, I’ll be uploading and downloading documents one at a time or a few at a time, then going off to work with those documents.&amp;#160; So, I might have multiple SharePoint sites open all day long, but my direct interactions with them are bunched together, separated by other work.&amp;#160; For me, the idea of 10 minutes well encompasses each of my individual direct interactions with collaborative sites such as SharePoint.&lt;/p&gt;  &lt;p&gt;I’m really talking myself into this figure of &lt;strong&gt;10 minutes&lt;/strong&gt; as a guideline for measuring concurrency.&amp;#160; And I welcome any debate on the topic… please post comments!&lt;/p&gt;  &lt;p&gt;So, what if you &lt;em&gt;do &lt;/em&gt;use session state on your site?&amp;#160; For SharePoint, the typical session state available for developers is disabled by default (see my &lt;a href="http://blogs.msdn.com/b/markarend/archive/2010/05/27/using-session-state-in-sharepoint-2010.aspx"&gt;Session State&lt;/a&gt; blog posting for more information).&amp;#160; But if you enable it, or are using another web site host with session state, then whenever a user sends an authenticated request to the server, it will set aside some resources to maintain that session, for some period of time.&amp;#160; Way back in my ASP days, I recall 20 minutes being a common default, and it’s always configurable.&amp;#160; If session state is maintained in the database, that’s fewer resources that the WFE servers must maintain, but it’s still something.&amp;#160; In any event, if you’re using session state, you might want to use the session duration as your guideline for quantizing users to measure concurrency.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;The script&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Here’s the batch file with &lt;strong&gt;&lt;font color="#000000"&gt;LogParser&lt;/font&gt;&lt;/strong&gt; commands that I used to compute concurrent users by hour throughout the day.&amp;#160; I know, I should have used PowerShell, but I only started with a couple lines and it just grew from there.&amp;#160; Typical.&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;font size="1" face="Courier New"&gt;SET inputCSV=%1        &lt;br /&gt;if '%inputCSV%'=='' GOTO USAGE&lt;/font&gt;&lt;/p&gt;   &lt;font size="1" face="Courier New"&gt;&lt;/font&gt;    &lt;p&gt;&lt;font size="1" face="Courier New"&gt;REM outputCSV has no extension, it's added later        &lt;br /&gt;SET outputCSV=UserConcurrency&lt;/font&gt;&lt;/p&gt;   &lt;font size="1" face="Courier New"&gt;&lt;/font&gt;    &lt;p&gt;&lt;font size="1" face="Courier New"&gt;SET concurrencyPeriod=%2        &lt;br /&gt;if '%concurrencyPeriod%'=='' GOTO USAGE&lt;/font&gt;&lt;/p&gt;   &lt;font size="1" face="Courier New"&gt;&lt;/font&gt;    &lt;p&gt;&lt;font size="1" face="Courier New"&gt;SET concurrencyField=%3        &lt;br /&gt;if '%concurrencyField%'=='' SET concurrencyField=c-ip&lt;/font&gt;&lt;/p&gt;   &lt;font size="1" face="Courier New"&gt;&lt;/font&gt;    &lt;p&gt;&lt;font size="1" face="Courier New"&gt;REM Set a filter to match requests that should be excluded        &lt;br /&gt;REM %%Service%% matches &lt;/font&gt;&lt;font size="1" face="Courier New"&gt;our service accounts (like search), exclude them        &lt;br /&gt;REM ...if you don't want a filter, use SET filter=0 IS NULL         &lt;br /&gt;SET filter=(cs-username LIKE '%%Service%%')&lt;/font&gt;&lt;/p&gt;   &lt;font size="1" face="Courier New"&gt;&lt;/font&gt;    &lt;p&gt;&lt;font size="1" face="Courier New"&gt;echo.        &lt;br /&gt;echo Counting Concurrent Users         &lt;br /&gt;echo inputCSV&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; : %inputCSV%         &lt;br /&gt;echo outputCSV&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; : %outputCSV%.csv        &lt;br /&gt;echo concurrencyField : %concurrencyField%         &lt;br /&gt;echo concurrencyPeriod: %concurrencyPeriod% seconds&lt;/font&gt;&lt;/p&gt;   &lt;font size="1" face="Courier New"&gt;&lt;/font&gt;    &lt;p&gt;&lt;font size="1" face="Courier New"&gt;echo.        &lt;br /&gt;echo First stage, quantizing to %concurrencyPeriod% seconds...         &lt;br /&gt;        &lt;br /&gt;&lt;font color="#000000"&gt;&lt;strong&gt;logparser&lt;/strong&gt;&lt;/font&gt; -i:CSV -o:CSV &amp;quot;SELECT DISTINCT %concurrencyField%, date, QUANTIZE(TO_TIMESTAMP(time,'hx:mx:sx'), %concurrencyPeriod%) AS Period, COUNT(*) as Requests INTO temp1-%outputCSV%.csv FROM %inputCSV% WHERE %concurrencyField% IS NOT NULL AND NOT %filter% Group By&amp;#160; Date, Period, %concurrencyField%&amp;quot;&lt;/font&gt;&lt;/p&gt;   &lt;font size="1" face="Courier New"&gt;&lt;/font&gt;    &lt;p&gt;&lt;font size="1" face="Courier New"&gt;echo.        &lt;br /&gt;echo Second stage, grouping...         &lt;br /&gt;        &lt;br /&gt;&lt;font color="#000000"&gt;&lt;strong&gt;logparser&lt;/strong&gt;&lt;/font&gt; -i:CSV -o:CSV &amp;quot;SELECT date, to_string(to_timestamp(Period,'hx:mx:sx'),'hh') as Hour, Period, count(%concurrencyField%) as UserCount, sum(Requests) as RequestCount INTO temp2-%outputCSV%.csv From temp1-%outputCSV%.csv Group by date, Period&amp;quot;         &lt;br /&gt;        &lt;br /&gt;&lt;font color="#000000"&gt;&lt;strong&gt;logparser&lt;/strong&gt;&lt;/font&gt; -i:CSV -o:CSV &amp;quot;SELECT Hour, avg(UserCount) as Concurrent-Users(q%concurrencyPeriod%), sum(RequestCount) as Total-Requests(q%concurrencyPeriod%) INTO %outputCSV%-%concurrencyPeriod%.csv From temp2-%outputCSV%.csv GROUP BY Hour ORDER BY Hour&amp;quot;&lt;/font&gt;&lt;/p&gt;   &lt;font size="1" face="Courier New"&gt;&lt;/font&gt;    &lt;p&gt;&lt;font size="1" face="Courier New"&gt;GOTO DONE&lt;/font&gt;&lt;/p&gt;   &lt;font size="1" face="Courier New"&gt;&lt;/font&gt;    &lt;p&gt;&lt;font size="1" face="Courier New"&gt;       &lt;br /&gt;:USAGE&lt;/font&gt;&lt;/p&gt;   &lt;font size="1" face="Courier New"&gt;&lt;/font&gt;    &lt;p&gt;&lt;font size="1" face="Courier New"&gt;echo.        &lt;br /&gt;echo # Usage:         &lt;br /&gt;echo #         &lt;br /&gt;echo # ConcurrentUsers inputCSV seconds [fieldname]         &lt;br /&gt;echo #         &lt;br /&gt;echo # inputCSV : csv file (or *.csv) of log entries with fields: date, time, c-ip or [fieldname], other         &lt;br /&gt;echo # seconds&amp;#160; : concurrency quantization level.&amp;#160; Typical values 300 and 600 seconds         &lt;br /&gt;echo # fieldname: field to evaluate for concurrency.&amp;#160; Typical values c-ip (default) and cs-username         &lt;br /&gt;echo #         &lt;br /&gt;echo # Example&amp;#160; : ConcurrentUsers BigO.csv 300         &lt;br /&gt;echo.&lt;/font&gt;&lt;/p&gt;   &lt;font size="1" face="Courier New"&gt;&lt;/font&gt;    &lt;p&gt;&lt;font size="1" face="Courier New"&gt;:DONE&lt;/font&gt;&lt;/p&gt;  &lt;/blockquote&gt;  &lt;p&gt;Several things about this script.&amp;#160; &lt;/p&gt;  &lt;p&gt;The input is a CSV file, it &lt;em&gt;must&lt;/em&gt; have fields named “date” and “time” at the very least, then another field named “c-ip”&amp;#160; This field could have a different name, which you pass in as a parameter.&amp;#160; This allows you to specify a different way to count users, such as cs-username, or maybe you want to count some other information quantized by time, maybe cs(User-Agent).&amp;#160; I just default this to c-ip because I was working with a site that had anonymous access, and most of the cs-username values were null.&lt;/p&gt;  &lt;p&gt;The file may have many other fields that come from the IIS logs.&amp;#160; &lt;/p&gt;  &lt;p&gt;The way I got my BigO.csv file was by following Mike Wise’s excellent whitepaper &lt;strong&gt;&lt;em&gt;Analyzing SharePoint Usage:&lt;/em&gt;&amp;#160;&lt;/strong&gt;&lt;a title="http://www.microsoft.com/download/en/details.aspx?id=4616" href="http://www.microsoft.com/download/en/details.aspx?id=4616"&gt;http://www.microsoft.com/download/en/details.aspx?id=4616&lt;/a&gt;.&amp;#160; This will help you get started with LogParser in about 10 minutes (there’s that number again… an omen!).&amp;#160; Some of his first steps show how to run LogParser on a whole set of raw IIS logs and collate them into a CSV file that has some extra info added, in order to do more analyses on that.&amp;#160; &lt;/p&gt;  &lt;p&gt;My script doesn’t &lt;em&gt;require &lt;/em&gt;a CSV made in this way, this is just a good example of how to get one pretty easily from your logs.&amp;#160; And of course, LogParser could just as easily be run directly against the logs, by using the option –i:IISW3C instead of –i:CSV.&amp;#160; Mike’s paper talks about this too.&lt;/p&gt;  &lt;p&gt;So, you can run this a few times and get results for different intervals that define your idea of concurrent use.&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;font size="1" face="Courier New"&gt;ConcurrentUsers BigO.csv 300&lt;/font&gt;&lt;/p&gt;   &lt;font size="1" face="Courier New"&gt; &lt;/font&gt;&lt;/blockquote&gt; &lt;font size="1" face="Courier New"&gt;&lt;/font&gt;  &lt;blockquote&gt;&lt;font size="1" face="Courier New"&gt;&lt;/font&gt;    &lt;p&gt;&lt;font size="1" face="Courier New"&gt;ConcurrentUsers BigO.csv 1200&lt;/font&gt;&lt;/p&gt;   &lt;font size="1" face="Courier New"&gt;&lt;/font&gt;    &lt;p&gt;&lt;font size="1" face="Courier New"&gt;ConcurrentUsers BigO.csv 3600&lt;/font&gt;&lt;/p&gt;  &lt;/blockquote&gt;  &lt;p&gt;Running these in succession will output 3 files, &lt;font face="Courier New"&gt;UserConcurrency-300.csv&lt;/font&gt;, &lt;font face="Courier New"&gt;UserConcurrency-1200.csv&lt;/font&gt; and &lt;font face="Courier New"&gt;UserConcurrency-3600.csv&lt;/font&gt;, so you can easily compare for your analysis.&amp;#160; It also creates some intermediate temp csv files that are useful to look into for sanity checking and understanding what the final output is telling you.&lt;/p&gt;  &lt;p&gt;Oh, what’s that “SET filter=0 IS NULL” for?&amp;#160; I just wanted an easy way to shut off the filter.&amp;#160; Since the filter&amp;#160; appears in the WHERE clause as &lt;strong&gt;AND NOT %filter%&lt;/strong&gt;, I need something that evaluates to FALSE, meaning “don’t filter,” and as everyone knows, 0 is &lt;em&gt;not &lt;/em&gt;null.&amp;#160; Stupid geeks and their jokes.&lt;/p&gt;  &lt;p&gt;Well, best of luck in this grey area.&amp;#160; Let me know if any of this looks wrong please!!!&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10272756" width="1" height="1"&gt;&lt;img src="http://feeds.feedburner.com/~r/MarkArendSharePoint/~4/OAbSPdM-e3Y" height="1" width="1"/&gt;</description><category domain="http://blogs.msdn.com/b/markarend/archive/tags/Capacity+Planning/">Capacity Planning</category><category domain="http://blogs.msdn.com/b/markarend/archive/tags/SharePoint+2010/">SharePoint 2010</category><category domain="http://blogs.msdn.com/b/markarend/archive/tags/LogParser/">LogParser</category><category domain="http://blogs.msdn.com/b/markarend/archive/tags/Concurrent+Users/">Concurrent Users</category></item><item><title>Control Search Indexing (Crawling) Within a Page with Noindex</title><link>http://blogs.msdn.com/b/markarend/archive/2010/06/07/control-search-indexing-crawling-within-a-page-with-noindex.aspx</link><pubDate>Mon, 07 Jun 2010 16:25:49 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10021034</guid><dc:creator>Mark Arend</dc:creator><slash:comments>3</slash:comments><wfw:commentRss>http://blogs.msdn.com/b/markarend/rsscomments.aspx?WeblogPostID=10021034</wfw:commentRss><comments>http://blogs.msdn.com/b/markarend/archive/2010/06/07/control-search-indexing-crawling-within-a-page-with-noindex.aspx#comments</comments><description>&lt;p&gt;SharePoint provides the ability to control search indexing (a.k.a. “crawling”) within a page by using a div class named “noindex”.&amp;#160; This means you can flag some content on a page that should not be indexed for search results, while other content on the page is still indexed.&amp;#160; The typical scenario that requires this is common footer text.&amp;#160; Suppose you edit your master page to contain some standard text, including your company name and a link to your privacy policy.&amp;#160; Now, search results for your company or privacy policy will include every page in the site because this text is there.&amp;#160; What you really want is just pages that contain unique content about those keywords.&lt;/p&gt;  &lt;p&gt;SharePoint 2010’s iFilter excludes content inside of a &amp;lt;div class=&amp;quot;noindex&amp;quot;&amp;gt; tag.&amp;#160; Note that each div nested in that one is re-evaluated for the noindex class, so nested divs may not work as you expect.&amp;#160; The product team is considering changing this so that all nested divs are excluded.&lt;/p&gt;  &lt;p&gt;&lt;font color="#0000ff" size="2" face="Courier New"&gt;&amp;lt;&lt;font color="#800000"&gt;div&lt;/font&gt; &lt;font color="#ff0000"&gt;class&lt;/font&gt;=&amp;quot;companyFooterStyle noindex&amp;quot;&amp;gt;      &lt;br /&gt;&lt;/font&gt;&lt;font color="#0000ff"&gt;&lt;font size="2"&gt;&lt;font face="Courier New"&gt;&lt;font color="#000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Copyright 2010 © Company Name | &lt;/font&gt;&amp;lt;&lt;font color="#800000"&gt;a&lt;/font&gt; &lt;font color="#ff0000"&gt;href&lt;/font&gt;=&amp;quot;/sitepages/PrivacyPolicy.aspx&amp;quot;&amp;gt;&lt;font color="#000000"&gt;Privacy Policy&lt;/font&gt;&amp;lt;/&lt;font color="#800000"&gt;a&lt;/font&gt;&amp;gt;          &lt;br /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font color="#0000ff" size="2" face="Courier New"&gt;&amp;lt;/&lt;font color="#800000"&gt;div&lt;/font&gt;&amp;gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;Now, when you search the portal for “Company Name” or “Privacy” you won’t get every page in the portal showing up in your results.&lt;/p&gt;  &lt;p&gt;Note the ability to use other css classes along with noindex, to get visual styles as well.&amp;#160; I haven’t tested the noindex class on tags other than div.&lt;/p&gt;  &lt;p&gt;&amp;#160; &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:49066379-5c19-45a1-aad2-f77980a25b0c" class="wlWriterEditableSmartContent"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/Sharepoint+2010" rel="tag"&gt;Sharepoint 2010&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Noindex" rel="tag"&gt;Noindex&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Search" rel="tag"&gt;Search&lt;/a&gt;&lt;/div&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10021034" width="1" height="1"&gt;&lt;img src="http://feeds.feedburner.com/~r/MarkArendSharePoint/~4/YAhTPK0Ev84" height="1" width="1"/&gt;</description><category domain="http://blogs.msdn.com/b/markarend/archive/tags/SharePoint/">SharePoint</category><category domain="http://blogs.msdn.com/b/markarend/archive/tags/Search/">Search</category><category domain="http://blogs.msdn.com/b/markarend/archive/tags/2010/">2010</category><category domain="http://blogs.msdn.com/b/markarend/archive/tags/noindex/">noindex</category></item><item><title>Using Session State in SharePoint 2010</title><link>http://blogs.msdn.com/b/markarend/archive/2010/05/27/using-session-state-in-sharepoint-2010.aspx</link><pubDate>Thu, 27 May 2010 21:56:59 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10016594</guid><dc:creator>Mark Arend</dc:creator><slash:comments>10</slash:comments><wfw:commentRss>http://blogs.msdn.com/b/markarend/rsscomments.aspx?WeblogPostID=10016594</wfw:commentRss><comments>http://blogs.msdn.com/b/markarend/archive/2010/05/27/using-session-state-in-sharepoint-2010.aspx#comments</comments><description>&lt;p&gt;SharePoint 2010 uses two services related to session state that have similar names but are separate and have different purposes.&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;&lt;em&gt;ASP.NET session state&lt;/em&gt; may be used on SharePoint 2010 pages. This service is automatically disabled in normal installations of SharePoint 2010; it may be enabled using the instructions below. Once enabled, it appears on the Service Applications page as “&lt;b&gt;SharePoint Server ASP.NET Session State Service&lt;/b&gt;.” &lt;/li&gt;    &lt;li&gt;The &lt;i&gt;State Service&lt;/i&gt; service application is designed for and only available to Office internal components such as InfoPath Forms Services and Visio Services. This service is automatically enabled in typical installations of SharePoint 2010 and is not related to ASP.NET session state. It appears on the Service Applications page as “&lt;b&gt;State Service&lt;/b&gt;.” &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;To enable ASP.NET session state:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Enter the following PowerShell command in the SharePoint 2010 Management Shell window:      &lt;pre&gt;Enable-SPSessionStateService –DefaultProvision&lt;/pre&gt;
  &lt;/li&gt;

  &lt;li&gt;On each web application for which you want to use session state, edit the web.config file and set the enableSessionState property of the pages element as follows: 
    &lt;pre&gt;&amp;lt;pages enableSessionState=&amp;quot;true&amp;quot;&lt;/pre&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Guidelines for using SharePoint Server ASP.NET Session State:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;This session state may be used by custom code in web parts and other page-hosted controls. &lt;/li&gt;

  &lt;li&gt;Session state information is stored in a configurable SQL database; this implies the following: 
    &lt;ol&gt;
      &lt;li type="a"&gt;Load-balancer affinity is not required. &lt;/li&gt;

      &lt;li type="a"&gt;Heavy use of session state must be included in database/capacity planning. By default, the session state database is created on the same database server hosting the SharePoint 2010 farm configuration database. This can be changed to place it on another server; this can be done at a later date if necessary. To move it to another SQL server, it should first be disabled, then enabled again with different configuration that points to the other server. &lt;/li&gt;
    &lt;/ol&gt;
  &lt;/li&gt;

  &lt;li&gt;When enabled, Session state is available to the whole 2010 farm. Each web application can choose to enable it for use on ASP.NET pages (enableSessionState=&amp;quot;true&amp;quot;). &lt;/li&gt;

  &lt;li&gt;Session state is partitioned using the root URL. This means that different web applications will have different session state objects; a web part can only access the session state object available to it. If host header site collections are used, then different session objects will be used for each site collection (the browser will have multiple session ids in different cookies). &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Additional information about enabling session state: &lt;/p&gt;

&lt;p&gt;
  &lt;table border="1" cellspacing="0" cellpadding="0"&gt;&lt;tbody&gt;
      &lt;tr&gt;
        &lt;td valign="top" width="308"&gt;
          &lt;p&gt;&lt;b&gt;Syntax 1&lt;/b&gt;&lt;/p&gt;
        &lt;/td&gt;

        &lt;td valign="top" width="308"&gt;
          &lt;p&gt;&lt;b&gt;Syntax 2&lt;/b&gt;&lt;/p&gt;
        &lt;/td&gt;
      &lt;/tr&gt;

      &lt;tr&gt;
        &lt;td valign="top" width="308"&gt;
          &lt;p&gt;Enable-SPSessionStateService 
            &lt;br /&gt;-DefaultProvision&lt;/p&gt;
        &lt;/td&gt;

        &lt;td valign="top" width="308"&gt;
          &lt;p&gt;Enable-SPSessionStateService 
            &lt;br /&gt;-DatabaseName &amp;lt;String&amp;gt; 

            &lt;br /&gt;[-DatabaseServer &amp;lt;String&amp;gt;] 

            &lt;br /&gt;[-DatabaseCredentials &amp;lt;PSCredential&amp;gt;]&lt;/p&gt;
        &lt;/td&gt;
      &lt;/tr&gt;
    &lt;/tbody&gt;&lt;/table&gt;
&lt;/p&gt;

&lt;p&gt;&lt;i&gt;Additional parameters are not discussed here; use Get-Help Enable-SPSessionStateService –full for more information.&lt;/i&gt;&lt;/p&gt;

&lt;p&gt;The Enable-SPSessionStateService cmdlet creates a session state database, installs the ASP.NET session state schema, and updates the Web.config files on the farm to turn on the session state service.&lt;/p&gt;

&lt;p&gt;If the DefaultProvision form of the command is used, all default settings are used. These are:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;DatabaseName = “SessionStateService_&amp;lt;GUID&amp;gt;” &lt;/li&gt;

  &lt;li&gt;DatabaseServer = the same database server as the SharePoint 2010 configuration database &lt;/li&gt;

  &lt;li&gt;DatabaseCredentials = Integrated Windows Authentication &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If the DatabaseName form of the command is used, then these parameters may be set explicitly. If some of the parameters are not included, they default as above. To set specific credentials for accessing the session state database, note that this allows you to specify a SQL Authentication credential only, not a Windows credential. Then, use the Get-Credential command to create a PSCredential object from a username and password, then use that object as the argument of the DatabaseCredentials parameter.&lt;/p&gt;

&lt;p&gt;After this service is enabled, “SharePoint Server ASP.NET Session State Service” will appear on the Service Applications management page.&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:c7317fa4-e62c-472e-9187-42ae0d50f450" class="wlWriterEditableSmartContent"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/SharePoint+2010" rel="tag"&gt;SharePoint 2010&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Session+State" rel="tag"&gt;Session State&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Development" rel="tag"&gt;Development&lt;/a&gt;&lt;/div&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10016594" width="1" height="1"&gt;&lt;img src="http://feeds.feedburner.com/~r/MarkArendSharePoint/~4/spjApsMwxdM" height="1" width="1"/&gt;</description><category domain="http://blogs.msdn.com/b/markarend/archive/tags/SharePoint/">SharePoint</category><category domain="http://blogs.msdn.com/b/markarend/archive/tags/Development/">Development</category><category domain="http://blogs.msdn.com/b/markarend/archive/tags/2010/">2010</category><category domain="http://blogs.msdn.com/b/markarend/archive/tags/Session+State/">Session State</category></item><item><title>Backup/Restore for SharePoint 2010</title><link>http://blogs.msdn.com/b/markarend/archive/2010/05/27/backup-restore-for-sharepoint-2010.aspx</link><pubDate>Thu, 27 May 2010 21:46:39 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10016588</guid><dc:creator>Mark Arend</dc:creator><slash:comments>0</slash:comments><wfw:commentRss>http://blogs.msdn.com/b/markarend/rsscomments.aspx?WeblogPostID=10016588</wfw:commentRss><comments>http://blogs.msdn.com/b/markarend/archive/2010/05/27/backup-restore-for-sharepoint-2010.aspx#comments</comments><description>&lt;p&gt;This is an overview of major tools and techniques available to backup/restore your SharePoint 2010 farm&lt;/p&gt;  &lt;h1&gt;Using DPM to Backup/Restore SharePoint 2010&lt;/h1&gt;  &lt;p&gt;Microsoft System Center Data Protection Manager 2010 (DPM) is a product designed to manage ongoing, comprehensive backups of Microsoft enterprise products, including SharePoint 2010.&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Protect at farm level – recover and track at granular level. &lt;/li&gt;    &lt;li&gt;Automatic discovery &amp;amp; protection of new databases. &lt;/li&gt;    &lt;li&gt;Seamlessly supports all SQL high-availability solutions. &lt;/li&gt;    &lt;li&gt;Easy to configure and manage short-term and long-term backups &lt;/li&gt;    &lt;li&gt;Optimized for large farms.      &lt;ul&gt;       &lt;li&gt;Faster backups than SharePoint-only backup solutions. &lt;/li&gt;        &lt;li&gt;Requires significantly less storage than SQL-only backup solutions. &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;Search for SharePoint item through all recovery points of the farm. &lt;/li&gt;    &lt;li&gt;Retains metadata/security settings for the recovered item. &lt;/li&gt;    &lt;li&gt;Granular recovery without a recovery farm for SharePoint 2010. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;More information on DPM: &lt;a href="http://technet.microsoft.com/en-us/systemcenter/dm"&gt;http://technet.microsoft.com/en-us/systemcenter/dm&lt;/a&gt;. &lt;/p&gt;  &lt;h1&gt;Backup/Restore for SharePoint using its own tools&lt;/h1&gt;  &lt;p&gt;SharePoint provides many of its own tools for backup and restore. This section discusses these options.&lt;/p&gt;  &lt;p&gt;The Central Administration Backup and Restore page organizes SharePoint’s monitoring tools:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-68-30-metablogapi/3252.image_5F00_07E05711.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://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-68-30-metablogapi/5850.image_5F00_thumb_5F00_23BD523D.png" width="504" height="269" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Central Administration provides tools for performing individual backups of the entire farm, individual site collections, sites, libraries or lists. A full farm backup can be restored from Central Administration, but tools are not provided here for scheduling recurring backups, or for restoring individual site collections, site, libraries or lists. These operations can be managed using PowerShell scripts:&lt;/p&gt;  &lt;p&gt;   &lt;table border="1" cellspacing="0" cellpadding="0"&gt;&lt;tbody&gt;       &lt;tr&gt;         &lt;td valign="top" width="229"&gt;           &lt;p&gt;&lt;b&gt;Cmdlet&lt;/b&gt;&lt;/p&gt;         &lt;/td&gt;          &lt;td valign="top" width="384"&gt;           &lt;p&gt;&lt;b&gt;Synopsis&lt;/b&gt;&lt;/p&gt;         &lt;/td&gt;       &lt;/tr&gt;        &lt;tr&gt;         &lt;td valign="top" width="229"&gt;           &lt;p&gt;Backup-SPFarm&lt;/p&gt;            &lt;p&gt;(Restore-SPFarm)&lt;/p&gt;         &lt;/td&gt;          &lt;td valign="top" width="384"&gt;           &lt;p&gt;Creates a backup of an individual database, Web application, or the entire farm. Can be full or differential. Use Backup-SPFarm -ShowTree to display a list of what would be backed up; this does not perform the backup.&lt;/p&gt;         &lt;/td&gt;       &lt;/tr&gt;        &lt;tr&gt;         &lt;td valign="top" width="229"&gt;           &lt;p&gt;Backup-SPSite&lt;/p&gt;            &lt;p&gt;(Restore-SPSite)&lt;/p&gt;         &lt;/td&gt;          &lt;td valign="top" width="384"&gt;           &lt;p&gt;Performs a backup of a site collection.&lt;/p&gt;         &lt;/td&gt;       &lt;/tr&gt;        &lt;tr&gt;         &lt;td valign="top" width="229"&gt;           &lt;p&gt;Backup-SPConfigurationDatabase&lt;/p&gt;            &lt;p&gt;(Restore-SPFarm)&lt;/p&gt;         &lt;/td&gt;          &lt;td valign="top" width="384"&gt;           &lt;p&gt;Performs a farm-level configuration-only backup. This is not a typical backup operation, see Note* below.&lt;/p&gt;         &lt;/td&gt;       &lt;/tr&gt;     &lt;/tbody&gt;&lt;/table&gt; &lt;/p&gt;  &lt;p&gt;To schedule automated recurring backups, use these PowerShell cmdlets in scripts that are scheduled with the &lt;a href="http://msdn.microsoft.com/en-us/library/aa383614(VS.85).aspx"&gt;Windows Task Scheduler&lt;/a&gt;.&amp;#160; This recommendation is from the TechNet article &lt;a href="http://technet.microsoft.com/en-us/library/ee663490(office.14).aspx"&gt;Backup and recovery overview (SharePoint Server 2010)&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;*Note that Central admin gives an option for backing up the config database, but &lt;em&gt;you normally never restore the config database&lt;/em&gt;, even when restoring the farm. In DR scenarios, you create a new farm and restore the site collection DBs. An example use for a configuration database backup is to create a farm configuration template that can then be applied to create other new SharePoint farms that have identical physical topologies, by using Restore-SPFarm.&amp;#160; This could be very useful in hosting scenarios with baseline virtual images.&lt;/p&gt;  &lt;p&gt;SQL backup tools will process the data faster. DPM will process even faster and repeated backups require much less space.&lt;/p&gt;  &lt;p&gt;So if you're planning daily backups of 500 GB, CA farm backup may be too slow. SQL backup will get it faster but require 2.5 TB to store 5 backups. DPM will be fastest and probably require less than 1 TB for 5 backups of 500 GB (depending on content churn).&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10016588" width="1" height="1"&gt;&lt;img src="http://feeds.feedburner.com/~r/MarkArendSharePoint/~4/Z66cSEThbn4" height="1" width="1"/&gt;</description><category domain="http://blogs.msdn.com/b/markarend/archive/tags/SharePoint/">SharePoint</category><category domain="http://blogs.msdn.com/b/markarend/archive/tags/2010/">2010</category><category domain="http://blogs.msdn.com/b/markarend/archive/tags/Restore/">Restore</category><category domain="http://blogs.msdn.com/b/markarend/archive/tags/Backup/">Backup</category><category domain="http://blogs.msdn.com/b/markarend/archive/tags/DPM/">DPM</category></item><item><title>Health Monitoring for SharePoint 2010</title><link>http://blogs.msdn.com/b/markarend/archive/2010/05/27/health-monitoring-for-sharepoint-2010.aspx</link><pubDate>Thu, 27 May 2010 21:28:31 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10016579</guid><dc:creator>Mark Arend</dc:creator><slash:comments>0</slash:comments><wfw:commentRss>http://blogs.msdn.com/b/markarend/rsscomments.aspx?WeblogPostID=10016579</wfw:commentRss><comments>http://blogs.msdn.com/b/markarend/archive/2010/05/27/health-monitoring-for-sharepoint-2010.aspx#comments</comments><description>&lt;p&gt;&lt;/p&gt; &lt;p&gt;This is an overview of major tools and techniques available to monitor the health of your SharePoint 2010 farm.&lt;/p&gt; &lt;h1&gt;Using SCOM to monitor SharePoint 2010&lt;/h1&gt; &lt;p&gt;Microsoft System Center Operations Manager 2007 (SCOM) is a product designed for enterprise health monitoring. It integrates closely with SharePoint 2010 and provides the most comprehensive and flexible solution for monitoring the health of SharePoint farms. With SCOM, the level of reporting and alerting is more granular and easily managed than SharePoint’s standard health monitoring.&lt;/p&gt; &lt;ul&gt; &lt;li&gt;SharePoint 2010 ships a management pack for System Center Ops Manager  &lt;/li&gt;&lt;li&gt;Improved Knowledge Articles  &lt;/li&gt;&lt;li&gt;More relevant events and monitors  &lt;/li&gt;&lt;li&gt;Surfaces SharePoint Health Analyzer (SPHA) rules  &lt;/li&gt;&lt;li&gt;Integrated with Unified Logging System (ULS) &lt;/li&gt;&lt;/ul&gt; &lt;p&gt;The SCOM 2007 Management Pack for SharePoint 2010 contains more documentation for using these products together, in a Management Pack Guide for SharePoint Foundation 2010 and one for SharePoint Server 2010. Be sure to reference &lt;i&gt;both&lt;/i&gt; guides for managing the server product. Download from: &lt;a href="http://www.microsoft.com/downloads/details.aspx?displaylang=en&amp;amp;FamilyID=c8a9d749-b7a8-412a-b2db-f3e464ed3fcf"&gt;http://www.microsoft.com/downloads/details.aspx?displaylang=en&amp;amp;FamilyID=c8a9d749-b7a8-412a-b2db-f3e464ed3fcf&lt;/a&gt;. These management pack guides are also included as a deliverable of this engagement, for convenience.&lt;/p&gt; &lt;p&gt;More information on SCOM: &lt;a href="http://technet.microsoft.com/en-us/systemcenter/om"&gt;http://technet.microsoft.com/en-us/systemcenter/om&lt;/a&gt;. &lt;/p&gt; &lt;h1&gt;Monitoring SharePoint with its own tools&lt;/h1&gt; &lt;p&gt;With or without SCOM, SharePoint 2010 provides many of its own tools for health monitoring. This section discusses all of these options.&lt;/p&gt; &lt;p&gt;The Central Administration &amp;gt; Monitoring page organizes SharePoint’s monitoring tools:&lt;/p&gt; &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-68-30-metablogapi/5810.image_5F00_5E03AC19.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://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-68-30-metablogapi/7888.image_5F00_thumb_5F00_5BE6AD50.png" width="504" height="321" /&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;Reports available from this page:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Health analysis problems and solutions  &lt;ul&gt; &lt;li&gt;Administrative configuration  &lt;/li&gt;&lt;li&gt;Performance issues  &lt;/li&gt;&lt;li&gt;Availability issues and  &lt;/li&gt;&lt;li&gt;Potential Security issues  &lt;/li&gt;&lt;li&gt;…results can be consumed by SCOM &lt;/li&gt;&lt;/ul&gt; &lt;/li&gt;&lt;li&gt;Administrative reports  &lt;ul&gt; &lt;li&gt;Search administration (crawl rates, query latency, etc) &lt;/li&gt;&lt;/ul&gt; &lt;/li&gt;&lt;li&gt;IRM Policy Usage reports  &lt;/li&gt;&lt;li&gt;Health reports  &lt;ul&gt; &lt;li&gt;Slowest Pages  &lt;/li&gt;&lt;li&gt;Top Active Users &lt;/li&gt;&lt;/ul&gt; &lt;/li&gt;&lt;li&gt;Web Analytics reports  &lt;ul&gt; &lt;li&gt;Traffic (Page Views, Visitors, Referrers)  &lt;/li&gt;&lt;li&gt;Search usage (query totals, trends)  &lt;/li&gt;&lt;li&gt;Inventory (Number of sites) &lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;h3&gt;Custom reporting&lt;/h3&gt; &lt;p&gt;Custom reports can be built and deployed to Central Admin Monitoring using Excel or SQL Reporting Services.&lt;/p&gt; &lt;p&gt;Custom health rules can also be created. Each custom health rule requires an assembly that will perform the desired health check. See &lt;a href="http://msdn.microsoft.com/en-us/library/ee539433(office.14).aspx"&gt;How to: Create a Health Rule&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;h3&gt;ULS logging service&lt;/h3&gt; &lt;p&gt;SharePoint’s logging service (which uses the Windows Unified Logging Service or ULS) has been improved in several ways.&lt;/p&gt; &lt;ol&gt; &lt;li&gt;ULS Log Viewer  &lt;ol&gt; &lt;li type="a"&gt;A SharePoint product team member discusses this tool on their &lt;a href="http://blogs.msdn.com/opal/archive/2009/12/22/uls-viewer-for-sharepoint-2010-troubleshooting.aspx"&gt;blog&lt;/a&gt;: “In SharePoint 2010 we can use correlation id to trace a series of event inside SharePoint. For example, in this screenshot, my machine is trying to flush usage log. The different entries may be buried in the big ULS log file, but with correlation id this viewer can easily filter and find them all.”&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-68-30-metablogapi/5722.image_5F00_3FF57858.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://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-68-30-metablogapi/3107.image_5F00_thumb_5F00_1D5139DD.png" width="454" height="182" /&gt;&lt;/a&gt;  &lt;/li&gt;&lt;li type="a"&gt;Download ULS Log Viewer from: &lt;a href="http://code.msdn.microsoft.com/ULSViewer"&gt;http://code.msdn.microsoft.com/ULSViewer&lt;/a&gt; &lt;/li&gt;&lt;/ol&gt; &lt;/li&gt;&lt;li&gt;PowerShell cmdlets for managing the logs  &lt;ol&gt; &lt;li type="a"&gt;Diagnostic Configuration  &lt;ol&gt; &lt;li type="i"&gt;&lt;b&gt;Get-SPDiagnosticConfig &lt;/b&gt;&lt;u&gt;r&lt;/u&gt;etrieves Diagnostic Configuration values  &lt;/li&gt;&lt;li type="i"&gt;&lt;b&gt;Set-SPDiagnosticConfig&lt;/b&gt;&lt;u&gt; a&lt;/u&gt;llows setting Diagnostic Configuration values &lt;/li&gt;&lt;/ol&gt; &lt;/li&gt;&lt;li type="a"&gt;Trace Log and Event Log Throttling  &lt;ol&gt; &lt;li type="i"&gt;&lt;b&gt;Get-SPLogLevel&lt;/b&gt;&lt;u&gt; d&lt;/u&gt;isplays a list of diagnostic levels  &lt;/li&gt;&lt;li type="i"&gt;&lt;b&gt;Set-SPLogLevel&lt;/b&gt;&lt;u&gt; a&lt;/u&gt;llows setting of trace/event level on categories  &lt;/li&gt;&lt;li type="i"&gt;&lt;b&gt;Clear-SPLogLevel&lt;/b&gt;&lt;u&gt; r&lt;/u&gt;esets the trace/event levels to default &lt;/li&gt;&lt;/ol&gt; &lt;/li&gt;&lt;li type="a"&gt;Log File control  &lt;ol&gt; &lt;li type="i"&gt;&lt;b&gt;New-SPLogFile&lt;/b&gt;&lt;u&gt; e&lt;/u&gt;nds the current log and starts a new one  &lt;/li&gt;&lt;li type="i"&gt;&lt;b&gt;Merge-SPLogFile&lt;/b&gt;&lt;u&gt; c&lt;/u&gt;ombines trace log files from all farm servers into a single file &lt;/li&gt;&lt;/ol&gt; &lt;/li&gt;&lt;li type="a"&gt;Trace Log Querying/Filtering  &lt;ol&gt; &lt;li type="i"&gt;&lt;b&gt;Get-SPLogEvent &lt;/b&gt;&lt;u&gt;r&lt;/u&gt;eads and queries ULS trace logs &lt;/li&gt;&lt;/ol&gt;&lt;/li&gt;&lt;/ol&gt; &lt;/li&gt;&lt;li&gt;Correlation ID tracing  &lt;ol&gt; &lt;li type="a"&gt;Every request has a unique correlation ID associated with all calls triggered by that request, even in SQL Profiler. Correlation ID appears in error message and can be used to find all associated actions immediately. &lt;/li&gt;&lt;/ol&gt; &lt;/li&gt;&lt;li&gt;Manageability improvements  &lt;ol&gt; &lt;li type="a"&gt;The ULS log file from each WFE server can now be directed to accumulate into a single SQL Server database. This makes it easier to find all relevant messages, and provides integration with SCOM monitoring. To enable this, click Configure usage and health data collection under Monitoring in Central Administration.  &lt;/li&gt;&lt;li type="a"&gt;All events that appear in the Windows Application log also appear in the ULS logs, so no longer necessary to correlate from these two different sources.  &lt;/li&gt;&lt;li type="a"&gt;Event flood protection. Heavily recurring events can be given a threshold so that they are only reported once every several minutes. &lt;/li&gt;&lt;/ol&gt;&lt;/li&gt;&lt;/ol&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;h3&gt;Developer Dashboard for Page Performance&lt;/h3&gt; &lt;p&gt;This tool is useful for measuring the behavior and performance of individual pages.&amp;nbsp; To analyze performance of a page, turn on SharePoint's "Developer Dashboard" that reports on details of page performance.&amp;nbsp; Using stsadm commands for this:&lt;/p&gt;&lt;pre&gt;stsadm –o setproperty –pn developer-dashboard –pv on&lt;/pre&gt;
&lt;p&gt;After this is executed, each page will show a report at the bottom that gives information about the performance of all the page calls and database queries.&lt;/p&gt;
&lt;p&gt;Article: &lt;a href="http://blogs.technet.com/speschka/archive/2009/10/28/using-the-developer-dashboard-in-sharepoint-2010.aspx"&gt;http://blogs.technet.com/speschka/archive/2009/10/28/using-the-developer-dashboard-in-sharepoint-2010.aspx&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;To cancel:&lt;/p&gt;&lt;pre&gt;stsadm –o setproperty –pn developer-dashboard –pv &lt;b&gt;off&lt;/b&gt;&lt;/pre&gt;
&lt;p&gt;To display an icon that allows you to toggle it on/off as you are working:&lt;/p&gt;&lt;pre&gt;stsadm –o setproperty –pn developer-dashboard –pv &lt;b&gt;ondemand&lt;/b&gt;&lt;/pre&gt;
&lt;p&gt;To set this parameter using PowerShell, use the following code snippet:&lt;/p&gt;&lt;pre&gt;$DevDashboardSettings = [Microsoft.SharePoint.Administration.SPWebService]::ContentService.DeveloperDashboardSettings;
$DevDashboardSettings.DisplayLevel = ‘OnDemand’;
$DevDashboardSettings.RequiredPermissions =’EmptyMask’;
$DevDashboardSettings.TraceEnabled = $true;
$DevDashboardSettings.Update()&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;
&lt;h3&gt;SPMonitoredScope&lt;/h3&gt;
&lt;p&gt;This class gives developers the ability to instrument their code so that it can be monitored using SharePoint tools, such as the Developer Dashboard. Example of use:&lt;/p&gt;&lt;font size="3" face="Courier New"&gt;&lt;pre&gt;using (new SPMonitoredScope(
	“Some Scope Name”,
	TraceSeverity.Verbose, 1000,
	new SPRequestUsageCounter(3),
	new SPSqlQueryCounter())
	)
	{
		callExternalCode();
	}&lt;/pre&gt;&lt;/font&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:92e6e504-7cd1-466a-99a7-42dd59f44c50" class="wlWriterEditableSmartContent"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/SharePoint+2010" rel="tag"&gt;SharePoint 2010&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Health" rel="tag"&gt;Health&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Monitoring" rel="tag"&gt;Monitoring&lt;/a&gt;,&lt;a href="http://technorati.com/tags/SCOM" rel="tag"&gt;SCOM&lt;/a&gt;&lt;/div&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10016579" width="1" height="1"&gt;&lt;img src="http://feeds.feedburner.com/~r/MarkArendSharePoint/~4/H8lnXAC4pWE" height="1" width="1"/&gt;</description><category domain="http://blogs.msdn.com/b/markarend/archive/tags/SharePoint/">SharePoint</category><category domain="http://blogs.msdn.com/b/markarend/archive/tags/2010/">2010</category><category domain="http://blogs.msdn.com/b/markarend/archive/tags/SCOM/">SCOM</category><category domain="http://blogs.msdn.com/b/markarend/archive/tags/Health/">Health</category><category domain="http://blogs.msdn.com/b/markarend/archive/tags/Monitoring/">Monitoring</category></item><item><title>The Site Directory</title><link>http://blogs.msdn.com/b/markarend/archive/2010/05/26/the-site-directory.aspx</link><pubDate>Wed, 26 May 2010 19:26:12 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10015849</guid><dc:creator>Mark Arend</dc:creator><slash:comments>0</slash:comments><wfw:commentRss>http://blogs.msdn.com/b/markarend/rsscomments.aspx?WeblogPostID=10015849</wfw:commentRss><comments>http://blogs.msdn.com/b/markarend/archive/2010/05/26/the-site-directory.aspx#comments</comments><description>&lt;p&gt;What happened to the Site Directory template in SharePoint 2010?&amp;#160; This feature was deprecated by the product group, because new features in SharePoint 2010 were deemed a better way to automatically navigate and find sites and content, over the Site Directory model (which was admittedly a bit clunky, if you ask me).&lt;/p&gt;  &lt;p&gt;So in SharePoint 2010, there is no longer an option to create a site with this template, and the portal site template does not include a Site Directory.&lt;/p&gt;  &lt;p&gt;Now, if you upgrade a MOSS 2007 farm to SharePoint 2010, any Site Directory sites that you have will be upgraded and remain fully functional. So existing site directories are supported, but not the creation of new ones.&amp;#160; This is why Central Administration still has an area to configure a Site Directory (under General Application Settings); so you may continue to manage any upgraded site directories correctly.&lt;/p&gt;  &lt;p&gt;&lt;a title="Site Directory in SharePoint Server 2010" href="http://blogs.technet.com/b/wbaer/archive/2010/04/29/site-directory-in-sharepoint-server-2010.aspx"&gt;Bill Baer’s excellent blog&lt;/a&gt; gives some additional information on this topic, including the new features of 2010 that are envisioned to be better replacements, such as Tagging, Notes, Managed Metadata and Metadata-based Navigation.&lt;/p&gt;  &lt;p&gt;Finally, for those who want the specific functionality of the Site Directory in SharePoint 2010, a CodePlex solution is available: &lt;a href="http://spsitedirectory2010.codeplex.com/"&gt;http://spsitedirectory2010.codeplex.com/&lt;/a&gt;. This solution “follows the same basic principle of the Site Directory in SharePoint 2007 but adds some commonly requested features”&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:af2e2d16-2d3a-4647-ac53-177eccb233bf" class="wlWriterEditableSmartContent"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/SharePoint+2010" rel="tag"&gt;SharePoint 2010&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Site+Directory" rel="tag"&gt;Site Directory&lt;/a&gt;&lt;/div&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10015849" width="1" height="1"&gt;&lt;img src="http://feeds.feedburner.com/~r/MarkArendSharePoint/~4/WX_EmoLvbBU" height="1" width="1"/&gt;</description><category domain="http://blogs.msdn.com/b/markarend/archive/tags/SharePoint/">SharePoint</category><category domain="http://blogs.msdn.com/b/markarend/archive/tags/Site+Directory/">Site Directory</category><category domain="http://blogs.msdn.com/b/markarend/archive/tags/2010/">2010</category></item><item><title>SharePoint 2010 SDK</title><link>http://blogs.msdn.com/b/markarend/archive/2010/05/26/sharepoint-2010-sdk.aspx</link><pubDate>Wed, 26 May 2010 17:52:48 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10015786</guid><dc:creator>Mark Arend</dc:creator><slash:comments>0</slash:comments><wfw:commentRss>http://blogs.msdn.com/b/markarend/rsscomments.aspx?WeblogPostID=10015786</wfw:commentRss><comments>http://blogs.msdn.com/b/markarend/archive/2010/05/26/sharepoint-2010-sdk.aspx#comments</comments><description>&lt;p&gt;The SDK (Software Development Kit) for SharePoint 2010 RTM’d slightly after the product itself and is now available.&amp;#160; This download contains both SharePoint 2010 and SharePoint Foundation 2010 SDKs, which you may install separately.&amp;#160; About 450 MB required to install both of them, but the download is much smaller.&lt;/p&gt;  &lt;p&gt;&lt;a title="Microsoft downloads" href="http://www.microsoft.com/downloads/details.aspx?displaylang=en&amp;amp;FamilyID=f0c9daf3-4c54-45ed-9bde-7b4d83a8f26f"&gt;Download the SDK&lt;/a&gt; now.&lt;/p&gt;  &lt;h5&gt;Tons of new “How-To” topics and code samples!&lt;/h5&gt;  &lt;p&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Code samples for &lt;strong&gt;SharePoint Foundation&lt;/strong&gt;       &lt;ul&gt;       &lt;li&gt;Implementation of IBackupRestore &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;Code samples for &lt;strong&gt;Business Connectivity Services&lt;/strong&gt;       &lt;ul&gt;       &lt;li&gt;AdventureWorks .NET Assembly &lt;/li&gt;        &lt;li&gt;AdventureWorks ASP.NET Web Service &lt;/li&gt;        &lt;li&gt;AdventureWorks WCF Service &lt;/li&gt;        &lt;li&gt;AdventureWorks 2008 .Net Assembly and Web Services &lt;/li&gt;        &lt;li&gt;AdventureWorks 2008 Declarative Outlook Solution Reusable Components &lt;/li&gt;        &lt;li&gt;AdventureWorks 2008 Declarative Outlook Solution Sample &lt;/li&gt;        &lt;li&gt;Authenticating and Consuming Data from NetFlix (Web 2.0 Application) &lt;/li&gt;        &lt;li&gt;BDC Model for XML Snippets &lt;/li&gt;        &lt;li&gt;Custom Web Part and Word Add-in Sample &lt;/li&gt;        &lt;li&gt;Sample Orders .Net Assembly and Web Services &lt;/li&gt;        &lt;li&gt;Sandboxed BCS Workflow Sample &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;Code samples for &lt;strong&gt;Enterprise Content Management&lt;/strong&gt;       &lt;ul&gt;       &lt;li&gt;Content Type-Based Metadata &lt;/li&gt;        &lt;li&gt;Creating a Routing Rule &lt;/li&gt;        &lt;li&gt;Custom Document ID Provider &lt;/li&gt;        &lt;li&gt;Managed Metadata Dependencies &lt;/li&gt;        &lt;li&gt;Pausable Custom Timer Jobs &lt;/li&gt;        &lt;li&gt;Publishing Cache Services &lt;/li&gt;        &lt;li&gt;Silverlight Controls and Silverlight Thumbnail Extraction Sample &lt;/li&gt;        &lt;li&gt;Retention Events &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;Code samples for &lt;strong&gt;User Profiles and Social Data&lt;/strong&gt;       &lt;ul&gt;       &lt;li&gt;Combine information from my public profile on Linkedin (or Facebook) with my User Profile &lt;/li&gt;        &lt;li&gt;Gold star or thumbs to a colleague &lt;/li&gt;        &lt;li&gt;Insert an event/document change event in feed &lt;/li&gt;        &lt;li&gt;Share a link with my colleagues &lt;/li&gt;        &lt;li&gt;Social data statistics &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;Code samples for &lt;strong&gt;Visio Services&lt;/strong&gt;       &lt;ul&gt;       &lt;li&gt;Annotations Sample &lt;/li&gt;        &lt;li&gt;Custom Error Messages Sample &lt;/li&gt;        &lt;li&gt;Mouse Interaction Sample &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt; &lt;/ul&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:09e5670d-2bb4-48b9-ba09-a3768fe40ef4" class="wlWriterEditableSmartContent"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/SharePoint+2010" rel="tag"&gt;SharePoint 2010&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Code+Samples" rel="tag"&gt;Code Samples&lt;/a&gt;&lt;/div&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10015786" width="1" height="1"&gt;&lt;img src="http://feeds.feedburner.com/~r/MarkArendSharePoint/~4/zA9_yKsDt7s" height="1" width="1"/&gt;</description><category domain="http://blogs.msdn.com/b/markarend/archive/tags/SharePoint/">SharePoint</category><category domain="http://blogs.msdn.com/b/markarend/archive/tags/2010/">2010</category><category domain="http://blogs.msdn.com/b/markarend/archive/tags/SDK/">SDK</category><category domain="http://blogs.msdn.com/b/markarend/archive/tags/Code+Samples/">Code Samples</category></item><item><title>Hands-On SharePoint 2010</title><link>http://blogs.msdn.com/b/markarend/archive/2010/05/25/hands-on-sharepoint-2010.aspx</link><pubDate>Wed, 26 May 2010 00:56:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10015261</guid><dc:creator>Mark Arend</dc:creator><slash:comments>2</slash:comments><wfw:commentRss>http://blogs.msdn.com/b/markarend/rsscomments.aspx?WeblogPostID=10015261</wfw:commentRss><comments>http://blogs.msdn.com/b/markarend/archive/2010/05/25/hands-on-sharepoint-2010.aspx#comments</comments><description>&lt;p&gt;Some great resources are available for you to get hands-on tutorials and demo environments for SharePoint 2010 and Office 2010.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;For IT Pros&lt;/strong&gt;: &lt;a href="http://MSSharePointITPro.com"&gt;http://MSSharePointITPro.com&lt;/a&gt;.&amp;nbsp; This TechNet resource center is the starting place for understanding how to plan the physical architecture, infrastructure and configuration of SharePoint deployments.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Hands-On Lab: &lt;a href="http://technet.microsoft.com/en-us/sharepoint/ff420396.aspx"&gt;http://technet.microsoft.com/en-us/sharepoint/ff420396.aspx&lt;/a&gt; &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;For Developers&lt;/strong&gt;: &lt;a href="http://MSSharePointDeveloper.com"&gt;http://MSSharePointDeveloper.com&lt;/a&gt;.&amp;nbsp; This MSDN resource center is the starting place for understanding how to plan development and implementation of custom SharePoint deployments.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Hands-On Lab: &lt;a href="http://msdn.microsoft.com/en-us/sharepoint/ee513147.aspx"&gt;http://msdn.microsoft.com/en-us/sharepoint/ee513147.aspx&lt;/a&gt; &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;These labs let you get hands-on with an instance of SharePoint in the cloud, so no installation is necessary; you can get started right away.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;SharePoint 2010 IW Demos&lt;/strong&gt;: &lt;a href="http://go.microsoft.com/?linkid=9728417"&gt;http://go.microsoft.com/?linkid=9728417&lt;/a&gt;.&amp;nbsp; This is a Hyper-V virtual machine that has SharePoint 2010, Office 2010, Visual Studio 2010, SharePoint Designer 2010, SharePoint Workspace, and more.&amp;nbsp; Plus, a ton of content is installed: sites, pages, users, documents, videos, workflows, libraries, etc., and the scripts that take you through how to use and demonstrate it all.&amp;nbsp; This is an incredible resource.&amp;nbsp; It&amp;rsquo;s also huge: 18 GB.&amp;nbsp; But there is an optional link on the page to use Akami download manager to speed the download with pause/resume functionality. Requires Windows Server 2008 R2 with Hyper-V.&lt;/p&gt;
&lt;p&gt;Corresponding documents:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;SharePoint 2010 Overview Evaluation Guide &lt;a href="http://go.microsoft.com/?linkid=9727161"&gt;http://go.microsoft.com/?&lt;/a&gt;&lt;a href="http://go.microsoft.com/?linkid=9727161"&gt;linkid=9727161&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;SharePoint 2010 Walkthrough Guide &lt;a href="http://go.microsoft.com/?linkid=9727427"&gt;http://go.microsoft.com/?&lt;/a&gt;&lt;a href="http://go.microsoft.com/?linkid=9727427"&gt;linkid=9727427&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;Microsoft SharePoint Server 2010 Evaluation Guide For IT Professionals &lt;a href="https://mail.microsoft.com/owa/redir.aspx?C=4144b098150241899cfa2f3951163ddb&amp;amp;URL=http://go.microsoft.com/?linkid=9727162"&gt;http://go.microsoft.com/?linkid=9727162&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;Microsoft SharePoint 2010 Professional Developer&amp;rsquo;s Evaluation Guide &lt;a href="https://mail.microsoft.com/owa/redir.aspx?C=4144b098150241899cfa2f3951163ddb&amp;amp;URL=http://go.microsoft.com/?linkid=9727163"&gt;http://go.microsoft.com/?linkid=9727163&lt;/a&gt; &lt;/li&gt;
&lt;/ul&gt;
&lt;div class="wlWriterEditableSmartContent" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:8d50e253-d403-4355-b01a-dcc3006723b8" style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px"&gt;Technorati Tags: &lt;a rel="tag" href="http://technorati.com/tags/SharePoint+2010"&gt;SharePoint 2010&lt;/a&gt;,&lt;a rel="tag" href="http://technorati.com/tags/Labs"&gt;Labs&lt;/a&gt;,&lt;a rel="tag" href="http://technorati.com/tags/Demos"&gt;Demos&lt;/a&gt;&lt;/div&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10015261" width="1" height="1"&gt;&lt;img src="http://feeds.feedburner.com/~r/MarkArendSharePoint/~4/j1csRwdrP3E" height="1" width="1"/&gt;</description><category domain="http://blogs.msdn.com/b/markarend/archive/tags/SharePoint/">SharePoint</category><category domain="http://blogs.msdn.com/b/markarend/archive/tags/Demos/">Demos</category><category domain="http://blogs.msdn.com/b/markarend/archive/tags/Labs/">Labs</category><category domain="http://blogs.msdn.com/b/markarend/archive/tags/2010/">2010</category></item><item><title>SharePoint 2010 List and Library Size</title><link>http://blogs.msdn.com/b/markarend/archive/2010/05/25/sharepoint-2010-list-and-library-size.aspx</link><pubDate>Wed, 26 May 2010 00:55:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10015260</guid><dc:creator>Mark Arend</dc:creator><slash:comments>0</slash:comments><wfw:commentRss>http://blogs.msdn.com/b/markarend/rsscomments.aspx?WeblogPostID=10015260</wfw:commentRss><comments>http://blogs.msdn.com/b/markarend/archive/2010/05/25/sharepoint-2010-list-and-library-size.aspx#comments</comments><description>&lt;p&gt;Great news about increased list capacities for SharePoint 2010:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Max recommended SharePoint 2010 list size is 30 million items or documents!&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Plus, the maximum recommended number of items or documents in a view is now 5,000.&amp;nbsp; Specific guidelines are given in &lt;a href="http://technet.microsoft.com/en-us/library/cc262787(office.14).aspx" title="SharePoint Server 2010 Capacity Management- Software Boundaries and Limits"&gt;SharePoint Server 2010 Capacity Management- Software Boundaries and Limits&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;We still highly recommend nesting documents in a folder structure when you want to store millions of documents in the library.&amp;nbsp; There are two new features to help you do this easily: the Content Organizer and Document IDs.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Content Organizer&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This is a configuration that you can enable on a document library, to automatically organize documents into folder structures, even creating new folders when necessary.&amp;nbsp; Steve Peschka describes it best in his detailed &lt;a href="http://blogs.technet.com/speschka/archive/2009/10/30/sharepoint-2010-content-organizer-part-1-a-cool-new-feature-for-managing-your-content.aspx" title="SharePoint 2010 Content Organizer Part 1 - A Cool New Feature for Managing Your Content"&gt;article on the Content Organizer&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;ldquo;&amp;hellip;it can be used for mundane housekeeping type activities such as making sure that no folder within a document library contains more than 5000 items, for example. When item number 5001 is added to the library, the Content Organizer can automatically create a new folder and put the document in that folder. All of this routing and folder creation can be handled automatically without further user intervention. After a document is uploaded and the required metadata applied, the upload form displays a Url to a document that has been routed so the user knows where to find it in the future.&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;Document IDs&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;SharePoint now provides the ability to automatically assign a unique ID to documents as they are created or uploaded that can be used to locate them no matter where they are stored or moved in the farm.&amp;nbsp; It works for single documents and the new Document Set.&amp;nbsp; Blair Biggens &lt;a href="http://blogs.technet.com/blairb/archive/2009/10/20/new-document-id-feature-in-sharepoint-2010.aspx" title="New Document ID Feature in SharePoint 2010"&gt;discusses this in more detail&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Also very nice: it&amp;rsquo;s not a GUID but a bit more friendlier, shorter ID code!&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10015260" width="1" height="1"&gt;&lt;img src="http://feeds.feedburner.com/~r/MarkArendSharePoint/~4/PLHHKfKOSy4" height="1" width="1"/&gt;</description><category domain="http://blogs.msdn.com/b/markarend/archive/tags/SharePoint/">SharePoint</category><category domain="http://blogs.msdn.com/b/markarend/archive/tags/Capacity+Planning/">Capacity Planning</category><category domain="http://blogs.msdn.com/b/markarend/archive/tags/List+Size/">List Size</category><category domain="http://blogs.msdn.com/b/markarend/archive/tags/2010/">2010</category></item><item><title>SharePoint 2010 Content Database Size</title><link>http://blogs.msdn.com/b/markarend/archive/2010/05/25/sharepoint-2010-content-database-size.aspx</link><pubDate>Wed, 26 May 2010 00:54:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10015259</guid><dc:creator>Mark Arend</dc:creator><slash:comments>0</slash:comments><wfw:commentRss>http://blogs.msdn.com/b/markarend/rsscomments.aspx?WeblogPostID=10015259</wfw:commentRss><comments>http://blogs.msdn.com/b/markarend/archive/2010/05/25/sharepoint-2010-content-database-size.aspx#comments</comments><description>&lt;p&gt;Great news about increased storage capacities for SharePoint 2010: &lt;/p&gt;
&lt;p align="center"&gt;&lt;strong&gt;Max recommended SharePoint 2010 content database size is 200 GB!&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This is double that of MOSS 2007, and for &lt;em&gt;specific workloads&amp;mdash;&lt;/em&gt;large, single-site repositories and archives with non-collaborative IO and usage patterns such as Records Centers&amp;mdash;content databases up to &lt;strong&gt;1 TB&lt;/strong&gt; are supported.&amp;nbsp; The specific guidance is given in &lt;a href="http://technet.microsoft.com/en-us/library/cc262787(office.14).aspx"&gt;SharePoint Server 2010 Capacity Management: Software Boundaries and Limits&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;ldquo;We strongly recommended limiting the size of content databases to 200 GB to help ensure system performance.&lt;/p&gt;
&lt;p&gt;&amp;ldquo;Content database sizes up to 1 terabyte are supported only for large, single-site repositories and archives with non-collaborative I/O and usage patterns, such as Records Centers. Larger database sizes are supported for these scenarios because their I/O patterns and typical data structure formats have been designed for, and tested at, larger scales.&lt;/p&gt;
&lt;p&gt;&amp;ldquo;A site collection should not exceed 100 GB unless it is the only site collection in the database.&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;A simple spreadsheet will help you plan your content databases and site quotas:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Components-PostAttachments/00-10-01-52-59/Content-DB-Sizing.xlsx"&gt;&lt;img height="142" width="515" src="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-68-30-metablogapi/5826.image_5F00_thumb_5F00_542DAF4C.png" alt="Click to open spreadsheet" border="0" title="image" style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;(&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Components-PostAttachments/00-10-01-52-59/Content-DB-Sizing.xlsx" title="Open Spreadsheet"&gt;open spreadsheet&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;What enabled the size to increase?&amp;nbsp; Two items that were (and remain) limiting factors have been improved.&amp;nbsp; Understanding these is key to planning your SharePoint infrastructures.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;List processing.&amp;nbsp; The bulk of content in SharePoint is stored in lists and libraries.&amp;nbsp; When many site collections are created in one content database, and collaborative activities grow across all the lists they contain, a very heavy load is placed on SQL Server. SharePoint 2010 contains improvements to list architecture and access mechanisms that address this. &lt;/li&gt;
&lt;li&gt;Backup &amp;ndash; The ability to backup and restore large databases in a reasonable time also limits how large you want databases to grow.&amp;nbsp; SharePoint 2010&amp;rsquo;s farm backup and restore have performance improvements (mostly around multi-threading) that enable similar SLAs for larger database sizes. &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;Joel Oleson has a great article that includes more discussion about sizing, in &lt;a href="http://www.sharepointjoel.com/Lists/Posts/Post.aspx?List=0cd1a63d%2D183c%2D4fc2%2D8320%2Dba5369008acb&amp;amp;ID=332"&gt;SharePoint 2010 Capacity Planning&lt;/a&gt;.&amp;nbsp; &lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10015259" width="1" height="1"&gt;&lt;img src="http://feeds.feedburner.com/~r/MarkArendSharePoint/~4/gfEeDsB2vSs" height="1" width="1"/&gt;</description><enclosure url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-components-postattachments/00-10-01-52-59/Content-DB-Sizing.xlsx" length="10573" type="application/vnd.openxmlformats-officedocument.spre" /><category domain="http://blogs.msdn.com/b/markarend/archive/tags/SharePoint/">SharePoint</category><category domain="http://blogs.msdn.com/b/markarend/archive/tags/Capacity+Planning/">Capacity Planning</category><category domain="http://blogs.msdn.com/b/markarend/archive/tags/Content+Databases/">Content Databases</category><category domain="http://blogs.msdn.com/b/markarend/archive/tags/2010/">2010</category></item><item><title>SharePoint 2010</title><link>http://blogs.msdn.com/b/markarend/archive/2010/05/04/sharepoint-2010.aspx</link><pubDate>Tue, 04 May 2010 18:36:52 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10007287</guid><dc:creator>Mark Arend</dc:creator><slash:comments>0</slash:comments><wfw:commentRss>http://blogs.msdn.com/b/markarend/rsscomments.aspx?WeblogPostID=10007287</wfw:commentRss><comments>http://blogs.msdn.com/b/markarend/archive/2010/05/04/sharepoint-2010.aspx#comments</comments><description>&lt;p&gt;After a long hiatus from blogging about MOSS 2007, I plan to begin again; now entries will focus on SharePoint 2010.&amp;#160; This entry is more of a spacer than anything.&amp;#160; That, and hopefully a kick in the pants to start posting new good info.&amp;#160; Wish me luck!&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10007287" width="1" height="1"&gt;&lt;img src="http://feeds.feedburner.com/~r/MarkArendSharePoint/~4/Y1UvXrlBvHs" height="1" width="1"/&gt;</description></item><item><title>Debugging web parts and other SharePoint custom code</title><link>http://blogs.msdn.com/b/markarend/archive/2008/09/09/debugging-web-parts-and-other-sharepoint-custom-code.aspx</link><pubDate>Tue, 09 Sep 2008 15:34:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8936482</guid><dc:creator>Mark Arend</dc:creator><slash:comments>2</slash:comments><wfw:commentRss>http://blogs.msdn.com/b/markarend/rsscomments.aspx?WeblogPostID=8936482</wfw:commentRss><comments>http://blogs.msdn.com/b/markarend/archive/2008/09/09/debugging-web-parts-and-other-sharepoint-custom-code.aspx#comments</comments><description>&lt;p&gt;&lt;em&gt;&lt;span style="color: #0000ff;"&gt;&lt;span style="font-size: small;"&gt;This blog posting applies to Microsoft Office SharePoint Server 2007.&lt;/span&gt;&lt;/span&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Here are some tips for debugging your SharePoint web parts and other custom code. &lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;1. How do you debug assemblies that are in the GAC?&lt;/p&gt;
&lt;p&gt;2. Is there an easy way of attaching the debugger to the right process?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;Debugging assemblies that live in the GAC&lt;/h3&gt;
&lt;p&gt;When debugging an assembly that lives in the GAC, you have to copy the symbol file (.pdb) from your project to the GAC.&amp;nbsp; The problem is, when you open a Windows file explorer to the GAC directory, C:\Windows\assembly, it doesn't behave like a folder that you can drag-and-drop into.&amp;nbsp; You must copy using another method.&lt;/p&gt;
&lt;p&gt;To view the GAC as typical folder structure using file explorer, enter &lt;b&gt;%systemroot%\assembly\gac_msil&lt;/b&gt; in the Run... dialog box under the start menu.&amp;nbsp; This folder opens the part of the GAC that contains managed code assemblies (from this location in file explorer, you can click the folder-up button to see other parts of the GAC).&lt;/p&gt;
&lt;p&gt;From %systemroot%\assembly\gac_msil, locate the folder having the name of your assembly, and open that.&amp;nbsp; Open the folder in there having the correct version number.&amp;nbsp; Finally you&amp;rsquo;ll see the dll.&amp;nbsp; To debug, drag the .pdb file from your bin\debug directory into that folder.&amp;nbsp; You can also use an xcopy command to do this, now that you see the full path to the dll location.&amp;nbsp; This path will change if you modify your assembly's version number.&amp;nbsp; Note that whenever you upgrade your solution, the .pdb file is removed from that folder, so you have to copy it there again to debug again.&lt;/p&gt;
&lt;p&gt;Of course you want to make sure to build in debug mode.&amp;nbsp; Some projects are set up with dependencies on the \release\ directory, which I think is a bad idea, but it's a fact of life sometimes.&amp;nbsp; If you don't want to change your build to Debug, you can quickly change your Release build to emit debug symbols: open the properties page for the project&amp;mdash;make sure Configuration is Active (Release)&amp;mdash;and on the Build tab, check &amp;ldquo;Define DEBUG constant&amp;rdquo; and uncheck &amp;ldquo;Optimize code&amp;rdquo; (you may also have to click the Advanced button and select "full"&amp;nbsp;symbols).&amp;nbsp; Now building in release mode will include debug symbols.&amp;nbsp; Be sure to change these settings back once you&amp;rsquo;re done.&lt;/p&gt;
&lt;h3&gt;Attaching the debugger to the right process&lt;/h3&gt;
&lt;p&gt;A number of people have asked me about the "Attach Debugger" menu item they see me use.&amp;nbsp; This is a community feature that's been around for more than a year, but it's good to refresh people's memory of this extremely useful tool.&amp;nbsp; &lt;/p&gt;
&lt;p&gt;A &lt;a href="http://blogs.msdn.com/sharepoint/archive/2007/04/10/debugger-feature-for-sharepoint.aspx"&gt;SharePoint product team blog entry&lt;/a&gt; discusses the Attach Debugger feature that you can install for SharePoint pages.&amp;nbsp; It has a link to the CodePlex project &lt;a href="http://www.codeplex.com/features/Release/ProjectReleases.aspx?ReleaseId=2502"&gt;SharePoint 2007 Features&lt;/a&gt; that you can install to enable this feature on the Site Actions menu of your sites:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/markarend/WindowsLiveWriter/DebuggingwebpartsandotherSharePointcusto_71E3/Attach%20Debugger_2.gif"&gt;&lt;img height="195" width="257" src="http://blogs.msdn.com/blogfiles/markarend/WindowsLiveWriter/DebuggingwebpartsandotherSharePointcusto_71E3/Attach%20Debugger_thumb.gif" alt="Attach Debugger" border="0" style="BORDER-RIGHT: 0px; BORDER-TOP: 0px; BORDER-LEFT: 0px; BORDER-BOTTOM: 0px" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;Extremely helpful!&amp;nbsp; And as a bonus, it seems faster than doing it from Visual Studio's Attach Debugger command.&lt;/p&gt;
&lt;p&gt;I recommend you look at the &lt;a href="http://www.codeplex.com/features/Release/ProjectReleases.aspx?ReleaseId=2502"&gt;SharePoint 2007 Features&lt;/a&gt; project, it's got lots of goodies besides this.&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:a087e32a-5e63-4328-8b52-29d5162142bd" style="PADDING-RIGHT: 0px; DISPLAY: inline; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px"&gt;Technorati Tags: &lt;a rel="tag" href="http://technorati.com/tags/SharePoint%20Development"&gt;SharePoint Development&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8936482" width="1" height="1"&gt;&lt;img src="http://feeds.feedburner.com/~r/MarkArendSharePoint/~4/at5_wpVU1DA" height="1" width="1"/&gt;</description><category domain="http://blogs.msdn.com/b/markarend/archive/tags/SharePoint/">SharePoint</category><category domain="http://blogs.msdn.com/b/markarend/archive/tags/Web+Parts/">Web Parts</category><category domain="http://blogs.msdn.com/b/markarend/archive/tags/Development/">Development</category><category domain="http://blogs.msdn.com/b/markarend/archive/tags/2007/">2007</category></item><item><title>List of MOSS Timer Jobs</title><link>http://blogs.msdn.com/b/markarend/archive/2008/09/06/list-of-moss-timer-jobs.aspx</link><pubDate>Sat, 06 Sep 2008 16:26:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8927844</guid><dc:creator>Mark Arend</dc:creator><slash:comments>3</slash:comments><wfw:commentRss>http://blogs.msdn.com/b/markarend/rsscomments.aspx?WeblogPostID=8927844</wfw:commentRss><comments>http://blogs.msdn.com/b/markarend/archive/2008/09/06/list-of-moss-timer-jobs.aspx#comments</comments><description>&lt;p&gt;&lt;em&gt;&lt;span style="color: #0000ff;"&gt;&lt;span style="font-size: small;"&gt;This blog posting applies to Microsoft Office SharePoint Server 2007.&lt;/span&gt;&lt;/span&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;MOSS has many default timer jobs; information about them can be useful to understand the workings of your MOSS farm, and potentially to troubleshoot problems or plan for related types of customizations.&lt;/p&gt;
&lt;p&gt;The attached document provides a list of all MOSS timer jobs provided out-of-box, with some additional notes about them.&lt;/p&gt;
&lt;p&gt;(&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Components-PostAttachments/00-08-92-78-44/MOSS-Timer-Jobs.doc" title="Open Attachment"&gt;Open Attachment&lt;/a&gt;)&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8927844" width="1" height="1"&gt;&lt;img src="http://feeds.feedburner.com/~r/MarkArendSharePoint/~4/0gcOuhy9Ung" height="1" width="1"/&gt;</description><enclosure url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-components-postattachments/00-08-92-78-44/MOSS-Timer-Jobs.doc" length="103424" type="application/msword" /><category domain="http://blogs.msdn.com/b/markarend/archive/tags/SharePoint/">SharePoint</category><category domain="http://blogs.msdn.com/b/markarend/archive/tags/Configuration/">Configuration</category><category domain="http://blogs.msdn.com/b/markarend/archive/tags/2007/">2007</category><category domain="http://blogs.msdn.com/b/markarend/archive/tags/Timer+Jobs/">Timer Jobs</category></item><item><title>Consolidated list of MOSS items</title><link>http://blogs.msdn.com/b/markarend/archive/2008/09/06/consolidated-list-of-moss-items.aspx</link><pubDate>Sat, 06 Sep 2008 16:16:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8927826</guid><dc:creator>Mark Arend</dc:creator><slash:comments>2</slash:comments><wfw:commentRss>http://blogs.msdn.com/b/markarend/rsscomments.aspx?WeblogPostID=8927826</wfw:commentRss><comments>http://blogs.msdn.com/b/markarend/archive/2008/09/06/consolidated-list-of-moss-items.aspx#comments</comments><description>&lt;p&gt;&lt;em&gt;&lt;span style="color: #0000ff;"&gt;&lt;span style="font-size: small;"&gt;This blog posting applies to Microsoft Office SharePoint Server 2007.&lt;/span&gt;&lt;/span&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Sometimes you just need a list of things provided by MOSS, in order to plan what kind of things you will make available to users within your architecture.&lt;/p&gt;
&lt;p&gt;The attached document lists all out-of-box Lists, Web Parts, Site Templates and Site Actions provided out-of-box&amp;nbsp;by MOSS, along with their descriptions and availability.&lt;/p&gt;
&lt;p&gt;(&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Components-PostAttachments/00-08-92-78-26/MOSS-Lists_2C00_-Libraries_2C00_-Web-Parts_2C00_-Templates-_2600_-Site-Actions.doc" title="Open Attachment"&gt;Open Attachment&lt;/a&gt;)&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8927826" width="1" height="1"&gt;&lt;img src="http://feeds.feedburner.com/~r/MarkArendSharePoint/~4/xWbeOkULlEg" height="1" width="1"/&gt;</description><enclosure url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-components-postattachments/00-08-92-78-26/MOSS-Lists_2C00_-Libraries_2C00_-Web-Parts_2C00_-Templates-_2600_-Site-Actions.doc" length="186880" type="application/msword" /><category domain="http://blogs.msdn.com/b/markarend/archive/tags/SharePoint/">SharePoint</category><category domain="http://blogs.msdn.com/b/markarend/archive/tags/2007/">2007</category></item><item><title>MOSS Usage Reports explained</title><link>http://blogs.msdn.com/b/markarend/archive/2008/09/06/moss-usage-reports-explained.aspx</link><pubDate>Sat, 06 Sep 2008 15:55:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8927809</guid><dc:creator>Mark Arend</dc:creator><slash:comments>6</slash:comments><wfw:commentRss>http://blogs.msdn.com/b/markarend/rsscomments.aspx?WeblogPostID=8927809</wfw:commentRss><comments>http://blogs.msdn.com/b/markarend/archive/2008/09/06/moss-usage-reports-explained.aspx#comments</comments><description>&lt;p&gt;&lt;em&gt;&lt;span style="color: #0000ff;"&gt;&lt;span style="font-size: small;"&gt;This blog posting applies to Microsoft Office SharePoint Server 2007.&lt;/span&gt;&lt;/span&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;The site usage reports that MOSS provides are fairly simple, but can be useful if you haven't got any other tools for tracking site usage.&amp;nbsp; One problem with them, however,&amp;nbsp;is that the information they present is not really explained anywhere. Columns are often named "Value" and sometimes it's not clear exactly what the value represents.&amp;nbsp; Another example is what does "Requests" actually measure?&amp;nbsp;&amp;nbsp;The answer is that&amp;nbsp;Requests always measures Page Views, not all HTTP requests for individual items like images, style sheets, etc.&lt;/p&gt;
&lt;p&gt;The attached document gives clear, detailed explanations of all out-of-box report elements.&lt;/p&gt;
&lt;p&gt;(&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Components-PostAttachments/00-08-92-78-09/MOSS-Usage-Reports-explained.doc" title="Open Attachment"&gt;Open Attachment&lt;/a&gt;)&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8927809" width="1" height="1"&gt;&lt;img src="http://feeds.feedburner.com/~r/MarkArendSharePoint/~4/_kWr7CQ_04k" height="1" width="1"/&gt;</description><enclosure url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-components-postattachments/00-08-92-78-09/MOSS-Usage-Reports-explained.doc" length="86016" type="application/msword" /><category domain="http://blogs.msdn.com/b/markarend/archive/tags/SharePoint/">SharePoint</category><category domain="http://blogs.msdn.com/b/markarend/archive/tags/Usage+reports/">Usage reports</category><category domain="http://blogs.msdn.com/b/markarend/archive/tags/2007/">2007</category></item><item><title>Colleagues, Social Distance &amp; Relevance in People Search; Social Networking tools</title><link>http://blogs.msdn.com/b/markarend/archive/2008/05/01/colleagues-social-distance-relevance-in-people-search-social-networking-tools.aspx</link><pubDate>Thu, 01 May 2008 16:16:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8447018</guid><dc:creator>Mark Arend</dc:creator><slash:comments>8</slash:comments><wfw:commentRss>http://blogs.msdn.com/b/markarend/rsscomments.aspx?WeblogPostID=8447018</wfw:commentRss><comments>http://blogs.msdn.com/b/markarend/archive/2008/05/01/colleagues-social-distance-relevance-in-people-search-social-networking-tools.aspx#comments</comments><description>&lt;p&gt;&lt;em&gt;&lt;span style="color: #0000ff;"&gt;&lt;span style="font-size: small;"&gt;This blog posting applies to Microsoft Office SharePoint Server 2007.&lt;/span&gt;&lt;/span&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;MOSS provides some very powerful features to enable the new buzzword "social networking."&amp;nbsp; Discussions about these can be found pretty easily, and I give an overview of some tools near the end of this posting.&amp;nbsp; But specifics about how some of the details work has been devilishly hard to find... until now.&amp;nbsp; Through discussions with various people in-the-know, I've been able to assemble answers to common questions around People Search and MySite web parts.&lt;/p&gt;
&lt;h3&gt;Social Distance&lt;/h3&gt;
&lt;p&gt;By default, the results on the People Search page are ordered by Social Distance.&amp;nbsp; What the heck is that?&amp;nbsp; It's an ordering of results based on colleague relationships.&amp;nbsp; Here's how it's computed:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Search results are always returned to the search results page sorted by &lt;b&gt;relevance&lt;/b&gt;. &lt;/li&gt;
&lt;li&gt;When viewing results by &lt;strong&gt;social distance&lt;/strong&gt;, additional processing on the search results page is used to group the results: 
&lt;ul&gt;
&lt;li&gt;The &lt;em&gt;first 3 pages &lt;/em&gt;of search results are grouped by colleague-ness: first your colleagues appear, then colleagues of your colleagues, then everyone else. &lt;/li&gt;
&lt;li&gt;Within each group, the ordering is still by relevance. &lt;/li&gt;
&lt;li&gt;When paging through results, another 3 pages of results will be grouped once you reach page 4, then page 7, etc. &lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;By default, 10 results appear per page, so this groups people in batches of 30.&amp;nbsp; If you customized the People Search results page to show 25 results per page, this would group people in batches of 75.&lt;/p&gt;
&lt;p&gt;There are potentially some quirks with this algorithm that was designed to give the best value in a lightweight manner.&amp;nbsp; Your colleagues will appear at the top of the list on page 1, but if you have lots of colleagues, more of them might appear on page 4.&amp;nbsp; This is because the colleague grouping takes place on the client, starting with a relevance ranking.&amp;nbsp; So if some of your colleagues are relevance-ranked after 3 pages worth of results, these will be grouped once you get to the next set of 3 pages (page 4, page 7, etc).&amp;nbsp; Based on relevance, these people should be less relevant to your query.&lt;/p&gt;
&lt;p&gt;The People Search results page allows you to toggle the results ordering to only Relevance, ignoring the Social Distance grouping.&lt;/p&gt;
&lt;h3&gt;Relevance&lt;/h3&gt;
&lt;p&gt;Relevance ranking in people search is the same as that used in regular search across lists and documents.&amp;nbsp; I'm told that the ranking algorithm MOSS uses in all cases is &lt;a target="_blank" href="http://en.wikipedia.org/wiki/Okapi_BM25" title="Wikipedia entry on BM25 and BM25F ranking algorithms"&gt;BM25F&lt;/a&gt;.&amp;nbsp; &lt;/p&gt;
&lt;p&gt;Conceptually, a user's profile is treated as a document about that person with their name as the title.&amp;nbsp; At a basic level, the more search query terms that appear in the person's profile, the more relevant the result.&amp;nbsp; Matches against a few special fields (e.g. name, alias) are returned in the high confidence webpart.&lt;/p&gt;
&lt;p&gt;Note that the names of discussion lists that a user belongs to are included in that user's profile information.&amp;nbsp; This means that a people search for "rock climbers" should return all of the people who are members of a distribution list named "Rock Climbers at Contoso" as well as anyone who has the phrase "rock climbers" in their profile information, such as in their "About Me" field.&lt;/p&gt;
&lt;h3&gt;Colleagues&lt;/h3&gt;
&lt;p&gt;Here's where the real value of social distance and other meaningful relationships is computed.&lt;/p&gt;
&lt;p&gt;A list of your colleagues is stored in the profile database.&amp;nbsp; During a profile import, this list is initially populated with a set of "immediate colleagues" that are computed from your profile properties: manager, peers and direct reports.&amp;nbsp; This way, when you first look at your Colleagues web part, it's not blank.&amp;nbsp; &lt;/p&gt;
&lt;p&gt;Then, from an editing page on your Profile, you can edit your colleagues list to add &amp;amp; remove specific people, and to group them and set their visibility to other people.&amp;nbsp; Also from here, you can ask SharePoint to suggest other colleagues, and these suggestions are collected from several places.&lt;/p&gt;
&lt;table cellpadding="2" cellspacing="0" border="0" style="width: 400px;"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td width="162" valign="top"&gt;&lt;a href="http://blogs.msdn.com/blogfiles/markarend/WindowsLiveWriter/05526a0e7f85_CF27/image_6.png"&gt;&lt;img height="311" width="146" src="http://blogs.msdn.com/blogfiles/markarend/WindowsLiveWriter/05526a0e7f85_CF27/image_thumb_2.png" alt="image" border="0" style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" /&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td width="236" valign="top"&gt;
&lt;p&gt;My Microsoft badge photo, 1999!&lt;/p&gt;
&lt;p&gt;From your My Site page (or your Profile page, which is available even if My Sites are turned off), click &lt;span style="color: #0000ff;"&gt;Colleagues&lt;/span&gt; to edit your colleague list.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h4&gt;Where do colleagues come from?&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Immediate colleagues &lt;br /&gt;&lt;/strong&gt;&lt;em&gt;...automatic: during profile import; comprised of:&lt;/em&gt; 
&lt;ul&gt;
&lt;li&gt;Your manager &lt;/li&gt;
&lt;li&gt;Your peers (others who report to your manager) &lt;/li&gt;
&lt;li&gt;Your direct reports &lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Colleagues added &lt;/strong&gt;by you &lt;br /&gt;&lt;em&gt;...manual: via editing page on your Profile&lt;/em&gt; &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Suggested colleagues&lt;/strong&gt; &lt;br /&gt;&lt;em&gt;...lookup: manually guided via editing page on your Profile; comprised of:&lt;/em&gt; 
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Sent items &lt;/strong&gt;in Outlook. Periodically (every 5 days or so, depending on usage) Outlook analyzes Sent Items for common recipients, weighted by frequency of contacts and other factors. This is how Outlook is able to suggest likely recipients when you begin typing their name in the To: line, and in my experience, it seems to work pretty well.&amp;nbsp; When you click Suggested colleagues, it collects these names from Outlook via an ActiveX control, and adds them to the list of suggestions. &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Office Communicator &lt;/strong&gt;contacts are examined; that is, those contacts that you've added to your Office Communicator client from the company directory.&amp;nbsp; These are also collected from the Communicator client via an ActiveX control. &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Site Memberships &lt;/strong&gt;are all sites &lt;em&gt;in which you are explicitly included &lt;/em&gt;in the "~Members" group for the site (where ~ is your site name).&amp;nbsp; Other users who are also explicitly included in the ~Members group on those sites are suggested as your colleagues.&amp;nbsp; This information is collected by a WSS profile synchronization timer job. &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;DG (Distribution Group) Memberships &lt;/strong&gt;are examined for suggestions.&amp;nbsp; Distribution groups stored in AD are collected during the AD import. &lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Colleagues from these sources are collected and the top 20 or so are displayed as suggestions when you click "Add Colleague" on your colleague editing page.&amp;nbsp; It's not fruitful to pursue a more detailed understanding of this calculation, because the recommendation for improving the "quality" of colleagues found is the same: people associated with items you access more often are more likely to be suggested as your colleagues.&amp;nbsp; If you don't like the suggestions, you can remove individuals from the suggestion list one by one or all at once from this page, then get a new list of suggestions.&lt;/p&gt;
&lt;h4&gt;Privacy&lt;/h4&gt;
&lt;p&gt;Whoa!&amp;nbsp; Is SharePoint looking at my email?&amp;nbsp; I don't want that, how do I prevent it?&lt;/p&gt;
&lt;p&gt;First, SharePoint's not looking at your emails.&amp;nbsp; It gets information about who you sent emails to by asking Outlook for that information.&amp;nbsp; Second, it will never do this without asking your permission.&amp;nbsp; You can always say no:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/markarend/WindowsLiveWriter/05526a0e7f85_CF27/image_3.png"&gt;&lt;img height="182" width="469" src="http://blogs.msdn.com/blogfiles/markarend/WindowsLiveWriter/05526a0e7f85_CF27/image_thumb.png" alt="image" border="0" style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;If you say Yes, then SharePoint will assemble a list of suggested colleagues for you, and you can accept or reject these suggestions.&amp;nbsp; But even if you say No, you can still edit your colleagues to search for and add new people, and to set the privacy of who should see that they are your colleague (Everyone, My Colleagues, My Workgroup, My Manager and Only Me):&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/markarend/WindowsLiveWriter/05526a0e7f85_CF27/image_7.png"&gt;&lt;img height="297" width="541" src="http://blogs.msdn.com/blogfiles/markarend/WindowsLiveWriter/05526a0e7f85_CF27/image_thumb_1.png" alt="image" border="0" style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;Social Networking tools&lt;/h3&gt;
&lt;p&gt;Why did we go through all this trouble to try and figure out who your colleagues are?&amp;nbsp; Social Networking, baby!&amp;nbsp; We spent a good bit of time on the inputs and the outputs of this to make it a really useful function, instead of just paying lip service to it.&lt;/p&gt;
&lt;p&gt;The &lt;em&gt;inputs&lt;/em&gt; are the information about who your colleagues really are.&amp;nbsp; A simple option would have been to just provide a place for you to register your colleagues, and not go through all this supposedly intelligent guesswork.&amp;nbsp; But that would have made it almost useless, because most people are just not going to take the time to populate this list, and even fewer will maintain it as their colleagues change over time, which is natural.&amp;nbsp; &lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;&lt;span style="font-size: small;"&gt;SharePoint uses the information already embedded in your company's infrastructure and the changing data you deal with on a daily basis to help you connect with the right people.&lt;/span&gt;&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Sounds like market-speak, but that's really the goal and I think it does an amazing job.&lt;/p&gt;
&lt;p&gt;The &lt;em&gt;outputs&lt;/em&gt; are the tools that SharePoint can provide based on this colleague information.&amp;nbsp; Consider some of these details:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;span style="color: #ea7500;"&gt;People Search&lt;/span&gt;&lt;/strong&gt; ranking by Social Distance.&amp;nbsp; By default, the top people returned when you search for a name will be the people you most likely want to find: people you've communicated with recently, perhaps as a participant on an email thread or a collaborator on a site, and now you want to find more information about them. &lt;br /&gt;&amp;nbsp; &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;span style="color: #ea7500;"&gt;In Common with You&lt;/span&gt;&lt;/strong&gt; web part on My Profile page.&amp;nbsp; When you view someone else's profile (for example, by clicking their People Search result), this web part shows you a list of people that you both may have in common.&amp;nbsp; This is useful to quickly understand business relationships that you may need to know about.&amp;nbsp; Categories shown are 
&lt;ul&gt;
&lt;li&gt;Manager we both report under &lt;/li&gt;
&lt;li&gt;Colleagues we both know &lt;/li&gt;
&lt;li&gt;Memberships we both share &lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;&amp;nbsp; &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;span style="color: #ea7500;"&gt;Colleague Tracker&lt;/span&gt;&lt;/strong&gt; web part on MySite.&amp;nbsp; This shows you recent changes to user properties of your colleagues, effectively a newsletter of what's new with people you work with.&amp;nbsp; Information you can track includes 
&lt;ul&gt;
&lt;li&gt;Anniversaries &lt;/li&gt;
&lt;li&gt;Profile property changes &lt;/li&gt;
&lt;li&gt;Membership changes &lt;/li&gt;
&lt;li&gt;New documents this person has posted &lt;/li&gt;
&lt;li&gt;Out of Office status &lt;/li&gt;
&lt;li&gt;Blog postings from this person &lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;&amp;nbsp; &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;span style="color: #ea7500;"&gt;Colleagues&lt;/span&gt; &lt;/strong&gt;web part on My Profile page.&amp;nbsp; This displays your current list of colleagues, grouped into categories that you may have applied. &lt;br /&gt;&amp;nbsp; &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;span style="color: #ea7500;"&gt;Memberships&lt;/span&gt; &lt;/strong&gt;web part on MySite.&amp;nbsp; This shows Distribution Lists and SharePoint Sites of which you are an explicit member.&amp;nbsp; For SharePoint Sites, it is rather specific: you must appear as an individual member of the ~Members group on the site (where ~ is the site name).&amp;nbsp; If you have access to the site through a different configuration, such as being a member of the ~Owners group, or being a member of an Active Directory Security Group that is a member of the ~Members group, this is not counted.&amp;nbsp; Otherwise, everyone would very likely see all the portal sites displayed as their memberships, and that would not be useful. &lt;br /&gt;&amp;nbsp; &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;span style="color: #ea7500;"&gt;Organization Hierarchy&lt;/span&gt; &lt;/strong&gt;web part on My Profile page.&amp;nbsp; This shows your manager, your peers (others who report to your manager) and your direct reports, if you have any. &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These are &lt;em&gt;some &lt;/em&gt;of the tools that MOSS provides for Social Networking; I've highlighted the ones that use profile data and the powerful "colleague" pattern to show meaningful relationships among people.&amp;nbsp; For a better introduction to the full set, see the product team's&amp;nbsp;&lt;a href="http://blogs.msdn.com/sharepoint/archive/2007/10/24/enabling-and-managing-social-networks-for-business-use-with-microsoft-office-sharepoint-server-2007.aspx"&gt;Enabling and Managing Social Networks for Business use with MOSS&lt;/a&gt;.&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:a92c1118-4c90-4941-b4ec-057a433765ed" style="PADDING-RIGHT: 0px; DISPLAY: inline; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px"&gt;Technorati Tags: &lt;a rel="tag" href="http://technorati.com/tags/SharePoint"&gt;SharePoint&lt;/a&gt;,&lt;a rel="tag" href="http://technorati.com/tags/Social%20Networking"&gt;Social Networking&lt;/a&gt;,&lt;a rel="tag" href="http://technorati.com/tags/MySites"&gt;MySites&lt;/a&gt;,&lt;a rel="tag" href="http://technorati.com/tags/People%20Search"&gt;People Search&lt;/a&gt;,&lt;a rel="tag" href="http://technorati.com/tags/Social%20Distance"&gt;Social Distance&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8447018" width="1" height="1"&gt;&lt;img src="http://feeds.feedburner.com/~r/MarkArendSharePoint/~4/Xzg5aG_IeZw" height="1" width="1"/&gt;</description><category domain="http://blogs.msdn.com/b/markarend/archive/tags/SharePoint/">SharePoint</category><category domain="http://blogs.msdn.com/b/markarend/archive/tags/Search/">Search</category><category domain="http://blogs.msdn.com/b/markarend/archive/tags/Web+Parts/">Web Parts</category><category domain="http://blogs.msdn.com/b/markarend/archive/tags/Social+Networking/">Social Networking</category><category domain="http://blogs.msdn.com/b/markarend/archive/tags/2007/">2007</category><category domain="http://blogs.msdn.com/b/markarend/archive/tags/My+Sites/">My Sites</category></item><item><title>Scaling My Sites; How Many My Sites per Content DB?</title><link>http://blogs.msdn.com/b/markarend/archive/2008/04/14/scaling-mysites-how-many-mysites-per-content-db.aspx</link><pubDate>Tue, 15 Apr 2008 00:43:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8394888</guid><dc:creator>Mark Arend</dc:creator><slash:comments>1</slash:comments><wfw:commentRss>http://blogs.msdn.com/b/markarend/rsscomments.aspx?WeblogPostID=8394888</wfw:commentRss><comments>http://blogs.msdn.com/b/markarend/archive/2008/04/14/scaling-mysites-how-many-mysites-per-content-db.aspx#comments</comments><description>&lt;p&gt;&lt;span style="color: #0000ff;"&gt;&lt;span style="font-size: larger;"&gt;&lt;em&gt;This blog posting applies to Microsoft Office SharePoint Server 2007.&lt;/em&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;I've worked with several companies who have between 100,000 and 200,000 employees.&amp;nbsp; Naturally, they want to architect a solution for MySites that can accommodate everyone in the company.&amp;nbsp; TechNet has information in the &lt;a href="http://technet.microsoft.com/en-us/library/cc262787.aspx"&gt;Plan for software boundaries&lt;/a&gt; article, but a few numbers are ambiguous or conflicting.&amp;nbsp; In this post I'll try to clear some of that up.&lt;/p&gt;
&lt;p&gt;The limits I'll respect from this article are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;100 GB maximum size for Content Database (DB) &lt;/li&gt;
&lt;li&gt;50,000 site collections per Content DB &lt;/li&gt;
&lt;/ul&gt;
&lt;h5&gt;Scale-out&lt;/h5&gt;
&lt;p&gt;The primary &lt;i&gt;scale-out&lt;/i&gt; strategy is to use multiple content databases in the MySite web application.&amp;nbsp; To meet the guideline of 50,000 site collections per DB, you should plan a minimum of 2 content databases to handle 100,000 MySites.&lt;/p&gt;
&lt;p&gt;Next, consider Throughput vs. Site Collections discussed in the TechNet article.&amp;nbsp; The most striking visual impact of this graph (reproduced below) is that performance appears to drop off dramatically as the number of site collections per content database grows to 50,000.&amp;nbsp; It looks a bit alarming.&amp;nbsp; But it's important to examine the numbers.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/markarend/WindowsLiveWriter/ScalingMySites_6FF0/Throughput%20vs%20Site%20Collections_7.jpg"&gt;&lt;img height="392" width="575" src="http://blogs.msdn.com/blogfiles/markarend/WindowsLiveWriter/ScalingMySites_6FF0/Throughput%20vs%20Site%20Collections_thumb_2.jpg" alt="Throughput vs Site Collections" border="0" style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;Let's look at some points on the graph.&amp;nbsp; Note this is a sample from testing; your specific numbers may vary, but we'll assume inflection points are in roughly the same places.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;At 10,000 site collections per content database, the number of requests per second (rps) is still above 100. &lt;/li&gt;
&lt;li&gt;From about 14,000 - 16,000 site collections, throughput decreases very rapidly. &lt;/li&gt;
&lt;li&gt;After 16,000 site collections, throughput "bottoms out" near 50 rps &lt;em&gt;and stays pretty much the same through 50,000 site collections.&lt;/em&gt; &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;As a general approach to optimizing throughput for &lt;em&gt;any &lt;/em&gt;arbitrary scenario, we might say that limiting content databases to 10,000 site collections is a good rule of thumb, because adding 50% more databases at this point cuts throughput in half.&amp;nbsp; But you should think through anticipated usage patterns for the particular web application and site collections.&lt;/p&gt;
&lt;p&gt;MySites have a common usage pattern: these site collections tend to have relatively small quotas, and don't get a lot of concurrent traffic.&amp;nbsp; A relatively small percentage of MySites are used heavily; these tend to be people who enjoy publishing material or experimenting with information techniques.&amp;nbsp; In many situations, 50 rps will be sufficient for MySite traffic.&amp;nbsp; This means we're free to set the limit of site collections per content database on the MySite host at any value up to the recommended limit of 50,000.&lt;/p&gt;
&lt;p&gt;The next limiting factor is the overall size of the content database: 100 GB is recommended as the maximum.&amp;nbsp; This, plus the desired MySite storage quota, will let us compute the optimum number of databases.&lt;/p&gt;
&lt;table cellpadding="2" cellspacing="0" border="1" style="width: 515px;"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td width="281" valign="top"&gt;Individual MySite quota (MB)&lt;/td&gt;
&lt;td width="46" valign="top"&gt;2&lt;/td&gt;
&lt;td width="51" valign="top"&gt;5&lt;/td&gt;
&lt;td width="50" valign="top"&gt;10&lt;/td&gt;
&lt;td width="43" valign="top"&gt;20&lt;/td&gt;
&lt;td width="42" valign="top"&gt;25&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="261" valign="top"&gt;Number of MySites per 100 GB content DB&lt;/td&gt;
&lt;td width="51" valign="top"&gt;51,200&lt;/td&gt;
&lt;td width="55" valign="top"&gt;20,480&lt;/td&gt;
&lt;td width="54" valign="top"&gt;10,240&lt;/td&gt;
&lt;td width="47" valign="top"&gt;5,120&lt;/td&gt;
&lt;td width="46" valign="top"&gt;4,096&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="248" valign="top"&gt;# content DBs per 100,000 users&lt;/td&gt;
&lt;td width="55" valign="top"&gt;2&lt;/td&gt;
&lt;td width="58" valign="top"&gt;5&lt;/td&gt;
&lt;td width="57" valign="top"&gt;10&lt;/td&gt;
&lt;td width="50" valign="top"&gt;20&lt;/td&gt;
&lt;td width="49" valign="top"&gt;25&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style="color: #0000ff;"&gt;&lt;strong&gt;Cool Rule: &lt;/strong&gt;Assuming 100GB as the maximum size of a content database, the number of databases you should plan for&amp;mdash;per 100,000 users&amp;mdash;is equal to the quota of each site collection in MB!&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Other combinations of maximum content DB size or number of users will not line up this way.&amp;nbsp; To compute the number of content databases, the following formulas may be used.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;# site collections per DB = (Max size of DB in GB * 1024) / (MySite quota in MB) &lt;/li&gt;
&lt;li&gt;# content DBs = (Number of MySites) / (# site collections per DB) &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For the second formula, you must always round fractions up to the next whole number (use the &lt;em&gt;ceiling &lt;/em&gt;function in Excel).&lt;/p&gt;
&lt;h5&gt;Scale-up&lt;/h5&gt;
&lt;p&gt;To further ensure the overall performance of SharePoint when using multiple content databases, configure SQL Server so that the databases are hosted on different physical drives (spindles).&amp;nbsp; This is usually possible with SAN storage solutions also.&amp;nbsp; My instinct is that you'd want to balance this with the scale-out strategies and usage patterns.&amp;nbsp; If you had 200,000 users with MySites and a large portion really began to use MySites heavily, then you might want to use 20 content databases distributed across 5 or 10 physical drives.&lt;/p&gt;
&lt;p&gt;Next, note that MySites usually cause significantly more transactions in the User Profile database than collaboration or publishing sites, because more web parts that present and manipulate profile information are available on MySites.&amp;nbsp; As you grow the number of MySites, the CPU, memory, storage and IOPS available for your User Profile DB becomes more important.&amp;nbsp; Therefore you want to consider putting this database on a separate physical drive also.&amp;nbsp; For very large user populations and/or heavy anticipated use of MySites, you could even consider using a separate instance of SQL Server for the Profile DB.&lt;/p&gt;
&lt;p&gt;The whitepaper &lt;a href="http://go.microsoft.com/fwlink/?LinkID=105623&amp;amp;clcid=0x409"&gt;SharePoint database performance recommendations&lt;/a&gt; gives specific recommendations for increasing performance via the database.&lt;/p&gt;
&lt;p&gt;What about TechNet&amp;rsquo;s limit of 150,000 site collections per web app?&amp;nbsp; Well, as of this writing, the article shows two different numbers for the same limit (the other is 50,000)... clearly, there is still some ambiguity over this.&amp;nbsp; Recent anecdotal evidence hints that 200,000 site collections can be hosted on one web application and still perform well.&amp;nbsp; If I find more details about this I'll post another entry.&lt;/p&gt;
&lt;p&gt;Areas a performance hit might be seen due to larger numbers are those that enumerate site collections in a web app.&amp;nbsp; There are pages in Central Administration (CA) that do this, and it can be mitigated by using the "find" function in the CA page or by using stsadm commands to perform some functions such as MySite deletion.&lt;/p&gt;
&lt;p&gt;If you want to plan for growth toward heavy MySite usage, you may want to consider using more than one web application to host them.&amp;nbsp; It's&amp;nbsp; possible to configure multiple web applications to host MySites.&amp;nbsp; When doing this, audiences can be defined to map users to MySite web apps.&amp;nbsp; A very common approach is to use geography as the audience, especially when a company has datacenters around the world that service users in their part of the world.&amp;nbsp; This has the added benefit of hosting a user's MySite from a datacenter nearer to them.&amp;nbsp; Refer to TechNet article &lt;a href="http://technet.microsoft.com/en-us/library/cc263115.aspx#Section2"&gt;Manage My Site host locations&lt;/a&gt; for much more detailed information on enabling this scenario.&lt;/p&gt;
&lt;p&gt;However, this may not be as balanced an approach for a domestic as it is for global companies.&amp;nbsp; The ideal arrangement is to find a natural organization of people that splits the whole population into just a few categories of reasonably equal quantities, and is reflected in user profile data.&amp;nbsp; Such a perfect arrangement may not exist; review your user profile database to look for natural categories that can uniquely classify everyone.&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:00db2be6-61e1-4062-959f-e569270b6aa6" style="padding-right: 0px; display: inline; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;Technorati Tags: &lt;a rel="tag" href="http://technorati.com/tags/MySites"&gt;MySites&lt;/a&gt;,&lt;a rel="tag" href="http://technorati.com/tags/SharePoint%20Capacity"&gt;SharePoint Capacity&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8394888" width="1" height="1"&gt;&lt;img src="http://feeds.feedburner.com/~r/MarkArendSharePoint/~4/sDSqrpBMpM8" height="1" width="1"/&gt;</description><category domain="http://blogs.msdn.com/b/markarend/archive/tags/SharePoint/">SharePoint</category><category domain="http://blogs.msdn.com/b/markarend/archive/tags/Capacity+Planning/">Capacity Planning</category><category domain="http://blogs.msdn.com/b/markarend/archive/tags/2007/">2007</category><category domain="http://blogs.msdn.com/b/markarend/archive/tags/My+Sites/">My Sites</category></item><item><title>Modifying My Site Owner Security</title><link>http://blogs.msdn.com/b/markarend/archive/2008/04/10/modifying-mysite-owner-security.aspx</link><pubDate>Thu, 10 Apr 2008 07:57:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8374056</guid><dc:creator>Mark Arend</dc:creator><slash:comments>14</slash:comments><wfw:commentRss>http://blogs.msdn.com/b/markarend/rsscomments.aspx?WeblogPostID=8374056</wfw:commentRss><comments>http://blogs.msdn.com/b/markarend/archive/2008/04/10/modifying-mysite-owner-security.aspx#comments</comments><description>&lt;p&gt;&lt;em&gt;&lt;span style="color: #0000ff;"&gt;&lt;span style="font-size: small;"&gt;This blog posting applies to Microsoft Office SharePoint Server 2007.&lt;/span&gt;&lt;/span&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;When someone creates a MySite, they are automatically given full control of that site.&amp;nbsp; More accurately: a MySite is a site collection; the creator becomes the first &amp;amp; only Site Collection Administrator; the creator is made a member of the Owners group.&amp;nbsp; &lt;/p&gt;
&lt;p&gt;Some people feel that this is too much control, and they'd like to limit it in some way.&amp;nbsp; My first piece of advice in this situation is: don't.&amp;nbsp; MySites are built with dependencies on the permissions and identity of the owner, the person who created the site.&amp;nbsp; Changing this can introduce undesirable or confusing behavior.&amp;nbsp; Then, if requirements later change, after hundreds or thousands of people have created their MySite, more code must be written to effect those changes.&amp;nbsp; But if you insist on going down this path, I found a way to meet this seemingly simple request.&amp;nbsp; The answer is most certainly not simple.&lt;/p&gt;
&lt;p&gt;Basically, you have to follow Steve Peschka&amp;rsquo;s approach described in the blog entry &lt;a href="http://blogs.msdn.com/sharepoint/archive/2007/03/22/customizing-moss-2007-my-sites-within-the-enterprise.aspx"&gt;customizing My Sites&lt;/a&gt; as the framework for doing this.&amp;nbsp; Then, add code to that scheme that knows how to change the security.&amp;nbsp; There are a few added challenges:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;You must do two things: 1) change the creator&amp;rsquo;s group membership and 2) remove them as a Site Collection Administrator. &lt;/li&gt;
&lt;li&gt;To give the creator of the MySite specific privileges, you typically want to create a custom privilege level and add the user into that group.&amp;nbsp; The benefit is that you can tweak this to allow/prevent actions at a fairly granular level, such as being able to block the ability to add subsites. &lt;/li&gt;
&lt;li&gt;The creator of the MySite is the &lt;em&gt;only &lt;/em&gt;Site Collection Administrator, so you can&amp;rsquo;t remove this person from this role until you first put someone else in there.&amp;nbsp; For best governance, this should be a user account that&amp;rsquo;s not really associated with an individual, but shared among trusted admins.&amp;nbsp; Unfortunately it must be a user account, not a group. &lt;/li&gt;
&lt;li&gt;There seems to be a timer job that fixes up the title of the MySite to match the name of the site administrator&amp;hellip; so you need some code that resets this back every time the user opens the site. &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Why can&amp;rsquo;t we just change the MySite site definition (template)?&amp;nbsp; Two reasons:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Modifying the MySite site definition is &amp;ldquo;unsupported&amp;rdquo; by Microsoft.&amp;nbsp; If you did it, then wanted help with problems related to it, the support engineer would make a best effort, but could not guarantee a fix.&amp;nbsp; Steve&amp;rsquo;s article talks more about this. &lt;/li&gt;
&lt;li&gt;Moot point!&amp;nbsp; User security is not stored in the site definition, so even if it were supported to modify it, there would be nothing to do. &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Below are code samples that address the challenges listed above.&amp;nbsp; Your job would be to integrate them with Steve Peschka&amp;rsquo;s &lt;a href="http://www.codeplex.com/CKS/Release/ProjectReleases.aspx?ReleaseId=2824"&gt;code&lt;/a&gt;.&amp;nbsp; Sorry I can&amp;rsquo;t give a more complete solution.&amp;nbsp; This is one task that is very difficult to accomplish in SharePoint, and the methods described are the only way we know of doing it in a supported way.&lt;/p&gt;
&lt;p&gt;(BTW, I use lots of try...catch blocks here to get the most granular logging.&amp;nbsp; You can implement Utility.LogMessage any way you like; I use MSDN's &lt;a href="http://msdn2.microsoft.com/en-us/library/aa979522.aspx"&gt;Trace Log Example&lt;/a&gt; to write to the ULS logs, and CodePlex's &lt;a href="http://www.codeplex.com/features/Release/ProjectReleases.aspx?ReleaseId=2502"&gt;Log Viewer Feature&lt;/a&gt; to read them.)&lt;/p&gt;
&lt;p&gt;

&lt;/p&gt;
&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; RestrictMySiteOwner()
{
    SPUserInfo originalOwnerInfo = &lt;span class="kwrd"&gt;new&lt;/span&gt; SPUserInfo();
    SPUserInfo newOwnerInfo = &lt;span class="kwrd"&gt;new&lt;/span&gt; SPUserInfo();&lt;br /&gt;
    &lt;span class="rem"&gt;// Store the original owner in site properties so we can restore it later if necessary&lt;/span&gt;
    &lt;span class="kwrd"&gt;try&lt;/span&gt;
    {
        StoreValueInSiteProperty(_curWeb, &lt;span class="str"&gt;"OriginalOwner"&lt;/span&gt;, MakeUserInfoString(originalOwnerInfo));
        Utility.LogMessage(&lt;span class="str"&gt;"Stored original administrator in site property."&lt;/span&gt;);
    }
    &lt;span class="kwrd"&gt;catch&lt;/span&gt; (Exception ex)
    {
        Utility.LogMessage(&lt;span class="str"&gt;"Error: can't store original administrator in site property.  "&lt;/span&gt; + ex.Message);
    }&lt;br /&gt;
    &lt;span class="rem"&gt;// Switch out the primary site administrator with a pre-defined one.&lt;/span&gt;
    &lt;span class="kwrd"&gt;try&lt;/span&gt;
    {
        newOwnerInfo.LoginName = &lt;span class="str"&gt;"DOMAIN\MySitesAdmin"&lt;/span&gt;;
        newOwnerInfo.Email = &lt;span class="str"&gt;"mysitesadmin@customer.com"&lt;/span&gt;;
        newOwnerInfo.Name = &lt;span class="str"&gt;"MySites domain manager"&lt;/span&gt;;
        newOwnerInfo.Notes = &lt;span class="str"&gt;"Owner of all MySites"&lt;/span&gt;;
        originalOwnerInfo = ReplacePrimarySiteAdministrator(_curWeb, newOwnerInfo);
        Utility.LogMessage(&lt;span class="str"&gt;"Switched primary administrator."&lt;/span&gt;);
    }
    &lt;span class="kwrd"&gt;catch&lt;/span&gt; (Exception ex)
    {
        Utility.LogMessage(&lt;span class="str"&gt;"Error: can't replace primary administrator.  "&lt;/span&gt; + ex.Message);
    }&lt;br /&gt;
    &lt;span class="rem"&gt;// Add the My Site creator to a group with limited permissions to control what is permissible on the site&lt;/span&gt;
    &lt;span class="kwrd"&gt;try&lt;/span&gt;
    {
        ChangeCurrentUserPermission(_curWeb, &lt;span class="str"&gt;"Restricted Owner"&lt;/span&gt;);
        Utility.LogMessage(&lt;span class="str"&gt;"Changed current user permissions."&lt;/span&gt;);
    }
    &lt;span class="kwrd"&gt;catch&lt;/span&gt; (Exception ex)
    {
        Utility.LogMessage(&lt;span class="str"&gt;"Error: can't change current user permissions.  "&lt;/span&gt; + ex.Message);
    }&lt;br /&gt;
    &lt;span class="rem"&gt;// Reset the name of the site back to original owner (was changed by switching primary site admin)&lt;/span&gt;
    &lt;span class="kwrd"&gt;try&lt;/span&gt;
    {
        SetSiteTitle(_curWeb, originalOwnerInfo.Name);
        Utility.LogMessage(&lt;span class="str"&gt;"Reset site title."&lt;/span&gt;);
    }
    &lt;span class="kwrd"&gt;catch&lt;/span&gt; (Exception ex)
    {
        Utility.LogMessage(&lt;span class="str"&gt;"Error: can't reset site title.  "&lt;/span&gt; + ex.Message);
    }
}


&lt;span class="kwrd"&gt;protected&lt;/span&gt; SPUserInfo ReplacePrimarySiteAdministrator(SPWeb site, &lt;span class="kwrd"&gt;SPUserInfo&lt;/span&gt; newAdminInfo)
{
    SPUser originalOwner = &lt;span class="kwrd"&gt;null&lt;/span&gt;;
    SPUserInfo originalOwnerInfo = &lt;span class="kwrd"&gt;new&lt;/span&gt; SPUserInfo();
 
    SPSecurity.RunWithElevatedPrivileges(&lt;span class="kwrd"&gt;delegate&lt;/span&gt;()
    {
        &lt;span class="rem"&gt;// Get the parent site collection&lt;/span&gt;
        SPSite sitecollection = site.Site;&lt;br /&gt;
        originalOwner = sitecollection.Owner;
        originalOwnerInfo = Utility.GetUserInfo(originalOwner);

        &lt;span class="kwrd"&gt;if&lt;/span&gt; (newAdminInfo.LoginName != originalOwnerInfo.LoginName)
        {
            &lt;span class="kwrd"&gt;try&lt;/span&gt;
            {
                &lt;span class="rem"&gt;// Add new admin to Full Control group&lt;/span&gt;
                SPRoleDefinition admins = site.RoleDefinitions[&lt;span class="str"&gt;"Full Control"&lt;/span&gt;];
                &lt;span class="kwrd"&gt;if&lt;/span&gt; (admins != &lt;span class="kwrd"&gt;null&lt;/span&gt;)
                {
                    SPRoleAssignment roleAssignment = &lt;br /&gt;&lt;span class="kwrd"&gt;                        new&lt;/span&gt; SPRoleAssignment(newAdminInfo.LoginName, newAdminInfo.Email, &lt;br /&gt;                        newAdminInfo.Name, newAdminInfo.Notes);
                   SPRoleDefinitionBindingCollection roleDefBindings = &lt;br /&gt;                        roleAssignment.RoleDefinitionBindings;
                    roleDefBindings.Add(admins);
                    site.RoleAssignments.Add(roleAssignment);
                    &lt;span class="rem"&gt;//site.Update(); // Don't need to do this&lt;/span&gt;
                }

                &lt;span class="rem"&gt;// Reset owner of site collection to new admin&lt;/span&gt;
                sitecollection.Owner = site.Users[newAdminInfo.LoginName];
                sitecollection.Owner.Update();

                &lt;span class="rem"&gt;//change the userprofile guid of the site&lt;/span&gt;
                sitecollection.Properties["urn:schemas-microsoft-com:sharepoint:portal:profile:userprofile_guid"] = toProfile.ID.ToString().Replace("{", string.Empty).Replace("}", string.Empty); 
                sitecollection.Properties.Update(); 

            }
            &lt;span class="kwrd"&gt;catch&lt;/span&gt; (SPException ex)
            {
                &lt;span class="rem"&gt;// We may get here if the user running this thread is the same as the &lt;br /&gt;                // aministrator we're trying to remove.&lt;/span&gt;
                Utility.LogMessage(&lt;span class="str"&gt;"Error: can't replace primary administrator.  "&lt;/span&gt; + ex.Message);
            }
        }
    });

    &lt;span class="kwrd"&gt;return&lt;/span&gt; originalOwnerInfo;
}


&lt;span class="kwrd"&gt;protected&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; ChangeCurrentUserPermission(SPWeb site, &lt;span class="kwrd"&gt;string&lt;/span&gt; roleDefinitionName)
{
    SPUser curUser = site.CurrentUser;
    &lt;span class="kwrd"&gt;string&lt;/span&gt; curUserName = curUser.LoginName;

    SPRoleDefinition roleDefFull = &lt;span class="kwrd"&gt;null&lt;/span&gt;;         &lt;span class="rem"&gt;// Full control privilege level&lt;/span&gt;
    SPRoleDefinition roleDefContributor = &lt;span class="kwrd"&gt;null&lt;/span&gt;;  &lt;span class="rem"&gt;// Contributor privilege level&lt;/span&gt;
    SPRoleDefinition roleDefLimitedOwner = &lt;span class="kwrd"&gt;null&lt;/span&gt;; &lt;span class="rem"&gt;// Our new privilege level&lt;/span&gt;
            
    &lt;span class="rem"&gt;// Create new role definition&lt;/span&gt;
    &lt;span class="kwrd"&gt;try&lt;/span&gt;
    {
        &lt;span class="rem"&gt;// Get existing role definitions&lt;/span&gt;
        roleDefFull = site.RoleDefinitions[&lt;span class="str"&gt;"Full Control"&lt;/span&gt;];
        roleDefContributor = site.RoleDefinitions[&lt;span class="str"&gt;"Contribute"&lt;/span&gt;];

        &lt;span class="rem"&gt;// Create custom role definition&lt;/span&gt;
        roleDefLimitedOwner = &lt;span class="kwrd"&gt;new&lt;/span&gt; SPRoleDefinition();
        roleDefLimitedOwner.Name = roleDefinitionName;
        roleDefLimitedOwner.Description = &lt;span class="str"&gt;"Permission settings for the owner of this MySite."&lt;/span&gt;;
        site.FirstUniqueRoleDefinitionWeb.RoleDefinitions.Add(roleDefLimitedOwner);
        site.FirstUniqueRoleDefinitionWeb.Update();

        &lt;span class="rem"&gt;// Get the new role definition again... makes sure the Update took all the way or something.&lt;/span&gt;
        roleDefLimitedOwner = site.FirstUniqueRoleDefinitionWeb.RoleDefinitions[roleDefinitionName];

        &lt;span class="rem"&gt;// Set permissions of new role... start from Contributor as base.&lt;/span&gt;
        roleDefLimitedOwner.BasePermissions = roleDefContributor.BasePermissions;
        &lt;span class="rem"&gt;// To ADD a permission, use Bitwise-Or assignment:       permissions |= permission&lt;/span&gt;
        &lt;span class="rem"&gt;// To REMOVE, use Bitwise-And assignment to Complement:  permissions &amp;amp;= ~permission&lt;/span&gt;
        roleDefLimitedOwner.BasePermissions |= SPBasePermissions.CancelCheckout;
        roleDefLimitedOwner.BasePermissions &amp;amp;= ~SPBasePermissions.AddDelPrivateWebParts;
        roleDefLimitedOwner.BasePermissions &amp;amp;= ~SPBasePermissions.UpdatePersonalWebParts;
        roleDefLimitedOwner.Update();
    }
    &lt;span class="kwrd"&gt;catch&lt;/span&gt; (Exception ex)
    {
        Utility.LogMessage(&lt;span class="str"&gt;"Error: can't create new permission group \""&lt;/span&gt; &lt;br /&gt;            + roleDefinitionName + &lt;span class="str"&gt;"\". "&lt;/span&gt; + ex.Message);
    }
            
    &lt;span class="rem"&gt;// Add owner to new role definition&lt;/span&gt;
    &lt;span class="kwrd"&gt;try&lt;/span&gt;
    {
        SPRoleAssignment assignment = &lt;span class="kwrd"&gt;new&lt;/span&gt; SPRoleAssignment(curUser);
        &lt;span class="kwrd"&gt;if&lt;/span&gt; (roleDefLimitedOwner != &lt;span class="kwrd"&gt;null&lt;/span&gt;)
        {
            assignment.RoleDefinitionBindings.Add(roleDefLimitedOwner);
        }
        &lt;span class="kwrd"&gt;else&lt;/span&gt;
        {
            &lt;span class="rem"&gt;//Workaround: for now we just make owner a contributor&lt;/span&gt;
            assignment.RoleDefinitionBindings.Add(roleDefContributor);
        }
        site.RoleAssignments.Add(assignment);
&lt;span class="rem"&gt;        //site.Update();&lt;/span&gt; // Don't need to do this&lt;br /&gt;    }
    &lt;span class="kwrd"&gt;catch&lt;/span&gt; (Exception ex)
    {
        Utility.LogMessage(&lt;span class="str"&gt;"Error: can't add user \""&lt;/span&gt; + curUserName &lt;br /&gt;            + &lt;span class="str"&gt;"\" to new permission group \"" &lt;/span&gt;+ roleDefinitionName + &lt;span class="str"&gt;"\".  "&lt;/span&gt; + ex.Message);
    }

    &lt;span class="rem"&gt;// Remove owner from Full Control&lt;/span&gt;
    &lt;span class="kwrd"&gt;try&lt;/span&gt;
    {
        SPRoleAssignment userRoleAssignment = UserRoleAssignment(site, curUser, roleDefFull);
        &lt;span class="kwrd"&gt;if&lt;/span&gt; (userRoleAssignment != &lt;span class="kwrd"&gt;null&lt;/span&gt;)
        {
            userRoleAssignment.RoleDefinitionBindings.Remove(roleDefFull);
            userRoleAssignment.Update();
        }
        &lt;span class="rem"&gt;//site.Update(); // Don't need to do this&lt;/span&gt;
    }
    &lt;span class="kwrd"&gt;catch&lt;/span&gt; (Exception ex)
    {
        Utility.LogMessage(&lt;span class="str"&gt;"Error: can't remove user \""&lt;/span&gt; + curUserName &lt;br /&gt;            + &lt;span class="str"&gt;"\" from default permission groups.  "&lt;/span&gt; + ex.Message);
    }
}&lt;br /&gt; &lt;br /&gt; &lt;br /&gt;&lt;span class="kwrd"&gt;private&lt;/span&gt; SPRoleAssignment UserRoleAssignment(SPWeb site, SPUser curUser, SPRoleDefinition curRoleDef)
{
    &lt;span class="kwrd"&gt;foreach&lt;/span&gt; (SPRoleAssignment roleAssignment &lt;span class="kwrd"&gt;in&lt;/span&gt; site.RoleAssignments)
    {
        &lt;span class="kwrd"&gt;if&lt;/span&gt; (roleAssignment.Member.ID == curUser.ID)
        {
            &lt;span class="kwrd"&gt;foreach&lt;/span&gt; (SPRoleDefinition roleDefinition &lt;span class="kwrd"&gt;in&lt;/span&gt; roleAssignment.RoleDefinitionBindings)
            {
                &lt;span class="kwrd"&gt;if&lt;/span&gt; (roleDefinition.Id == curRoleDef.Id)
                {
                    &lt;span class="kwrd"&gt;return&lt;/span&gt; roleAssignment;
                }
            }
        }
    }
    &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;null&lt;/span&gt;;
}


&lt;span class="kwrd"&gt;protected&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; StoreValueInSiteProperty(SPWeb site, &lt;span class="kwrd"&gt;string&lt;/span&gt; propertyName, &lt;span class="kwrd"&gt;string&lt;/span&gt; propertyValue)
{
    &lt;span class="kwrd"&gt;if&lt;/span&gt; (site.Properties.ContainsKey(propertyName))
        site.Properties[propertyName] = propertyValue;
    &lt;span class="kwrd"&gt;else&lt;/span&gt;
        site.Properties.Add(propertyName, propertyValue);
    site.Properties.Update();
}


&lt;span class="kwrd"&gt;protected&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; SetSiteTitle(SPWeb site, &lt;span class="kwrd"&gt;string&lt;/span&gt; title)
{
    &lt;span class="kwrd"&gt;try&lt;/span&gt;
    {
        site.Title = title;
        &lt;span class="rem"&gt;//site.Update(); // Don't need to do this&lt;/span&gt;
    }
    &lt;span class="kwrd"&gt;catch&lt;/span&gt; (Exception ex)
    {
        Utility.LogMessage(&lt;span class="str"&gt;"Error: can't set site title to \""&lt;/span&gt; + title + &lt;span class="str"&gt;"\".  "&lt;/span&gt; + ex.Message);
    }
}
 &lt;/pre&gt;
&lt;div class="wlWriterSmartContent" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:ee094114-a2a2-48b8-893a-c059149ed214" style="PADDING-RIGHT: 0px; DISPLAY: inline; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px"&gt;Technorati Tags: &lt;a rel="tag" href="http://technorati.com/tags/MySite"&gt;MySite&lt;/a&gt;,&lt;a rel="tag" href="http://technorati.com/tags/SharePoint%20Security"&gt;SharePoint Security&lt;/a&gt;,&lt;a rel="tag" href="http://technorati.com/tags/SharePoint%20Development"&gt;SharePoint Development&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8374056" width="1" height="1"&gt;&lt;img src="http://feeds.feedburner.com/~r/MarkArendSharePoint/~4/IzrXtGrbcj8" height="1" width="1"/&gt;</description><category domain="http://blogs.msdn.com/b/markarend/archive/tags/SharePoint/">SharePoint</category><category domain="http://blogs.msdn.com/b/markarend/archive/tags/Development/">Development</category><category domain="http://blogs.msdn.com/b/markarend/archive/tags/Security/">Security</category><category domain="http://blogs.msdn.com/b/markarend/archive/tags/2007/">2007</category><category domain="http://blogs.msdn.com/b/markarend/archive/tags/My+Sites/">My Sites</category></item><item><title>New Design and Build Guide for MOSS 2007</title><link>http://blogs.msdn.com/b/markarend/archive/2008/03/12/new-design-and-build-guide-for-moss-2007.aspx</link><pubDate>Wed, 12 Mar 2008 21:36:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8172241</guid><dc:creator>Mark Arend</dc:creator><slash:comments>1</slash:comments><wfw:commentRss>http://blogs.msdn.com/b/markarend/rsscomments.aspx?WeblogPostID=8172241</wfw:commentRss><comments>http://blogs.msdn.com/b/markarend/archive/2008/03/12/new-design-and-build-guide-for-moss-2007.aspx#comments</comments><description>&lt;p&gt;&lt;em&gt;&lt;span style="color: #0000ff;"&gt;&lt;span style="font-size: small;"&gt;This blog posting applies to Microsoft Office SharePoint Server 2007.&lt;/span&gt;&lt;/span&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;This is a topic near and dear to my heart.&amp;nbsp; I've spent many hours helping customers plan and execute a wide range of customizations for MOSS 2007.&amp;nbsp; &lt;/p&gt;
&lt;p&gt;Now, the &lt;strong&gt;ECM Team &lt;/strong&gt;(Enterprise Content Management) has published an exhaustive paper on these topics.&amp;nbsp; At least, I was exhausted reading it!&amp;nbsp; No, really, it's a great guide and covers so many areas that normally don't even get touched on.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Download: &lt;/em&gt;&lt;a href="http://go.microsoft.com/fwlink/?LinkId=110087" title="Downloadable version of Design and Build Guide for MOSS 2007"&gt;http://go.microsoft.com/fwlink/?LinkId=110087&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Announcement and request for feedback: &lt;br /&gt;&lt;/em&gt;&lt;a href="http://blogs.msdn.com/ecm/archive/2008/03/11/announcing-design-and-build-sites-for-office-sharepoint-server-2007.aspx" title="http://blogs.msdn.com/ecm/archive/2008/03/11/announcing-design-and-build-sites-for-office-sharepoint-server-2007.aspx"&gt;http://blogs.msdn.com/ecm/archive/2008/03/11/announcing-design-and-build-sites-for-office-sharepoint-server-2007.aspx&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span style="color: #800000;"&gt;Topics&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://technet.microsoft.com/en-us/library/cc263463.aspx"&gt;Customization approaches&lt;/a&gt; (Basic, Intermediate, Advanced - Author centric, Advanced - Developer centric) &lt;/li&gt;
&lt;li&gt;&lt;a href="http://technet.microsoft.com/en-us/library/cc263118.aspx"&gt;Site Elements&lt;/a&gt; (Authored elements, Developed elements) &lt;/li&gt;
&lt;li&gt;&lt;a href="http://technet.microsoft.com/en-us/library/cc263209.aspx"&gt;Environments&lt;/a&gt; (Dev, Config mgt, Integration, Authoring, Pilot, Production) &lt;/li&gt;
&lt;li&gt;&lt;a href="http://technet.microsoft.com/en-us/library/cc262576.aspx"&gt;Tools &amp;amp; Processes&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;&lt;a href="http://technet.microsoft.com/en-us/library/cc262247.aspx"&gt;Development team roles&lt;/a&gt; (Architect, Developer, Designer, Author, Tester, Admin) &lt;/li&gt;
&lt;li&gt;&lt;a href="http://technet.microsoft.com/en-us/library/cc262251.aspx"&gt;Customization Scenarios&lt;/a&gt; (Corporate extranet, Enterprise internet) &lt;/li&gt;
&lt;li&gt;&lt;a href="http://technet.microsoft.com/en-us/library/cc262956.aspx"&gt;Upgrading&lt;/a&gt; from SPS 2003 to MOSS 2007 (addressing customizations) &lt;/li&gt;
&lt;li&gt;Upgrading from &lt;a href="http://technet.microsoft.com/en-us/library/cc263390.aspx"&gt;CMS 2002&lt;/a&gt; to MOSS 2007 (pointers to resources)&lt;/li&gt;
&lt;li&gt;&lt;a href="http://technet.microsoft.com/en-us/library/cc263205.aspx"&gt;Deployment&lt;/a&gt; (Authored, Developed) &lt;/li&gt;
&lt;li&gt;Solution packages &lt;/li&gt;
&lt;li&gt;&lt;a href="http://technet.microsoft.com/en-us/library/cc263360.aspx"&gt;Roadmaps&lt;/a&gt; (Sites &amp;amp; Subsites, Page design, Document mgt, InfoPath, Workflows, BI, Records mgt) &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This is a tremendously valuable resource, go get it!&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:428fa0bf-c06b-4650-b054-e69ee6072789" style="padding-right: 0px; display: inline; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;Technorati Tags: &lt;a rel="tag" href="http://technorati.com/tags/Development"&gt;Development&lt;/a&gt;,&lt;a rel="tag" href="http://technorati.com/tags/MOSS%202007"&gt;MOSS 2007&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8172241" width="1" height="1"&gt;&lt;img src="http://feeds.feedburner.com/~r/MarkArendSharePoint/~4/qtusYY6H8Rw" height="1" width="1"/&gt;</description><category domain="http://blogs.msdn.com/b/markarend/archive/tags/SharePoint/">SharePoint</category><category domain="http://blogs.msdn.com/b/markarend/archive/tags/Development/">Development</category><category domain="http://blogs.msdn.com/b/markarend/archive/tags/2007/">2007</category></item><item><title>Test With Correct Privileges</title><link>http://blogs.msdn.com/b/markarend/archive/2008/03/06/test-with-correct-privileges.aspx</link><pubDate>Fri, 07 Mar 2008 00:12:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8078784</guid><dc:creator>Mark Arend</dc:creator><slash:comments>1</slash:comments><wfw:commentRss>http://blogs.msdn.com/b/markarend/rsscomments.aspx?WeblogPostID=8078784</wfw:commentRss><comments>http://blogs.msdn.com/b/markarend/archive/2008/03/06/test-with-correct-privileges.aspx#comments</comments><description>&lt;p&gt;When developing web parts and other components with code, it's important to remember that operations performed by code may require certain privileges.&amp;nbsp; During development, the code runs in the security context of the developer, who is usually a server administrator.&amp;nbsp; This means all operations are permitted, so access problems don't arise.&amp;nbsp; During testing and production, however, the security context of the code may be different because it's being invoked by testers and end-users.&lt;/p&gt;
&lt;p&gt;Therefore, all components should be tested with several end-user accounts: one would be the developer&amp;rsquo;s account which is usually a server admin; that&amp;rsquo;s how most people do their unit testing. But tests should also be made with an account of minimal privilege, say Visitor.&amp;nbsp; Some components might be doing things with the object model that will only work when an administrator invokes it. If this turns out to be the case, a technique called &amp;ldquo;elevation of privilege&amp;rdquo; can be used to overcome it.&amp;nbsp; See MSDN article &lt;a target="_blank" href="http://msdn2.microsoft.com/en-us/library/bb466220.aspx" title="Article by Ted Pattison Group"&gt;Running Commands with Elevated Privileges in Windows SharePoint Services 3.0&lt;/a&gt; for an explanation of doing this.&lt;/p&gt;
&lt;p&gt;What code needs to be tested using different privileges? &lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;1. Code that's invoked as the result of an end-user action. An example is a custom web part that is displayed on a page. The end-user opens the page and this is what invokes the web part code under the user's security context. A counter-example is timer job code that is invoked by SharePoint.&lt;/p&gt;
&lt;p&gt;2. Code that uses the SharePoint API. This is typically where security errors arise. If a component does not use the SharePoint API, then chances are it will not need to elevate its privilege. To be entirely sure, it should be tested at minimum privilege, but this criterion can be used to prioritize testing of other components higher.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;How can a developer test with different accounts?&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The simplest approach is to create three accounts "Test Visitor," "Test Member," and "Test Owner" in Active Directory and then to add these accounts to matching groups on the test sites.&lt;/p&gt;
&lt;p&gt;First, the developer must decide in what security contexts the component is supposed to work. For example, most end-user web parts should work for users signed on as Test Visitor. On the other hand, an stsadm extension is only invoked by a server admin and should not be tested with a minimum privilege account.&lt;/p&gt;
&lt;p&gt;"Sign on as different user" can be used to choose one of the test accounts as appropriate; however, in some cases, this approach does not seem to &amp;ldquo;stick&amp;rdquo; based on browser state or browsing behavior (e.g. browsing to My Site when browser is configured for automatic logon). The best way to ensure that the desired account is used is to configure the browser to always prompt for credentials, then to open a new browser window to begin testing. Then, re-run all unit tests that exercise the component directly (not, say, the deployment of the component).&lt;/p&gt;
&lt;/blockquote&gt;
&lt;div class="wlWriterSmartContent" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:9087756e-a110-4edd-baa3-5f9e1bf807da" style="padding-right: 0px; display: inline; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;Technorati Tags: &lt;a rel="tag" href="http://technorati.com/tags/Minimum%20privilege"&gt;Minimum privilege&lt;/a&gt;,&lt;a rel="tag" href="http://technorati.com/tags/Web%20part%20security"&gt;Web part security&lt;/a&gt;,&lt;a rel="tag" href="http://technorati.com/tags/Code%20Access%20Security"&gt;Code Access Security&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8078784" width="1" height="1"&gt;&lt;img src="http://feeds.feedburner.com/~r/MarkArendSharePoint/~4/XvNmVQFC8v0" height="1" width="1"/&gt;</description><category domain="http://blogs.msdn.com/b/markarend/archive/tags/SharePoint/">SharePoint</category><category domain="http://blogs.msdn.com/b/markarend/archive/tags/Development/">Development</category><category domain="http://blogs.msdn.com/b/markarend/archive/tags/Security/">Security</category><category domain="http://blogs.msdn.com/b/markarend/archive/tags/2010/">2010</category><category domain="http://blogs.msdn.com/b/markarend/archive/tags/2007/">2007</category></item><item><title>Virtual PC and Virtual Server</title><link>http://blogs.msdn.com/b/markarend/archive/2008/03/04/virtual-pc-and-virtual-server.aspx</link><pubDate>Wed, 05 Mar 2008 04:58:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8040873</guid><dc:creator>Mark Arend</dc:creator><slash:comments>3</slash:comments><wfw:commentRss>http://blogs.msdn.com/b/markarend/rsscomments.aspx?WeblogPostID=8040873</wfw:commentRss><comments>http://blogs.msdn.com/b/markarend/archive/2008/03/04/virtual-pc-and-virtual-server.aspx#comments</comments><description>&lt;P&gt;Wait.. A posting &lt;I&gt;not&lt;/I&gt; about SharePoint? How can this be? Well, it's somewhat &lt;I&gt;related&lt;/I&gt; to SharePoint, since so many people use Virtual PC to host a development SharePoint environment. Since SharePoint requires Windows Server 2003, that's the best choice for us laptop users. Anyway, this is just a quick comparison between some points of these two products.&lt;/P&gt;
&lt;P&gt;
&lt;TABLE class=MsoTableLightListAccent1 style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; BORDER-LEFT: medium none; BORDER-BOTTOM: medium none; BORDER-COLLAPSE: collapse; mso-border-alt: solid #4F81BD 1.0pt; mso-border-themecolor: accent1; mso-yfti-tbllook: 1056; mso-padding-alt: 0in 5.4pt 0in 5.4pt" cellSpacing=0 cellPadding=0 border=1 class="MsoTableLightListAccent1"&gt;
&lt;TBODY&gt;
&lt;TR style="mso-yfti-irow: -1; mso-yfti-firstrow: yes"&gt;
&lt;TD class="" style="BORDER-RIGHT: #f0f0f0; PADDING-RIGHT: 5.4pt; BORDER-TOP: #4f81bd 1pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #4f81bd; PADDING-BOTTOM: 0in; BORDER-LEFT: #4f81bd 1pt solid; WIDTH: 286.5pt; PADDING-TOP: 0in; BORDER-BOTTOM: #f0f0f0; mso-background-themecolor: accent1; mso-border-top-themecolor: accent1; mso-border-left-themecolor: accent1" vAlign=top width=382&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-yfti-cnfc: 1"&gt;&lt;SPAN style="COLOR: white; mso-bidi-font-family: 'Times New Roman'; mso-fareast-font-family: 'Times New Roman'; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri; mso-themecolor: background1"&gt;&lt;FONT size=3&gt;&lt;FONT face=Calibri&gt;Feature&lt;?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" style="BORDER-RIGHT: #f0f0f0; PADDING-RIGHT: 5.4pt; BORDER-TOP: #4f81bd 1pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #4f81bd; PADDING-BOTTOM: 0in; BORDER-LEFT: #f0f0f0; WIDTH: 48pt; PADDING-TOP: 0in; BORDER-BOTTOM: #f0f0f0; mso-background-themecolor: accent1; mso-border-top-themecolor: accent1" vAlign=top width=64&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-yfti-cnfc: 1"&gt;&lt;SPAN style="COLOR: white; mso-bidi-font-family: 'Times New Roman'; mso-fareast-font-family: 'Times New Roman'; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri; mso-themecolor: background1"&gt;&lt;FONT size=3&gt;&lt;FONT face=Calibri&gt;VPC&lt;o:p&gt;&lt;/o:p&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" style="BORDER-RIGHT: #4f81bd 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #4f81bd 1pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #4f81bd; PADDING-BOTTOM: 0in; BORDER-LEFT: #f0f0f0; WIDTH: 81.3pt; PADDING-TOP: 0in; BORDER-BOTTOM: #f0f0f0; mso-background-themecolor: accent1; mso-border-top-themecolor: accent1; mso-border-right-themecolor: accent1" vAlign=top width=108&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-yfti-cnfc: 1"&gt;&lt;SPAN style="COLOR: white; mso-bidi-font-family: 'Times New Roman'; mso-fareast-font-family: 'Times New Roman'; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri; mso-themecolor: background1"&gt;&lt;FONT size=3&gt;&lt;FONT face=Calibri&gt;Virtual Server&lt;o:p&gt;&lt;/o:p&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR style="mso-yfti-irow: 0"&gt;
&lt;TD class="" style="BORDER-RIGHT: #f0f0f0; PADDING-RIGHT: 5.4pt; BORDER-TOP: #4f81bd 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0in; BORDER-LEFT: #4f81bd 1pt solid; WIDTH: 286.5pt; PADDING-TOP: 0in; BORDER-BOTTOM: #4f81bd 1pt solid; BACKGROUND-COLOR: transparent; mso-border-themecolor: accent1" vAlign=top width=382&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-yfti-cnfc: 64"&gt;&lt;SPAN style="mso-bidi-font-family: 'Times New Roman'; mso-fareast-font-family: 'Times New Roman'; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri"&gt;&lt;FONT size=3&gt;&lt;FONT face=Calibri&gt;Shared Folders?&lt;o:p&gt;&lt;/o:p&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" style="BORDER-RIGHT: #f0f0f0; PADDING-RIGHT: 5.4pt; BORDER-TOP: #4f81bd 1pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #92d050; PADDING-BOTTOM: 0in; BORDER-LEFT: #f0f0f0; WIDTH: 48pt; PADDING-TOP: 0in; BORDER-BOTTOM: #4f81bd 1pt solid; mso-border-bottom-themecolor: accent1; mso-border-top-themecolor: accent1" vAlign=top width=64&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-yfti-cnfc: 64"&gt;&lt;SPAN style="mso-bidi-font-family: 'Times New Roman'; mso-fareast-font-family: 'Times New Roman'; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri"&gt;&lt;FONT size=3&gt;&lt;FONT face=Calibri&gt;Yes&lt;o:p&gt;&lt;/o:p&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" style="BORDER-RIGHT: #4f81bd 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #4f81bd 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0in; BORDER-LEFT: #f0f0f0; WIDTH: 81.3pt; PADDING-TOP: 0in; BORDER-BOTTOM: #4f81bd 1pt solid; BACKGROUND-COLOR: transparent; mso-border-themecolor: accent1" vAlign=top width=108&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-yfti-cnfc: 64"&gt;&lt;SPAN style="mso-bidi-font-family: 'Times New Roman'; mso-fareast-font-family: 'Times New Roman'; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri"&gt;&lt;FONT size=3&gt;&lt;FONT face=Calibri&gt;No&lt;o:p&gt;&lt;/o:p&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR style="mso-yfti-irow: 1"&gt;
&lt;TD class="" style="BORDER-RIGHT: #f0f0f0; PADDING-RIGHT: 5.4pt; BORDER-TOP: #f0f0f0; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0in; BORDER-LEFT: #4f81bd 1pt solid; WIDTH: 286.5pt; PADDING-TOP: 0in; BORDER-BOTTOM: #f0f0f0; BACKGROUND-COLOR: transparent; mso-border-left-themecolor: accent1" vAlign=top width=382&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal"&gt;&lt;SPAN style="mso-bidi-font-family: 'Times New Roman'; mso-fareast-font-family: 'Times New Roman'; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri"&gt;&lt;FONT size=3&gt;&lt;FONT face=Calibri&gt;Copy-n-paste?&lt;o:p&gt;&lt;/o:p&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" style="BORDER-RIGHT: #f0f0f0; PADDING-RIGHT: 5.4pt; BORDER-TOP: #f0f0f0; PADDING-LEFT: 5.4pt; BACKGROUND: #92d050; PADDING-BOTTOM: 0in; BORDER-LEFT: #f0f0f0; WIDTH: 48pt; PADDING-TOP: 0in; BORDER-BOTTOM: #f0f0f0" vAlign=top width=64&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal"&gt;&lt;SPAN style="mso-bidi-font-family: 'Times New Roman'; mso-fareast-font-family: 'Times New Roman'; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri"&gt;&lt;FONT size=3&gt;&lt;FONT face=Calibri&gt;Yes&lt;o:p&gt;&lt;/o:p&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" style="BORDER-RIGHT: #4f81bd 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #f0f0f0; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0in; BORDER-LEFT: #f0f0f0; WIDTH: 81.3pt; PADDING-TOP: 0in; BORDER-BOTTOM: #f0f0f0; BACKGROUND-COLOR: transparent; mso-border-right-themecolor: accent1" vAlign=top width=108&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal"&gt;&lt;SPAN style="mso-bidi-font-family: 'Times New Roman'; mso-fareast-font-family: 'Times New Roman'; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri"&gt;&lt;FONT size=3&gt;&lt;FONT face=Calibri&gt;No&lt;o:p&gt;&lt;/o:p&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR style="mso-yfti-irow: 2"&gt;
&lt;TD class="" style="BORDER-RIGHT: #f0f0f0; PADDING-RIGHT: 5.4pt; BORDER-TOP: #4f81bd 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0in; BORDER-LEFT: #4f81bd 1pt solid; WIDTH: 286.5pt; PADDING-TOP: 0in; BORDER-BOTTOM: #4f81bd 1pt solid; BACKGROUND-COLOR: transparent; mso-border-themecolor: accent1" vAlign=top width=382&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-yfti-cnfc: 64"&gt;&lt;SPAN style="mso-bidi-font-family: 'Times New Roman'; mso-fareast-font-family: 'Times New Roman'; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri"&gt;&lt;FONT size=3&gt;&lt;FONT face=Calibri&gt;Drag-n-drop?&lt;o:p&gt;&lt;/o:p&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" style="BORDER-RIGHT: #f0f0f0; PADDING-RIGHT: 5.4pt; BORDER-TOP: #4f81bd 1pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #92d050; PADDING-BOTTOM: 0in; BORDER-LEFT: #f0f0f0; WIDTH: 48pt; PADDING-TOP: 0in; BORDER-BOTTOM: #4f81bd 1pt solid; mso-border-bottom-themecolor: accent1; mso-border-top-themecolor: accent1" vAlign=top width=64&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-yfti-cnfc: 64"&gt;&lt;SPAN style="mso-bidi-font-family: 'Times New Roman'; mso-fareast-font-family: 'Times New Roman'; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri"&gt;&lt;FONT size=3&gt;&lt;FONT face=Calibri&gt;Yes&lt;o:p&gt;&lt;/o:p&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" style="BORDER-RIGHT: #4f81bd 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #4f81bd 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0in; BORDER-LEFT: #f0f0f0; WIDTH: 81.3pt; PADDING-TOP: 0in; BORDER-BOTTOM: #4f81bd 1pt solid; BACKGROUND-COLOR: transparent; mso-border-themecolor: accent1" vAlign=top width=108&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-yfti-cnfc: 64"&gt;&lt;SPAN style="mso-bidi-font-family: 'Times New Roman'; mso-fareast-font-family: 'Times New Roman'; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri"&gt;&lt;FONT size=3&gt;&lt;FONT face=Calibri&gt;No&lt;o:p&gt;&lt;/o:p&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR style="mso-yfti-irow: 3"&gt;
&lt;TD class="" style="BORDER-RIGHT: #f0f0f0; PADDING-RIGHT: 5.4pt; BORDER-TOP: #f0f0f0; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0in; BORDER-LEFT: #4f81bd 1pt solid; WIDTH: 286.5pt; PADDING-TOP: 0in; BORDER-BOTTOM: #f0f0f0; BACKGROUND-COLOR: transparent; mso-border-left-themecolor: accent1" vAlign=top width=382&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal"&gt;&lt;SPAN style="mso-bidi-font-family: 'Times New Roman'; mso-fareast-font-family: 'Times New Roman'; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri"&gt;&lt;FONT size=3&gt;&lt;FONT face=Calibri&gt;Map a virtual NIC to a wireless physical connection?&lt;o:p&gt;&lt;/o:p&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" style="BORDER-RIGHT: #f0f0f0; PADDING-RIGHT: 5.4pt; BORDER-TOP: #f0f0f0; PADDING-LEFT: 5.4pt; BACKGROUND: #92d050; PADDING-BOTTOM: 0in; BORDER-LEFT: #f0f0f0; WIDTH: 48pt; PADDING-TOP: 0in; BORDER-BOTTOM: #f0f0f0" vAlign=top width=64&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal"&gt;&lt;SPAN style="mso-bidi-font-family: 'Times New Roman'; mso-fareast-font-family: 'Times New Roman'; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri"&gt;&lt;FONT size=3&gt;&lt;FONT face=Calibri&gt;Yes&lt;o:p&gt;&lt;/o:p&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" style="BORDER-RIGHT: #4f81bd 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #f0f0f0; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0in; BORDER-LEFT: #f0f0f0; WIDTH: 81.3pt; PADDING-TOP: 0in; BORDER-BOTTOM: #f0f0f0; BACKGROUND-COLOR: transparent; mso-border-right-themecolor: accent1" vAlign=top width=108&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal"&gt;&lt;SPAN style="mso-bidi-font-family: 'Times New Roman'; mso-fareast-font-family: 'Times New Roman'; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri"&gt;&lt;FONT size=3&gt;&lt;FONT face=Calibri&gt;No&lt;o:p&gt;&lt;/o:p&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR style="mso-yfti-irow: 4"&gt;
&lt;TD class="" style="BORDER-RIGHT: #f0f0f0; PADDING-RIGHT: 5.4pt; BORDER-TOP: #4f81bd 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0in; BORDER-LEFT: #4f81bd 1pt solid; WIDTH: 286.5pt; PADDING-TOP: 0in; BORDER-BOTTOM: #4f81bd 1pt solid; BACKGROUND-COLOR: transparent; mso-border-themecolor: accent1" vAlign=top width=382&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-yfti-cnfc: 64"&gt;&lt;SPAN style="mso-bidi-font-family: 'Times New Roman'; mso-fareast-font-family: 'Times New Roman'; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri"&gt;&lt;FONT size=3&gt;&lt;FONT face=Calibri&gt;Compact disk image to a separate location?&lt;o:p&gt;&lt;/o:p&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" style="BORDER-RIGHT: #f0f0f0; PADDING-RIGHT: 5.4pt; BORDER-TOP: #4f81bd 1pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #92d050; PADDING-BOTTOM: 0in; BORDER-LEFT: #f0f0f0; WIDTH: 48pt; PADDING-TOP: 0in; BORDER-BOTTOM: #4f81bd 1pt solid; mso-border-bottom-themecolor: accent1; mso-border-top-themecolor: accent1" vAlign=top width=64&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-yfti-cnfc: 64"&gt;&lt;SPAN style="mso-bidi-font-family: 'Times New Roman'; mso-fareast-font-family: 'Times New Roman'; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri"&gt;&lt;FONT size=3&gt;&lt;FONT face=Calibri&gt;Yes&lt;o:p&gt;&lt;/o:p&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" style="BORDER-RIGHT: #4f81bd 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #4f81bd 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0in; BORDER-LEFT: #f0f0f0; WIDTH: 81.3pt; PADDING-TOP: 0in; BORDER-BOTTOM: #4f81bd 1pt solid; BACKGROUND-COLOR: transparent; mso-border-themecolor: accent1" vAlign=top width=108&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-yfti-cnfc: 64"&gt;&lt;SPAN style="mso-bidi-font-family: 'Times New Roman'; mso-fareast-font-family: 'Times New Roman'; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri"&gt;&lt;FONT size=3&gt;&lt;FONT face=Calibri&gt;No&lt;o:p&gt;&lt;/o:p&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR style="mso-yfti-irow: 5"&gt;
&lt;TD class="" style="BORDER-RIGHT: #f0f0f0; PADDING-RIGHT: 5.4pt; BORDER-TOP: #f0f0f0; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0in; BORDER-LEFT: #4f81bd 1pt solid; WIDTH: 286.5pt; PADDING-TOP: 0in; BORDER-BOTTOM: #f0f0f0; BACKGROUND-COLOR: transparent; mso-border-left-themecolor: accent1" vAlign=top width=382&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal"&gt;&lt;SPAN style="mso-bidi-font-family: 'Times New Roman'; mso-fareast-font-family: 'Times New Roman'; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri"&gt;&lt;FONT size=3&gt;&lt;FONT face=Calibri&gt;Management tools for multiple guest OS?&lt;o:p&gt;&lt;/o:p&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" style="BORDER-RIGHT: #f0f0f0; PADDING-RIGHT: 5.4pt; BORDER-TOP: #f0f0f0; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0in; BORDER-LEFT: #f0f0f0; WIDTH: 48pt; PADDING-TOP: 0in; BORDER-BOTTOM: #f0f0f0; BACKGROUND-COLOR: transparent" vAlign=top width=64&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal"&gt;&lt;SPAN style="mso-bidi-font-family: 'Times New Roman'; mso-fareast-font-family: 'Times New Roman'; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri"&gt;&lt;FONT size=3&gt;&lt;FONT face=Calibri&gt;No&lt;o:p&gt;&lt;/o:p&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" style="BORDER-RIGHT: #4f81bd 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #f0f0f0; PADDING-LEFT: 5.4pt; BACKGROUND: #92d050; PADDING-BOTTOM: 0in; BORDER-LEFT: #f0f0f0; WIDTH: 81.3pt; PADDING-TOP: 0in; BORDER-BOTTOM: #f0f0f0; mso-border-right-themecolor: accent1" vAlign=top width=108&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal"&gt;&lt;SPAN style="mso-bidi-font-family: 'Times New Roman'; mso-fareast-font-family: 'Times New Roman'; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri"&gt;&lt;FONT size=3&gt;&lt;FONT face=Calibri&gt;Yes&lt;o:p&gt;&lt;/o:p&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR style="mso-yfti-irow: 6"&gt;
&lt;TD class="" style="BORDER-RIGHT: #f0f0f0; PADDING-RIGHT: 5.4pt; BORDER-TOP: #4f81bd 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0in; BORDER-LEFT: #4f81bd 1pt solid; WIDTH: 286.5pt; PADDING-TOP: 0in; BORDER-BOTTOM: #4f81bd 1pt solid; BACKGROUND-COLOR: transparent; mso-border-themecolor: accent1" vAlign=top width=382&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-yfti-cnfc: 64"&gt;&lt;SPAN style="mso-bidi-font-family: 'Times New Roman'; mso-fareast-font-family: 'Times New Roman'; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri"&gt;&lt;FONT size=3&gt;&lt;FONT face=Calibri&gt;Performance&lt;o:p&gt;&lt;/o:p&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" style="BORDER-RIGHT: #f0f0f0; PADDING-RIGHT: 5.4pt; BORDER-TOP: #4f81bd 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0in; BORDER-LEFT: #f0f0f0; WIDTH: 48pt; PADDING-TOP: 0in; BORDER-BOTTOM: #4f81bd 1pt solid; BACKGROUND-COLOR: transparent; mso-border-bottom-themecolor: accent1; mso-border-top-themecolor: accent1" vAlign=top width=64&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-yfti-cnfc: 64"&gt;&lt;SPAN style="mso-bidi-font-family: 'Times New Roman'; mso-fareast-font-family: 'Times New Roman'; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri"&gt;&lt;FONT size=3&gt;&lt;FONT face=Calibri&gt;Great*&lt;o:p&gt;&lt;/o:p&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" style="BORDER-RIGHT: #4f81bd 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #4f81bd 1pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #92d050; PADDING-BOTTOM: 0in; BORDER-LEFT: #f0f0f0; WIDTH: 81.3pt; PADDING-TOP: 0in; BORDER-BOTTOM: #4f81bd 1pt solid; mso-border-themecolor: accent1" vAlign=top width=108&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-yfti-cnfc: 64"&gt;&lt;SPAN style="mso-bidi-font-family: 'Times New Roman'; mso-fareast-font-family: 'Times New Roman'; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri"&gt;&lt;FONT size=3&gt;&lt;FONT face=Calibri&gt;Great*+1&lt;o:p&gt;&lt;/o:p&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR style="mso-yfti-irow: 7; mso-yfti-lastrow: yes"&gt;
&lt;TD class="" style="BORDER-RIGHT: #f0f0f0; PADDING-RIGHT: 5.4pt; BORDER-TOP: #f0f0f0; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0in; BORDER-LEFT: #4f81bd 1pt solid; WIDTH: 286.5pt; PADDING-TOP: 0in; BORDER-BOTTOM: #4f81bd 1pt solid; BACKGROUND-COLOR: transparent; mso-border-bottom-themecolor: accent1; mso-border-left-themecolor: accent1" vAlign=top width=382&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal"&gt;&lt;SPAN style="mso-bidi-font-family: 'Times New Roman'; mso-fareast-font-family: 'Times New Roman'; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri"&gt;&lt;FONT size=3&gt;&lt;FONT face=Calibri&gt;Runs&amp;nbsp;as Windows Service&lt;BR&gt;(can auto-restart after host restart)&lt;o:p&gt;&lt;/o:p&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" style="BORDER-RIGHT: #f0f0f0; PADDING-RIGHT: 5.4pt; BORDER-TOP: #f0f0f0; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0in; BORDER-LEFT: #f0f0f0; WIDTH: 48pt; PADDING-TOP: 0in; BORDER-BOTTOM: #4f81bd 1pt solid; BACKGROUND-COLOR: transparent; mso-border-bottom-themecolor: accent1" vAlign=top width=64&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal"&gt;&lt;SPAN style="mso-bidi-font-family: 'Times New Roman'; mso-fareast-font-family: 'Times New Roman'; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri"&gt;&lt;FONT size=3&gt;&lt;FONT face=Calibri&gt;No&lt;o:p&gt;&lt;/o:p&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" style="BORDER-RIGHT: #4f81bd 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #f0f0f0; PADDING-LEFT: 5.4pt; BACKGROUND: #92d050; PADDING-BOTTOM: 0in; BORDER-LEFT: #f0f0f0; WIDTH: 81.3pt; PADDING-TOP: 0in; BORDER-BOTTOM: #4f81bd 1pt solid; mso-border-bottom-themecolor: accent1; mso-border-right-themecolor: accent1" vAlign=top width=108&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal"&gt;&lt;SPAN style="mso-bidi-font-family: 'Times New Roman'; mso-fareast-font-family: 'Times New Roman'; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri"&gt;&lt;FONT size=3&gt;&lt;FONT face=Calibri&gt;Yes&lt;o:p&gt;&lt;/o:p&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;/P&gt;
&lt;P&gt;*Performance really can be very good, on two conditions: enough physical RAM on your host (2GB will do, but 4GB is much better), and putting the virtual hard drive on a physical drive other than the one holding the host OS.&amp;nbsp; On a laptop, a USB 2.0 external drive works very well.&amp;nbsp; Be sure to "safely remove..." the USB drive before unplugging it.&lt;/P&gt;
&lt;P&gt;Bottom line: if your host is a laptop or desktop, use VPC. If your host is a server in the datacenter, use Virtual Server. &lt;/P&gt;
&lt;P&gt;Sometimes people ask me about &lt;STRONG&gt;VMWare's&lt;/STRONG&gt; products. Well, I don't run them so I can't say, but Andrew Connell has a good &lt;A href="http://andrewconnell.com/blog/archive/2007/09/30/6124.aspx" mce_href="http://andrewconnell.com/blog/archive/2007/09/30/6124.aspx"&gt;blog posting&lt;/A&gt; examining some of the differences, especially related to how we use them as SharePoint developers, consultants and trainers.&lt;/P&gt;
&lt;DIV class=wlWriterSmartContent id=scid:0767317B-992E-4b12-91E0-4F059A8CECA8:02b78634-723c-4971-9323-eeca120e58cf style="PADDING-RIGHT: 0px; DISPLAY: inline; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px"&gt;Technorati Tags: &lt;A href="http://technorati.com/tags/Virtual%20PC" rel=tag mce_href="http://technorati.com/tags/Virtual%20PC"&gt;Virtual PC&lt;/A&gt;,&lt;A href="http://technorati.com/tags/Virtual%20Server" rel=tag mce_href="http://technorati.com/tags/Virtual%20Server"&gt;Virtual Server&lt;/A&gt;&lt;/DIV&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8040873" width="1" height="1"&gt;&lt;img src="http://feeds.feedburner.com/~r/MarkArendSharePoint/~4/HPaE7KUxpno" height="1" width="1"/&gt;</description><category domain="http://blogs.msdn.com/b/markarend/archive/tags/Virtual+PC/">Virtual PC</category></item><item><title>Using Reflector to See SharePoint's "Source" Code</title><link>http://blogs.msdn.com/b/markarend/archive/2008/02/28/using-reflector-to-see-sharepoint-s-source-code.aspx</link><pubDate>Fri, 29 Feb 2008 00:49:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:7937568</guid><dc:creator>Mark Arend</dc:creator><slash:comments>1</slash:comments><wfw:commentRss>http://blogs.msdn.com/b/markarend/rsscomments.aspx?WeblogPostID=7937568</wfw:commentRss><comments>http://blogs.msdn.com/b/markarend/archive/2008/02/28/using-reflector-to-see-sharepoint-s-source-code.aspx#comments</comments><description>&lt;P style="MARGIN: 0in 0in 0pt" class=MsoNormal&gt;&lt;FONT size=3 face=Calibri&gt;&lt;FONT color=red&gt;Important Note:&lt;/FONT&gt; Customers are advised to review the end user license agreement (EULA) for the relevant Microsoft products before using this tool.&amp;nbsp; This blog entry does not authorize or endorse any use of Microsoft products that is not addressed specifically by&amp;nbsp;the product's EULA.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;Do you sometimes use a "reflector" program to examine SharePoint source code? This can be necessary to:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Understand out how SharePoint is doing something, to find what elements can be customized. &lt;/LI&gt;
&lt;LI&gt;Understand what members to override in classes you create that inherit from SharePoint classes. &lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;The de facto standard program for doing this is &lt;A title="Lutz Roeder's famous tool now maintained by Red-Gate software" href="http://www.red-gate.com/products/reflector/" mce_href="http://www.red-gate.com/products/reflector/"&gt;Lutz Roeder's Reflector&lt;/A&gt;. The MSDN &lt;A href="http://msdn.microsoft.com/msdnmag/issues/04/07/MustHaveTools/#S8" mce_href="http://msdn.microsoft.com/msdnmag/issues/04/07/MustHaveTools/#S8"&gt;article on ten must-have tools&lt;/A&gt; has a great description of how helpful it can be and how to use it.&lt;/P&gt;
&lt;P&gt;One thing the article doesn't tell you is where to find SharePoint's assemblies; fortunately it's not that hard. Click "Open" in Reflector, then with a little bit of browsing, most people easily find the dlls in the ISAPI directory of the "12-hive" (C:\Program Files\Common Files\Microsoft Shared\web server extensions\12\ISAPI).&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P align=justify&gt;&lt;EM&gt;Open one or more of these dlls, then browse the classes to see how SharePoint's put together… the Disassemble tool is exceedingly useful! Note: the code you see is reconstructed from MSIL, into the language of your choice (C#, VB, Delphi, C++ or Chrome)… the product teams didn't really use all those goto's!&lt;/EM&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;However, some SharePoint namespaces seem to be missing or incomplete when viewed in Reflector. This had me baffled for quite some time, until I found the following.&lt;/P&gt;
&lt;P&gt;Some SharePoint assemblies are stored in the _app_bin directory of the web application instead of the ISAPI directory in the 12-hive. Presumably, the reason for distributing certain code into the web application's root is related to something like stability, security or scalability. But the important point is if you're using Reflector to look at SharePoint code, you may need to look here as well.&lt;/P&gt;
&lt;P&gt;This is especially true for a namespace like Microsoft.SharePoint.ApplicationPages. Two assemblies contribute members to this namespace: 12\ISAPI\Microsoft.SharePoint.dll and Inetpub\...\_app_bin\Microsoft.SharePoint.ApplicationPages.dll. If you just reflect the one in ISAPI, you'll see very few members; the ones you typically want to look at are in _app_bin!&lt;/P&gt;
&lt;H3&gt;SharePoint DLL locations&lt;/H3&gt;
&lt;P&gt;Here's a list of all the SharePoint assemblies and where they appear.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;12\ISAPI&lt;/STRONG&gt;&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;Microsoft.Office.Excel.Server.Udf.dll &lt;BR&gt;Microsoft.Office.Excel.Server.WebServices.dll &lt;BR&gt;Microsoft.Office.Policy.dll &lt;BR&gt;Microsoft.Office.Server.dll &lt;BR&gt;Microsoft.Office.Server.Search.dll &lt;BR&gt;microsoft.office.workflow.tasks.dll&lt;/P&gt;
&lt;P&gt;Microsoft.SharePoint.dll &lt;BR&gt;microsoft.sharepoint.portal.dll &lt;BR&gt;Microsoft.SharePoint.Portal.SingleSignon.dll &lt;BR&gt;Microsoft.SharePoint.Portal.SingleSignon.Security.dll &lt;BR&gt;Microsoft.SharePoint.Publishing.dll &lt;BR&gt;Microsoft.SharePoint.Search.dll &lt;BR&gt;Microsoft.SharePoint.Security.dll &lt;BR&gt;microsoft.sharepoint.WorkflowActions.dll&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#808080&gt;Not .NET assemblies (can't reflect): &lt;BR&gt;OWSSVR.DLL &lt;BR&gt;SHTML.DLL &lt;BR&gt;SSOCLI.DLL&lt;/FONT&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;&lt;STRONG&gt;Inetpub\wwwroot\wss\VirtualDirectories\&amp;lt;web app&amp;gt;\_app_bin&lt;/STRONG&gt;&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;Microsoft.Office.DocumentManagement.Pages.dll &lt;BR&gt;Microsoft.Office.officialfileSoap.dll &lt;BR&gt;Microsoft.Office.Policy.Pages.dll &lt;BR&gt;Microsoft.Office.SlideLibrarySoap.dll &lt;BR&gt;Microsoft.Office.Workflow.Pages.dll &lt;BR&gt;Microsoft.Office.WorkflowSoap.dll&lt;/P&gt;
&lt;P&gt;Microsoft.SharePoint.ApplicationPages.dll&lt;/P&gt;
&lt;P&gt;stssoap.dll&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;H3&gt;Obfuscation tips&lt;/H3&gt;
&lt;P&gt;Sometimes, not too often, when Reflector is disassembling source code for you, it will show "This item is obfuscated and can not be translated" instead of code. I think the product team did this for some of the more "sensitive" areas of the code (such as LogInAsAnotherUser) and also on a bit of a random basis, perhaps to prevent fully reverse engineering the product. In any case, by changing the translation language to IL in Reflector, you might get enough information from the MSIL code to answer the question that drove you there in the first place. For example, sometimes I just need to know what modules are being called, or what strings are being used to find other resources in the 12-hive; these are still visible in MSIL.&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Calibri&gt;&lt;FONT color=#ff0000&gt;Important Note:&lt;/FONT&gt; Customers are advised to review the end user license agreement (EULA) for the relevant Microsoft products before using this tool.&lt;/FONT&gt;&lt;/P&gt;
&lt;P mce_keep="true"&gt;
&lt;DIV style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; DISPLAY: inline; PADDING-TOP: 0px" id=scid:0767317B-992E-4b12-91E0-4F059A8CECA8:4cfdc91a-dd90-4232-a912-95ef3d37c17a class=wlWriterSmartContent&gt;Technorati Tags: &lt;A href="http://technorati.com/tags/SharePoint" rel=tag mce_href="http://technorati.com/tags/SharePoint"&gt;SharePoint&lt;/A&gt;,&lt;A href="http://technorati.com/tags/MOSS+2007" rel=tag mce_href="http://technorati.com/tags/MOSS+2007"&gt;MOSS+2007&lt;/A&gt;,&lt;A href="http://technorati.com/tags/Development" rel=tag mce_href="http://technorati.com/tags/Development"&gt;Development&lt;/A&gt;&lt;/DIV&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=7937568" width="1" height="1"&gt;&lt;img src="http://feeds.feedburner.com/~r/MarkArendSharePoint/~4/TEslde1J6yY" height="1" width="1"/&gt;</description><category domain="http://blogs.msdn.com/b/markarend/archive/tags/SharePoint/">SharePoint</category><category domain="http://blogs.msdn.com/b/markarend/archive/tags/API/">API</category><category domain="http://blogs.msdn.com/b/markarend/archive/tags/Development/">Development</category></item><item><title>My Site Pages and Architecture</title><link>http://blogs.msdn.com/b/markarend/archive/2008/02/22/mysite-pages-and-architecture.aspx</link><pubDate>Sat, 23 Feb 2008 04:03:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:7853842</guid><dc:creator>Mark Arend</dc:creator><slash:comments>10</slash:comments><wfw:commentRss>http://blogs.msdn.com/b/markarend/rsscomments.aspx?WeblogPostID=7853842</wfw:commentRss><comments>http://blogs.msdn.com/b/markarend/archive/2008/02/22/mysite-pages-and-architecture.aspx#comments</comments><description>&lt;p&gt;&lt;em&gt;&lt;span style="color: #0000ff;"&gt;&lt;span style="font-size: small;"&gt;This blog posting applies to Microsoft Office SharePoint Server 2007.&lt;/span&gt;&lt;/span&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;MySites are very interesting on many levels.&amp;nbsp; When you start to think about how to architect, deploy or customize them, you may encounter some initial confusion and a lack of detailed information.&amp;nbsp; For instance, did you know that your MySite's Home page and the My Profile page are in completely&amp;nbsp;different site collections?&amp;nbsp; What's up with that?&lt;/p&gt;
&lt;p&gt;The reason is that&amp;nbsp;a My Profile page is provided for every user in the portal regardless of whether they have a MySite, or even if MySites is disabled.&amp;nbsp; Actually,&amp;nbsp;a single page renders every MyProfile page: &lt;span style="text-decoration: underline;"&gt;http://mysite/person.aspx&lt;/span&gt;. This page has code that displays a "Home" tab linking to the user's MySite at &lt;span style="text-decoration: underline;"&gt;http://mysite/personal/userid/default.aspx&lt;/span&gt; if it exists.&amp;nbsp; The Home tab makes it &lt;em&gt;appear&lt;/em&gt; that these two pages are&amp;nbsp;part of&amp;nbsp;the same site.&amp;nbsp; But the URLs hint at the truth: the My Profile page is on&amp;nbsp;one site collection, while the user's MySite Home page is on another.&lt;/p&gt;
&lt;p&gt;You knew&amp;nbsp;each MySite is hosted in its own site collection, right?&amp;nbsp; When a MySite is created for a user (see below), that user is added to the Owners group for the new site collection, and is also added to the Site Administrators list.&amp;nbsp; This user has full power over their MySite.&amp;nbsp; To customize that is a bit difficult, but possible.&lt;/p&gt;
&lt;p&gt;I created a Visio diagram that depicts the relationships between the pages, where profile information is used on them, and how the links between them interact.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Screenshot (click to download the diagram)&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;a target="_blank" href="http://code.msdn.microsoft.com/Project/Download/FileDownload.aspx?ProjectName=ReferenceTopics&amp;amp;DownloadId=840" title="MySite Pages + Architecture.vsd"&gt;&lt;img height="362" width="399" src="http://blogs.msdn.com/blogfiles/markarend/WindowsLiveWriter/MySitePagesandArchitecture_1442B/image6.png" alt="MySite page relationships" border="0" style="BORDER-RIGHT-WIDTH: 0px; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" /&gt;&lt;/a&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What happens when you browse to &lt;span style="text-decoration: underline;"&gt;http://mysite/&lt;/span&gt;?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Whenever you browse to &lt;span style="text-decoration: underline;"&gt;http://mysite/&lt;/span&gt;, you're redirected to &lt;span style="text-decoration: underline;"&gt;http://mysite/personal/userid/default.aspx&lt;/span&gt; through a few steps:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;div class="MsoNormal" style="MARGIN: 12pt 0in 10pt 10.1pt"&gt;&lt;span style="text-decoration: underline;"&gt;http://mysite/default.aspx&lt;/span&gt; inherits from Microsoft.SharePoint.Portal.WebControls.MySiteHostHomePage.&amp;nbsp; This assembly authorizes the user against the MySite shared service rights (can be enabled/disabled by users or groups), then emits an HttpResponse.Redirect to either /_layouts/MySite.aspx or /_layouts/AccessDenied.aspx, accordingly.&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;div class="MsoNormal" style="MARGIN: 12pt 0in 10pt 10.1pt"&gt;&lt;span style="text-decoration: underline;"&gt;/_layouts/MySite.aspx&lt;/span&gt; inherits from Microsoft.SharePoint.Portal.WebControls.CreatePersonalSpace.&amp;nbsp; This assembly&amp;nbsp;examines the user profile property &lt;strong&gt;Personal site&lt;/strong&gt;.&amp;nbsp; &lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;div class="MsoNormal" style="MARGIN: 12pt 0in 10pt 10.1pt"&gt;If the Personal site property is blank, CreatePersonalSpace creates a new MySite site collection for this user, then stores its relative URL&amp;nbsp;(e.g. "/personal/userid/")&amp;nbsp;in the Personal site property.&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;div class="MsoNormal" style="MARGIN: 12pt 0in 10pt 10.1pt"&gt;CreatePersonalSpace then emits an HttpResponse.Redirect to the URL in the Personal site property.&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;div class="MsoNormal" style="MARGIN: 12pt 0in 10pt 10.1pt"&gt;You arrive at &lt;span style="text-decoration: underline;"&gt;http://mysite/personal/userid/default.aspx&lt;/span&gt;, where "mysite" is the URL of the web application hosting your MySites, and "userid" is your user id.&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;div class="MsoNormal" style="MARGIN: 12pt 0in 10pt 10.1pt"&gt;Note, other configurations could change this URL, such as the Personal Site Location ("personal") and the Site Naming Format (whether "userid" should include your domain.)&amp;nbsp; These settings are found on the SSP Admin page "My Site settings."&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;Customizing MySite&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Steve Peschka has the best information for &lt;a target="_blank" href="http://blogs.msdn.com/sharepoint/archive/2007/03/22/customizing-moss-2007-my-sites-within-the-enterprise.aspx" title="Link to the SharePoint Product Team's blog"&gt;customizing MySites&lt;/a&gt;, including how to set&amp;nbsp;a custom&amp;nbsp;master page automatically for all new MySites being created... this one's not obvious!&amp;nbsp; Steve has a very clever approach that uploads an XML file to each new MySite, containing instructions on what should be modified.&amp;nbsp; Then, a control in the custom master page reads the XML file and performs the customizations.&amp;nbsp; He explains why this approach is necessary.&lt;/p&gt;
&lt;p&gt;His XML spec for customizations provides several things you can do, such as removing/adding web parts and&amp;nbsp;modifying QuickLaunch links.&amp;nbsp; He doesn't provide a way to change the permissions of the owner... look for another blog posting from me on how to do that when you want to restrict the rights of&amp;nbsp;each MySite's owner.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;A Belated Update: the My Settings page&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Because I still have a hard time finding this info, here's the explanation of why some customers find that clicking on a user name takes them to the My Site persondetails.aspx page while others only see the simple WSS userdisp.aspx page.&lt;/p&gt;
&lt;p&gt;All people links go to &lt;a href="http://sitecollectionurl/SiteURL/_layouts/userdisp.aspx?ID=17&amp;amp;Source"&gt;http://SiteCollectionURL/SiteURL/_layouts/userdisp.aspx?ID=17&amp;amp;Source&lt;/a&gt;=... And this page decides whether to redirect to the My Site provider defined in the SSP that the Web Application containing the content site collection is assigned to based on one of the following rules: &lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Host name of the My Site web application matches the site from where userdisp.aspx is called (i.e. both web applications are running on different port numbers) &lt;/li&gt;
&lt;li&gt;The site collection where userdisp.aspx is called from has a Portal Connection setting which is set to the My Site url (this would add the My Site to the start of the breadcrumb navigation for OOTB master pages which most customers don't want).&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;From Ian Morrish at&amp;nbsp;&lt;a href="http://www.wssdemo.com/Blog/Lists/Posts/Post.aspx?List=b853926a%2Db04e%2D4620%2D94e4%2D88a5d56cb262&amp;amp;ID=427&amp;amp;Web=d47402ad%2D1767%2D42ba%2Da072%2D133479a9bb5a"&gt;http://www.wssdemo.com/Blog/Lists/Posts/Post.aspx?List=b853926a%2Db04e%2D4620%2D94e4%2D88a5d56cb262&amp;amp;ID=427&amp;amp;Web=d47402ad%2D1767%2D42ba%2Da072%2D133479a9bb5a&lt;/a&gt;.&amp;nbsp; Ian describes the situation in detail, plus an unsupported fix.&amp;nbsp; A&amp;nbsp;&lt;em&gt;supported &lt;/em&gt;method extends his approach&amp;nbsp;to use a delegate control: &lt;a href="http://solutionizing.net/2008/12/08/user-profile-mysite-redirect-via-delegate-control/"&gt;http://solutionizing.net/2008/12/08/user-profile-mysite-redirect-via-delegate-control/&lt;/a&gt;.&amp;nbsp;&amp;nbsp;This references a CodePlex solution created to do this, at &lt;a href="http://www.codeplex.com/Solutionizing/Release/ProjectReleases.aspx?ReleaseId=20923"&gt;http://www.codeplex.com/Solutionizing/Release/ProjectReleases.aspx?ReleaseId=20923&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;See also&lt;br /&gt;&lt;/strong&gt;To enable/disable MySites, &lt;/em&gt;&lt;a href="http://blogs.msdn.com/markarend/archive/2007/04/26/managing-mysite-creation-and-usage.aspx" id="ctl00___ctl00___ctl02___Results___postlist___EntryItems_ctl01_PostTitle"&gt;&lt;em&gt;Managing MySite Creation and Usage&lt;/em&gt;&lt;/a&gt;&lt;em&gt;.&lt;br /&gt;If MySites are disabled, &lt;/em&gt;&lt;a href="http://blogs.msdn.com/markarend/archive/2007/11/08/where-is-my-picture-stored-what-if-mysites-are-off.aspx" id="ctl00___ctl00___ctl02___Results___postlist___EntryItems_ctl00_PostTitle"&gt;&lt;em&gt;Where is My Picture stored? What if MySites are off?&lt;/em&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=7853842" width="1" height="1"&gt;&lt;img src="http://feeds.feedburner.com/~r/MarkArendSharePoint/~4/12WsDsZqarM" height="1" width="1"/&gt;</description><category domain="http://blogs.msdn.com/b/markarend/archive/tags/SharePoint/">SharePoint</category><category domain="http://blogs.msdn.com/b/markarend/archive/tags/2007/">2007</category><category domain="http://blogs.msdn.com/b/markarend/archive/tags/My+Sites/">My Sites</category></item><item><title>SharePoint 2007 Permissions Matrix</title><link>http://blogs.msdn.com/b/markarend/archive/2008/02/14/sharepoint-2007-permissions-matrix.aspx</link><pubDate>Thu, 14 Feb 2008 21:05:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:7697309</guid><dc:creator>Mark Arend</dc:creator><slash:comments>6</slash:comments><wfw:commentRss>http://blogs.msdn.com/b/markarend/rsscomments.aspx?WeblogPostID=7697309</wfw:commentRss><comments>http://blogs.msdn.com/b/markarend/archive/2008/02/14/sharepoint-2007-permissions-matrix.aspx#comments</comments><description>&lt;p&gt;&lt;em&gt;&lt;span style="color: #0000ff;"&gt;&lt;span style="font-size: small;"&gt;This blog posting applies to Microsoft Office SharePoint Server 2007.&lt;/span&gt;&lt;/span&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Many times it helps to see an overall comparison of SharePoint 2007 permissions.&amp;nbsp; I assembled a matrix that shows lots of useful information that helps you understand how permission levels are related, and how they affect security trimming of Site Actions and Site Settings.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Screenshot (click to download the spreadsheet)&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;a target="_blank" href="http://code.msdn.microsoft.com/Project/Download/FileDownload.aspx?ProjectName=ReferenceTopics&amp;amp;DownloadId=490"&gt;&lt;img height="369" width="475" src="http://blogs.msdn.com/blogfiles/markarend/WindowsLiveWriter/SharePoint2007PermissionsMatrix_A9E6/Permissions%20Screenshot_3.jpg" alt="Permissions Screenshot" border="0" style="BORDER-RIGHT: 0px; BORDER-TOP: 0px; BORDER-LEFT: 0px; BORDER-BOTTOM: 0px" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;span style="color: #0000ff;"&gt;&lt;span style="font-size: small;"&gt;Update for SharePoint 2010&lt;/span&gt;&lt;/span&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Colleague Rob Finney has updated this spreadsheet for 2010.&amp;nbsp; Please see &lt;a href="http://blogs.msdn.com/b/uksharepoint/archive/2010/10/20/updated-permissions-permissions-spreadsheet-for-sharepoint-2010.aspx"&gt;Rob's blog posting &lt;/a&gt;on the topic.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=7697309" width="1" height="1"&gt;&lt;img src="http://feeds.feedburner.com/~r/MarkArendSharePoint/~4/z_xP9vRZf1M" height="1" width="1"/&gt;</description><category domain="http://blogs.msdn.com/b/markarend/archive/tags/SharePoint/">SharePoint</category><category domain="http://blogs.msdn.com/b/markarend/archive/tags/Configuration/">Configuration</category><category domain="http://blogs.msdn.com/b/markarend/archive/tags/Security/">Security</category><category domain="http://blogs.msdn.com/b/markarend/archive/tags/2007/">2007</category></item></channel></rss>
