<?xml version="1.0" encoding="utf-8"?>
<rss xmlns:atom="https://www.w3.org/2005/Atom" xmlns:sy="https://purl.org/rss/1.0/modules/syndication/" xmlns:dc="https://purl.org/dc/elements/1.1/" xmlns:content="https://purl.org/rss/1.0/modules/content/" xmlns:wfw="https://wellformedweb.org/CommentAPI/" xmlns:slash="https://purl.org/rss/1.0/modules/slash/"
  version="2.0">
  <channel>
    <title>Pascal Benois</title>
    <atom:link
      href="https://docs.microsoft.com/archive/blogs/pabenois/feed.xml"
      rel="self"
      type="application/rss+xml" />
    <link>https://docs.microsoft.com/archive/blogs/pabenois/feed.xml</link>
    <description>Senior Premier Field Engineer at Microsoft Belgium</description>
    <lastBuildDate>Tue, 16 Apr 2019 06:14:06 GMT</lastBuildDate>
    <language>en-US</language>
    <sy:updatePeriod>hourly</sy:updatePeriod>
    <sy:updateFrequency>1</sy:updateFrequency>
    <item>
      <title>Some thoughts about SharePoint 2013 Host-Named site collections</title>
      <link>https://docs.microsoft.com/archive/blogs/pabenois/some-thoughts-about-sharepoint-2013-host-named-site-collections</link>
      <pubDate>Thu, 28 Mar 2013 04:05:00 GMT</pubDate>
      <dc:creator><![CDATA[pabenois]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.technet.microsoft.com/pabenois/2013/03/28/some-thoughts-about-sharepoint-2013-host-named-site-collections/</guid>
      <description><![CDATA[Last week I visited a customer and came across a very common misconception when it comes to...]]></description>
      <content:encoded><![CDATA[<p>Last week I visited a customer and came across a very common misconception when it comes to host-named web applications. Lots of people think you can only have one web application on port 80 while you can actually have as many as you want as long as you are dealing with host names.</p>
<p>Let&rsquo;s consider the following scenario:</p>
<ul>
<li>You want to have an application at the following URL: https://publishing.contoso.com</li>
<li>You also want to have an application at : https://bi.contoso.com</li>
</ul>
<p>You might think about having the second one hosted at port 81. In this case, you will never be able to provide the URL you were thinking about as the Host entry in DNS will direct your requests to the default 80 port. The only way to go would be to have both applications at the same port, 80 that is.</p>
<p>Very basic but it also looks like very confusing for some of my customers. My customer&rsquo;s question was &ldquo;is there a way to have a web application on port 81 while having the URL for this site being &ldquo;www.mycustomer.com&rdquo; ?". So, the answer is NO.</p>
<p>Let&rsquo;s have a look at how to enable such a scenario:</p>
<p>Create a new web application:</p>
<pre class="csharpcode">$DatabaseName = <span class="str">"WSS_Content_publishing"</span>
$Port = 80
$URL = <span class="str">"https://publishing.contoso.com"</span>
$HostHeader = "Publishing"<br />$AppPoolName = <span class="str">"Publishing"</span>
$AppPoolAcct = <span class="str">"CONTOSO\AppPoolsAcc.svc"</span>


New-SPWebApplication -Name $Name -Port $Port &lsquo;<br />-URL $URL -HostHeader $HostHeader -ApplicationPool $AppPoolName &lsquo;<br />-ApplicationPoolAccount $AppPoolAcct -DatabaseName $DatabaseName
</pre>
<p>Create the second one:</p>
<pre class="csharpcode">$DatabaseName = <span class="str">"WSS_Content_bi"</span>
$Port = 80
$URL = <span class="str">"https://bi.contoso.com"</span>
$HostHeader = "BI"<br />$AppPoolName = <span class="str">"BI"</span>
$AppPoolAcct = <span class="str">"CONTOSO\AppPoolsAcc.svc"</span>


New-SPWebApplication -Name $Name -Port $Port &lsquo;<br />-URL $URL -HostHeader $HostHeader &lsquo;<br />-ApplicationPool $AppPoolName -ApplicationPoolAccount $AppPoolAcct -DatabaseName $DatabaseName
</pre>
<p>&nbsp;</p>
<p>Noticed they are both on the same port ? The difference is they both have host headers and these ones are different !</p>
<p>Next step would be to add Host entries (A records) in DNS for each of the web applications.</p>
<p>&nbsp;</p>
<p>That&rsquo;s it for the web applications.</p>
<p>The good thing is you can do the same at the site collection level.</p>
<p>This capability was already there for SharePoint 2010, however Microsoft now <strong>recommend </strong>you create host-named site collections and not path based site collections. In SharePoint 2013 some limitations were addressed and the scalability has been improved.</p>
<p>For instance:</p>
<ul>
<li>the new <strong><a href="https://technet.microsoft.com/en-us/library/jj219633.aspx">Set-SPSiteUrl</a></strong> has been introduced<strong>: </strong>it allows you now to add or change an URL mapping for the site.</li>
<li>you can now add multiple URLs to host-named site collections. URL will be mapped to one of the 5 zones which are the same as for a web applications. But you can add multiple URLs to one zone. In SharePoint 2010, the capability was limited to one URL that was added to the Default zone.</li>
</ul>
<p>One additionnal recommendation would be to NOT host your host-named site collections in different web applications. This is feasible but management would be quite complex. So, a best practice would be to host your host-named site collections in one dedicated web application and configure DNS to send&nbsp; request to a &ldquo;wildcarded&rdquo; host entry like &ldquo;*.contoso.com&rdquo; to the web application hosting your host-named site collections. In this case of course, this web application must not have any binding to a particular host header.</p>
<p>&nbsp;</p>
<p>Also,, web applications hosting host-named site collections must have a default site collection at the root BUT this root site collection does not need to be linked to a Template. Actually, this one will not be used. Note htat you will need a DNS entry pointing the IP of the web application hosting the host-named site collections.</p>
<p>In a nutshell, I see two key benefits to it:</p>
<ul>
<li>you can now have zone settings for host-named site collection (hosters and multitenant admins will be happy)</li>
<li>you can be a little bit creative and use multiple host names on internet facing websites. As a result, the amount of concurrent downloads will be <a href="https://www.websiteoptimization.com/speed/tweak/parallel/">improved</a>. For instance having &ldquo;www.contoso.com&rdquo; and &ldquo;www2.contoso.com&rdquo;.</li>
</ul>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>]]></content:encoded>
    </item>
    <item>
      <title>XLIFF files: the very basics</title>
      <link>https://docs.microsoft.com/archive/blogs/pabenois/xliff-files-the-very-basics</link>
      <pubDate>Fri, 15 Mar 2013 07:08:00 GMT</pubDate>
      <dc:creator><![CDATA[pabenois]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.technet.microsoft.com/pabenois/2013/03/15/xliff-files-the-very-basics/</guid>
      <description><![CDATA[Want to have a very basic idea about how do these XLIFF files you can export for your pages in...]]></description>
      <content:encoded><![CDATA[<p>Want to have a very basic idea about how do these XLIFF files you can export for your pages in SharePoint 2013 Variations sites look like ?</p>
<p>Let&rsquo;s start from a target variation site where the <strong>My-demo-page</strong> has been propagated from the source variation:</p>
<p><a href="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/prod.evol.blogs.technet.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/81/92/metablogapi/1526.xliff1_53160F14.jpg" original-url="https://blogs.technet.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-81-92-metablogapi/1526.xliff1_5F00_53160F14.jpg"><img style="display: inline; background-image: none;" title="xliff1" src="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/prod.evol.blogs.technet.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/81/92/metablogapi/0005.xliff1_thumb_3F1C7C7E.jpg" original-url="https://blogs.technet.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-81-92-metablogapi/0005.xliff1_5F00_thumb_5F00_3F1C7C7E.jpg" alt="xliff1" width="660" height="500" border="0" />&nbsp;</a></p>
<p>This is how the page looks like in the source variation site:</p>
<p><a href="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/prod.evol.blogs.technet.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/81/92/metablogapi/3681.xliff6_68B047B1.jpg" original-url="https://blogs.technet.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-81-92-metablogapi/3681.xliff6_5F00_68B047B1.jpg"><img style="display: inline; background-image: none;" title="xliff6" src="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/prod.evol.blogs.technet.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/81/92/metablogapi/0474.xliff6_thumb_5BD5F193.jpg" original-url="https://blogs.technet.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-81-92-metablogapi/0474.xliff6_5F00_thumb_5F00_5BD5F193.jpg" alt="xliff6" width="660" height="500" border="0" /></a></p>
<p>Go to the Variations tab (in this case the &ldquo;Variantes&rdquo; tab as this site is the &ldquo;fr-fr&rdquo; variation label), select the page and click &ldquo;Create a tranaslation package&rdquo; for the selected page.</p>
<p><a href="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/prod.evol.blogs.technet.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/81/92/metablogapi/3808.xliff2_2584C984.jpg" original-url="https://blogs.technet.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-81-92-metablogapi/3808.xliff2_5F00_2584C984.jpg"><img style="display: inline; background-image: none;" title="xliff2" src="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/prod.evol.blogs.technet.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/81/92/metablogapi/2330.xliff2_thumb_118B36EE.jpg" original-url="https://blogs.technet.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-81-92-metablogapi/2330.xliff2_5F00_thumb_5F00_118B36EE.jpg" alt="xliff2" width="660" height="500" border="0" /></a></p>
<p>Save the exported file and edit the exported file with Notepad. In this example, there are two translations unit, one for the page title and one for the page content itself.</p>
<p><a href="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/prod.evol.blogs.technet.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/81/92/metablogapi/7041.xliff3_08BB2EA2.jpg" original-url="https://blogs.technet.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-81-92-metablogapi/7041.xliff3_5F00_08BB2EA2.jpg"><img style="display: inline; background-image: none;" title="xliff3" src="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/prod.evol.blogs.technet.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/81/92/metablogapi/3771.xliff3_thumb_3F48D9E6.jpg" original-url="https://blogs.technet.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-81-92-metablogapi/3771.xliff3_5F00_thumb_5F00_3F48D9E6.jpg" alt="xliff3" width="660" height="500" border="0" /></a></p>
<p>&nbsp;</p>
<p>You can now edit these sections and manually add the translation by adding &ldquo;target&rdquo; elements to the translation units:</p>
<p><a href="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/prod.evol.blogs.technet.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/81/92/metablogapi/0005.xliff4_3D980E12.jpg" original-url="https://blogs.technet.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-81-92-metablogapi/0005.xliff4_5F00_3D980E12.jpg"><img style="display: inline; background-image: none;" title="xliff4" src="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/prod.evol.blogs.technet.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/81/92/metablogapi/4251.xliff4_thumb_09173BCA.jpg" original-url="https://blogs.technet.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-81-92-metablogapi/4251.xliff4_5F00_thumb_5F00_09173BCA.jpg" alt="xliff4" width="660" height="500" border="0" /></a></p>
<p>&nbsp;</p>
<p>Once the content of the &ldquo;target&rdquo; elements translated, save this file, go back to you target variation Pages Library, click on &ldquo;Upload Translation&rdquo; and upload the XLF file.</p>
<p>Publish the page, open it,, the page has now been translated:</p>
<p><a href="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/prod.evol.blogs.technet.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/81/92/metablogapi/3443.xliff5_323ED408.jpg" original-url="https://blogs.technet.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-81-92-metablogapi/3443.xliff5_5F00_323ED408.jpg"><img style="display: inline; background-image: none;" title="xliff5" src="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/prod.evol.blogs.technet.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/81/92/metablogapi/8688.xliff5_thumb_1072FB77.jpg" original-url="https://blogs.technet.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-81-92-metablogapi/8688.xliff5_5F00_thumb_5F00_1072FB77.jpg" alt="xliff5" width="660" height="500" border="0" /></a></p>
<p>&nbsp;</p>
<p>So simple is this. Now, this is a very basic example and using Notepad would not be a very convenient way of editing XLIFF translation packages. Most translation agencies make use of Professional XLIFF editors.</p>
<p>You can give this one a try in order to test more complex page and figure out how easy it would be to create translations: <a title="https://sourceforge.net/projects/eviltrans/" href="https://sourceforge.net/projects/eviltrans/">https://sourceforge.net/projects/eviltrans/</a></p>
<p>&nbsp;</p>
<p>Also note XLIFF is an industry standard, not a Microsoft thingie: <a title="https://en.wikipedia.org/wiki/XLIFF" href="https://en.wikipedia.org/wiki/XLIFF">https://en.wikipedia.org/wiki/XLIFF</a></p>]]></content:encoded>
    </item>
    <item>
      <title>Playing with variations in SharePoint 2013</title>
      <link>https://docs.microsoft.com/archive/blogs/pabenois/playing-with-variations-in-sharepoint-2013</link>
      <pubDate>Fri, 15 Mar 2013 04:48:00 GMT</pubDate>
      <dc:creator><![CDATA[pabenois]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.technet.microsoft.com/pabenois/2013/03/15/playing-with-variations-in-sharepoint-2013/</guid>
      <description><![CDATA[I recently had to deliver a basic demo about new features for Variations in SharePoint 2013.  This...]]></description>
      <content:encoded><![CDATA[<p>I recently had to deliver a basic demo about new features for Variations in SharePoint 2013.</p>  <p>This was a very basic demo, and as I had a very limited timeframe to demonstrate these features, going to the list of Timer Jobe defintions for my demo application, and manually hitting the “Run Now” button for any single Timer Job Definition was defitely not an option.</p>  <p>Here below is a script that will help you starting these jobs in a correct sequence, this should help you having your hierachy created, your sites and lists, pages and listitems propagated in no time.</p>  <p>&#160;</p>  <p>Here are the time jobs you need to run and their default Schedule:</p>  <p>&#160;</p>  <table style="width: 400px;" cellspacing="0" cellpadding="2" border="0"><tbody>     <tr>       <td valign="top" width="200">Variations Create Hierarchies Job Definition</td>        <td valign="top" width="200">Hourly</td>     </tr>      <tr>       <td valign="top" width="200">Variations Propagate List Items Job Definition</td>        <td valign="top" width="200">Every 15 minutes</td>     </tr>      <tr>       <td valign="top" width="200">Variations Propagate Page Job Definition</td>        <td valign="top" width="200">Every 15 minutes</td>     </tr>      <tr>       <td valign="top" width="200">Variations Propagate Sites and Lists Job Definition</td>        <td valign="top" width="200">Every 30 minutes</td>     </tr>   </tbody></table>  <p>This is not very convenient when it comes to demo or development as you obviously would like to have your pages almost immediately available in target variations as soon as you published a page in the source variation.</p>  <p>This would be the obvious execution sequence of the Timer Jobs</p>  <ul>   <li>Variations Create Hierarchies Job Definition (unless you created an additional label, this one should not be executed)</li>    <li>Variations Propagate Sites and Lists Job Definition</li>    <li>Variations Propagate Page Job Definition</li>    <li>Variations Propagate List Items Job Definition</li> </ul>  <p>&#160;</p>  <pre class="csharpcode">Add-PSSNapin Microsoft.SharePoint.PowerShell

[System.Reflection.Assembly]::LoadWithPartialName(<span class="str">&quot;Microsoft.SharePoint&quot;</span>)

cls
function runJob($Job)
{
    write-host <span class="str">&quot;Last execution time was:&quot;</span> $Job.LastRunTime
    [Array] $JobHistoryList=$Job.HistoryEntries
    Start-SPTimerJob $Job
    Write-Host <span class="str">&quot;Running Timer Job:&quot;</span> -NoNewline
    Write-Host $Job.DisplayName  -NoNewline -ForegroundColor Yellow
    Write-Host <span class="str">&quot; for web application: &quot;</span> -NoNewline
    Write-Host $targetWebApp.Url -ForegroundColor Yellow
    
    $count = $JobHistoryList.count
    $countNext = $count+1

    <span class="kwrd">while</span> ( $countNext -ne $count)
    {
    [Array] $JobHistoryList=$Job.HistoryEntries
    $count = $JobHistoryList.count
    Write-Host <span class="str">&quot;=&quot;</span> -NoNewline
    sleep 2 
    }
    Write-Host <span class="str">&quot;&quot;</span>
    <span class="kwrd">if</span> ($Job.status –ne <span class="str">&quot;Succeeded&quot;</span>)
    {
    Write-Host -f yellow $JobHistoryList[0].status
    Write-Host -f yellow $JobHistoryList[0].ErrorMessage
    }

    <span class="kwrd">else</span>
    {
    Write-Host -f Green $JobHistoryList[0].status 

    }
}

$webAppURL = Read-Host <span class="str">&quot;Web application URL&quot;</span> 
$targetWebApp = Get-SPWebApplication ($webAppURL)

#VariationsCreateHierarchies job
$createHierarchies = Read-Host <span class="str">&quot;Create Hierarchies ? [Y][N]&quot;</span>
<span class="kwrd">if</span>($createHierarchies -eq <span class="str">&quot;Y&quot;</span>)
{
    $jobName = <span class="str">&quot;VariationsCreateHierarchies&quot;</span>
    $Job  = Get-SPTimerJob | ?{$_.Name -match $jobName} | ?{$_.Parent -eq $targetWebApp} 
    runJob($Job)
}

#VariationsSpawnSites job
$propagateSites = Read-Host <span class="str">&quot;Propagate sites and lists ? [Y][N]&quot;</span>
<span class="kwrd">if</span>($propagateSites -eq <span class="str">&quot;Y&quot;</span>)
{
    $jobName = <span class="str">&quot;VariationsSpawnSites&quot;</span>
    $Job  = Get-SPTimerJob | ?{$_.Name -match $jobName} | ?{$_.Parent -eq $targetWebApp} 
    runJob($Job)
}

#VariationsPropagatePage job
$propagatePage = Read-Host <span class="str">&quot;Propagate pages ? [Y][N]&quot;</span>
<span class="kwrd">if</span>($propagatePage -eq <span class="str">&quot;Y&quot;</span>)
{
    $jobName = <span class="str">&quot;VariationsPropagatePage&quot;</span>
    $Job  = Get-SPTimerJob | ?{$_.Name -match $jobName} | ?{$_.Parent -eq $targetWebApp} 
    runJob($Job)
}

#VariationsPropagateListItem job
$propagateListItem = Read-Host <span class="str">&quot;Propagate list items ? [Y][N]&quot;</span>
<span class="kwrd">if</span>($propagateListItem -eq <span class="str">&quot;Y&quot;</span>)
{
    $jobName = <span class="str">&quot;VariationsPropagatePage&quot;</span>
    $Job  = Get-SPTimerJob | ?{$_.Name -match $jobName} | ?{$_.Parent -eq $targetWebApp} 
    runJob($Job)
}</pre>

<p>Additionally, as you will most probably want to check if the redirection logic is working properly when you created a new variations label, you will also need to change the browser local back and forth. this can be easily done by having a few <strong>.reg</strong> files at your disposal. This setting is stored in the following key:</p>

<p>[HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\International] @=&quot;&quot; &quot;AcceptLanguage&quot;=&quot;fr-FR&quot;</p>

<p>Just change the locale to match your variations labels, close and restart the browser and you should be redirected correctly.</p>]]></content:encoded>
    </item>
    <item>
      <title>Failover farms by using SQL Server log shipping: some important reminders</title>
      <link>https://docs.microsoft.com/archive/blogs/pabenois/failover-farms-by-using-sql-server-log-shipping-some-important-reminders</link>
      <pubDate>Fri, 11 Feb 2011 05:47:27 GMT</pubDate>
      <dc:creator><![CDATA[pabenois]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.technet.microsoft.com/pabenois/2011/02/11/failover-farms-by-using-sql-server-log-shipping-some-important-reminders/</guid>
      <description><![CDATA[I have been working lately on a few projects implementing failover farms fro SharePoint 2007....]]></description>
      <content:encoded><![CDATA[<p>I have been working lately on a few projects implementing failover farms fro SharePoint 2007. Amazingly, I encountered a few obvious supportability issues while reviewing the the failover process for each of these projects.</p>  <p>The first one, and again it might seem obvious, concerns the configuration database. The failover process documents were just mentioning “log shipping of the databases” without mentioning there are a few databases in a SharePoint farm for whom log shipping is simply not supported. Among these ones, the most obvious one is the configuration database. SO, it looks like this is a quite common assumption that log shipping databases across farms will just exactly duplicate the environments and keep them in sync. This <a href="https://technet.microsoft.com/en-us/library/dd890507(office.12).aspx" target="_blank">TechNet article</a> is very clear about that: “The configuration database cannot be log shipped to another farm because it contains computer-specific information. You must maintain the same customizations and configuration settings on both farms manually.” Furthermore, site collections you had to your primary farm will not be registered in the configuration database of the secondary farm even though the content databases containing these site collections are log shipped from the primary to the secondary farm.     <br />You have more or less two ways to work it around:</p>  <ul>   <li>Manually detach/attach the content databases in the secondary farm to have the newly created site collections registered in the secondary farm configuration database </li>    <li>Perform these operations by means of a so-called “refresh script”, the same TechNet article provides an example of such a script. </li> </ul>  <p>When looking in more details about what is stored in the configuration database, one of the major concerns in my opinion is about the Alternate Access Mappings because you cannot backup these ones. You have to manually export the list of AAMs by means of the <strong>stsadm -o enumalternatedomains </strong>command. Since these AAMs have to exactly matching between the primary and secondary farm, it might become a serious issue in the disaster recovery process if not properly documented.</p>  <p>Well, there are obviously a lot of other concerns expressed in the article (patch level alignment not to mention…), however I was feeling like it would be important to keep in mind that relying on log shipping only will not provide a robust disaster recovery/failover scenario as assumed by some customers I worked with recently. Not only it will not be robust but simply lead to unsupported scenarios.</p>]]></content:encoded>
    </item>
    <item>
      <title>SharePoint 2007 HTML Editor Issue</title>
      <link>https://docs.microsoft.com/archive/blogs/pabenois/sharepoint-2007-html-editor-issue</link>
      <pubDate>Thu, 10 Jun 2010 06:45:00 GMT</pubDate>
      <dc:creator><![CDATA[pabenois]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.technet.microsoft.com/pabenois/2010/06/10/sharepoint-2007-html-editor-issue/</guid>
      <description><![CDATA[I recently came across&nbsp; a problem with the HTML Editor in SharePoint Server 2007. An error...]]></description>
      <content:encoded><![CDATA[<p>I recently came across&nbsp; a problem with the HTML Editor in SharePoint Server 2007. <br />An error message appears when editing text. </p>
<p>The error message displayed is: "<i>RTE_ToggleEnableShortcuts</i>" is undefined.</p>
<p>The patch level of the MOSS environment was12.0.6331</p>
<p>The "<i>RTE_ToggleEnableShortcuts</i>" can be found in the ***_HtmlEditor.js file located under the &ldquo;\TEMPLATE\LAYOUTS\<i>LCID</i>&rdquo; folder in the 12 hive.</p>
<p>There is such a file for all deployed language packs as well, additional foldersd are created for each LCID.</p>
<p>The installation language being English, the default file is &ldquo;1033\HtmlEditor.js&rdquo;</p>
<p sizset="0" sizcache="3">The first line of this file indicates which LCID uses the file and the patch level the file is related to. </p>
<table cellpadding="0" cellspacing="0" border="1">
<tbody>
<tr>
<td width="178" valign="top">
<p><b>File</b></p>
</td>
<td width="150" valign="top">
<p><b>_lcid</b></p>
</td>
<td width="154" valign="top">
<p><b>_version</b></p>
</td>
<td width="134" valign="top">
<p><b>Patch level</b></p>
</td>
</tr>
<tr>
<td width="178" valign="top">
<p>HtmlEditor.js</p>
</td>
<td width="150" valign="top">
<p>1031</p>
</td>
<td width="154" valign="top">
<p>12.0.6211</p>
</td>
<td width="134" valign="top">
<p>SP1</p>
</td>
</tr>
<tr>
<td width="178" valign="top">
<p>HtmlEditor.js</p>
</td>
<td width="150" valign="top">
<p>1033</p>
</td>
<td width="154" valign="top">
<p>12.0.6331</p>
</td>
<td width="134" valign="top">
<p>Dec. CU</p>
</td>
</tr>
<tr>
<td width="178" valign="top">
<p>HtmlEditor.js</p>
</td>
<td width="150" valign="top">
<p>1036</p>
</td>
<td width="154" valign="top">
<p>12.0.6211</p>
</td>
<td width="134" valign="top">
<p>SP1</p>
</td>
</tr>
<tr>
<td width="178" valign="top">
<p>HtmlEditor.js</p>
</td>
<td width="150" valign="top">
<p>1043</p>
</td>
<td width="154" valign="top">
<p>12.0.6211</p>
</td>
<td width="134" valign="top">
<p>SP1</p>
</td>
</tr>
</tbody>
</table>
<p sizset="1" sizcache="3">Here is the exact content of the &ldquo;Coreservermui-en-us.msp&rdquo; file which is deployed with the December Cumulative Update for MOSS: </p>
<table cellpadding="0" cellspacing="0" border="1">
<tbody>
<tr>
<td valign="top">
<p><b>File name </b></p>
</td>
<td valign="top">
<p><b>File version </b></p>
</td>
<td valign="top">
<p><b>File size </b></p>
</td>
<td valign="top">
<p><b>Date </b></p>
</td>
<td valign="top">
<p><b>Time </b></p>
</td>
<td valign="top">
<p><b>Platform </b></p>
</td>
</tr>
<tr>
<td valign="top">
<p>Cmssitemanager.js </p>
</td>
<td valign="top">
<p>Not Applicable </p>
</td>
<td valign="top">
<p>52,517 </p>
</td>
<td valign="top">
<p>22-Jan-2008 </p>
</td>
<td valign="top">
<p>22:31 </p>
</td>
<td valign="top">
<p>Not applicable </p>
</td>
</tr>
<tr>
<td valign="top">
<p>Editingmenu.js </p>
</td>
<td valign="top">
<p>Not Applicable </p>
</td>
<td valign="top">
<p>11,844 </p>
</td>
<td valign="top">
<p>22-Jan-2008 </p>
</td>
<td valign="top">
<p>22:30 </p>
</td>
<td valign="top">
<p>Not applicable </p>
</td>
</tr>
<tr>
<td valign="top">
<p>Htmleditor.js </p>
</td>
<td valign="top">
<p>Not Applicable </p>
</td>
<td valign="top">
<p>289,410 </p>
</td>
<td valign="top">
<p>15-Oct-2008 </p>
</td>
<td valign="top">
<p>23:08 </p>
</td>
<td valign="top">
<p>Not applicable</p>
</td>
</tr>
<tr>
<td valign="top">
<p>Microsoft.office.server.search.intl.resources.dll </p>
</td>
<td valign="top">
<p>12.0.6300.5000 </p>
</td>
<td valign="top">
<p>349,216 </p>
</td>
<td valign="top">
<p>13-Dec-2007 </p>
</td>
<td valign="top">
<p>20:56 </p>
</td>
<td valign="top">
<p>Not applicable </p>
</td>
</tr>
<tr>
<td valign="top">
<p>Ms.mss.hc.cab </p>
</td>
<td valign="top">
<p>Not Applicable </p>
</td>
<td valign="top">
<p>284,389 </p>
</td>
<td valign="top">
<p>19-Mar-2008 </p>
</td>
<td valign="top">
<p>11:04 </p>
</td>
<td valign="top">
<p>Not applicable </p>
</td>
</tr>
<tr>
<td valign="top">
<p>Ms.oss.admin.hc.cab </p>
</td>
<td valign="top">
<p>Not Applicable </p>
</td>
<td valign="top">
<p>438,535 </p>
</td>
<td valign="top">
<p>24-Mar-2008 </p>
</td>
<td valign="top">
<p>22:10 </p>
</td>
<td valign="top">
<p>Not applicable </p>
</td>
</tr>
<tr>
<td valign="top">
<p>Mssmsg.dll </p>
</td>
<td valign="top">
<p>12.0.6300.5000 </p>
</td>
<td valign="top">
<p>228,896 </p>
</td>
<td valign="top">
<p>13-Dec-2007 </p>
</td>
<td valign="top">
<p>20:56 </p>
</td>
<td valign="top">
<p>Not applicable </p>
</td>
</tr>
<tr>
<td valign="top">
<p>Notessetup.exe </p>
</td>
<td valign="top">
<p>12.0.6300.5000 </p>
</td>
<td valign="top">
<p>202,272 </p>
</td>
<td valign="top">
<p>13-Dec-2007 </p>
</td>
<td valign="top">
<p>20:56 </p>
</td>
<td valign="top">
<p>Not applicable </p>
</td>
</tr>
<tr>
<td valign="top">
<p>Pickertreedialog.js </p>
</td>
<td valign="top">
<p>Not Applicable </p>
</td>
<td valign="top">
<p>2,284 </p>
</td>
<td valign="top">
<p>22-Jan-2008 </p>
</td>
<td valign="top">
<p>22:31 </p>
</td>
<td valign="top">
<p>Not applicable </p>
</td>
</tr>
<tr>
<td valign="top">
<p>Portal.css </p>
</td>
<td valign="top">
<p>Not Applicable </p>
</td>
<td valign="top">
<p>35,301 </p>
</td>
<td valign="top">
<p>25-Mar-2008 </p>
</td>
<td valign="top">
<p>13:57 </p>
</td>
<td valign="top">
<p>Not applicable </p>
</td>
</tr>
<tr>
<td valign="top">
<p>Search.js </p>
</td>
<td valign="top">
<p>Not Applicable </p>
</td>
<td valign="top">
<p>26,550 </p>
</td>
<td valign="top">
<p>06-Sep-2006 </p>
</td>
<td valign="top">
<p>16:59 </p>
</td>
<td valign="top">
<p>Not applicable </p>
</td>
</tr>
<tr>
<td valign="top">
<p>Searchadmin.en-us.resx </p>
</td>
<td valign="top">
<p>Not Applicable </p>
</td>
<td valign="top">
<p>65,280 </p>
</td>
<td valign="top">
<p>25-Mar-2008 </p>
</td>
<td valign="top">
<p>13:36 </p>
</td>
<td valign="top">
<p>Not applicable </p>
</td>
</tr>
<tr>
<td valign="top">
<p>Searchdatadb.sql </p>
</td>
<td valign="top">
<p>Not Applicable </p>
</td>
<td valign="top">
<p>341,757 </p>
</td>
<td valign="top">
<p>25-Mar-2008 </p>
</td>
<td valign="top">
<p>13:36 </p>
</td>
<td valign="top">
<p>Not applicable </p>
</td>
</tr>
<tr>
<td valign="top">
<p>Searchdatadbupgrade.sql </p>
</td>
<td valign="top">
<p>Not Applicable </p>
</td>
<td valign="top">
<p>180,501 </p>
</td>
<td valign="top">
<p>25-Mar-2008 </p>
</td>
<td valign="top">
<p>13:36 </p>
</td>
<td valign="top">
<p>Not applicable </p>
</td>
</tr>
<tr>
<td valign="top">
<p>Searchdb.sql </p>
</td>
<td valign="top">
<p>Not Applicable </p>
</td>
<td valign="top">
<p>343,260 </p>
</td>
<td valign="top">
<p>25-Mar-2008 </p>
</td>
<td valign="top">
<p>13:36 </p>
</td>
<td valign="top">
<p>Not applicable </p>
</td>
</tr>
<tr>
<td valign="top">
<p>Searchdbupgrade.sql </p>
</td>
<td valign="top">
<p>Not Applicable </p>
</td>
<td valign="top">
<p>191,402 </p>
</td>
<td valign="top">
<p>25-Mar-2008 </p>
</td>
<td valign="top">
<p>13:36 </p>
</td>
<td valign="top">
<p>Not applicable </p>
</td>
</tr>
<tr>
<td valign="top">
<p>Spellchecker.js </p>
</td>
<td valign="top">
<p>Not Applicable </p>
</td>
<td valign="top">
<p>37,676 </p>
</td>
<td valign="top">
<p>07-Oct-2008 </p>
</td>
<td valign="top">
<p>22:28 </p>
</td>
<td valign="top">
<p>Not applicable </p>
</td>
</tr>
<tr>
<td valign="top">
<p>Sps.en-us.resx </p>
</td>
<td valign="top">
<p>Not Applicable </p>
</td>
<td valign="top">
<p>76,544 </p>
</td>
<td valign="top">
<p>25-Mar-2008 </p>
</td>
<td valign="top">
<p>13:56 </p>
</td>
<td valign="top">
<p>Not applicable </p>
</td>
</tr>
<tr>
<td valign="top">
<p>Spscore.en-us.resx </p>
</td>
<td valign="top">
<p>Not Applicable </p>
</td>
<td valign="top">
<p>85,536 </p>
</td>
<td valign="top">
<p>25-Mar-2008 </p>
</td>
<td valign="top">
<p>13:57 </p>
</td>
<td valign="top">
<p>Not applicable </p>
</td>
</tr>
<tr>
<td valign="top">
<p>Webtempsrch.xml </p>
</td>
<td valign="top">
<p>Not Applicable </p>
</td>
<td valign="top">
<p>1,131 </p>
</td>
<td valign="top">
<p>25-Mar-2008 </p>
</td>
<td valign="top">
<p>13:37 </p>
</td>
<td valign="top">
<p>Not applicable </p>
</td>
</tr>
</tbody>
</table>
<p>It explains why different versions of the file are present, only the default language file will be update by applying the December Cumulative Update.</p>
<h4>Resolution</h4>
<ul>
<li>Replace the file &ldquo;c:\program files\common files\microsoft shared\web server extensions\12\template\layouts\<i>any_lcid</i>\HtmlEditor.js&rdquo; with the same file from 1033 <br />version. </li>
<li>Additionally, you could realign all servers in the farm, including language packs by deploying WSS/MOSS SP2 and Language Packs for SP2. References can be found in the next section. </li>
</ul>]]></content:encoded>
    </item>
    <item>
      <title>SharePoint 2007 and General Network Errors</title>
      <link>https://docs.microsoft.com/archive/blogs/pabenois/sharepoint-2007-and-general-network-errors</link>
      <pubDate>Thu, 10 Jun 2010 06:37:15 GMT</pubDate>
      <dc:creator><![CDATA[pabenois]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.technet.microsoft.com/pabenois/2010/06/10/sharepoint-2007-and-general-network-errors/</guid>
      <description><![CDATA[I observed lately quite a lot of General Network Errors occurring on a few production servers at...]]></description>
      <content:encoded><![CDATA[<p>I observed lately quite a lot of General Network Errors occurring on a few production servers at some customers.    <br />I have been performing some checks on various environments and it looks like these errors are widely distributed among servers in various farms.</p>  <p>Multiple Error entries appear in the Application log of all SharePoint servers of the farms:</p>  <p>The error is raised because the SynAttackProtect registry key has its default value of 1 set up on the SQL server hosting SharePoint ® databases and/or on the SharePoint ® servers in farms</p>  <p><font size="1" face="Lucida Console">synattackprotect&quot;=dword:00000001</font></p>  <p>A TCP Synchronize (SYN) attack is a denial-of-service attack that exploits the retransmission and time-out behavior of the Synchronize-Acknowledgement (SYN-ACK) segment during the TCP three-way handshake to create a large number of half-open TCP connections. Depending on the TCP/IP protocol implementation, a large number of half-open TCP connections could do any of the following:</p>  <ul>   <li>Use all available memory. </li>    <li>Use all possible entries in the TCP Transmission Control Block (TCB), an internal table used to track TCP connections. Once the half-open connections use all the entries, further connection attempts are responded to with a TCP connection reset. </li>    <li>Use all available half-open connections. Once all the half-open connections are used, further connection attempts are responded to with a TCP connection reset. </li> </ul>  <p>To create a large number of TCP half-open connections, attackers send a large number of SYN segments, each from a spoofed IP address and TCP port number. Each spoofed IP address and TCP port number are for a process that does not respond to the SYN-ACKs being sent by the attacked host. SYN attacks are typically used to render Internet servers inoperative.</p>  <p>To mitigate the impact on a host experiencing a SYN attack, TCP/IP minimizes the amount of resources devoted to incomplete TCP connections and reduces the amount of time before abandoning half-open connections. When a SYN attack is detected, TCP/IP in Windows Server 2003 and Windows XP lowers the number of retransmissions of the SYN-ACK segment and does not allocate memory or table entry resources for the connection until the TCP three-way handshake has been completed.</p>  <p>You can control SYN attack protection through the SynAttackProtect registry entry at HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\Tcpip\Parameters (type REG_DWORD). You set SynAttackProtect to 0 to disable SYN attack protection and to 1 to enable it. </p>  <p>For TCP/IP in Windows XP (all versions) and Windows Server 2003 with no service packs installed, SynAttackProtect is set to 0 by default. For TCP/IP in Windows Server 2003 SP1, SynAttackProtect is set to 1 by default.</p>  <p>For more information about TCP connection behavior and related registry entries, see </p>  <p>· <a href="https://www.microsoft.com/technet/prodtechnol/windowsserver2003/technologies/networking/tcpip03.mspx">Microsoft Windows Server 2003 TCP/IP Implementation Details</a></p>  <p>· <a href="https://technet.microsoft.com/en-us/library/bb878132.aspx">https://technet.microsoft.com/en-us/library/bb878132.aspx</a></p>  <p>The issue is also extensively described in this blog post: <a href="https://blogs.msdn.com/sql_protocols/archive/2006/04/12/574608.aspx">https://blogs.msdn.com/sql_protocols/archive/2006/04/12/574608.aspx</a></p>  <p>I did not performed in-depth analysis in order to identify the elements that are the causing the packets backlog queue (which is max to 200 by default on w2k3 standard server), to be exhausted.</p>  <p>Depending on the OS version, the default setting for the SynAttackProtect might be different:</p>  <p>   <table border="1" cellspacing="0" cellpadding="0" width="432"><tbody>       <tr>         <td valign="top" width="215">           <p><b>OS version</b></p>         </td>          <td valign="top" width="215">           <p><b>\SynAttackProtect default value</b></p>         </td>       </tr>        <tr>         <td valign="top" width="217">           <p>Windows Server 2003 RTM</p>         </td>          <td valign="top" width="217">           <p>0</p>         </td>       </tr>        <tr>         <td valign="top" width="219">           <p>Windows Server 2003 SP1</p>         </td>          <td valign="top" width="219">           <p>1</p>         </td>       </tr>        <tr>         <td valign="top" width="221">           <p>Windows Server 2003 SP2</p>         </td>          <td valign="top" width="221">           <p>1</p>         </td>       </tr>        <tr>         <td valign="top" width="223">           <p>Windows Server 2003 R2</p>         </td>          <td valign="top" width="223">           <p>1</p>         </td>       </tr>     </tbody></table> </p>  <p>The solution for this would be modifying the SynAttackProtect registry key on each server concerned by the issue, playing an active SharePoint ® role or a role in the general connectivity between servers in SharePoint ® farms.</p>  <p>Microsoft Windows Server 2003 Service Pack 1 and higher implements a security feature that reduces the size of the queue for concurrent TCP/IP connections to the server. This feature helps prevent denial of service attacks. Under heavy load conditions, the TCP/IP protocol in Windows Server 2003 may incorrectly identify valid TCP/IP connections as a denial of service attack. For more information see this</p>  <p>324270: How to harden the TCP/IP stack against denial of service attacks in Windows Server 2003: <a href="https://support.microsoft.com/kb/324270">https://support.microsoft.com/kb/324270</a></p>  <p>Applications or services connecting to SQL could experience network errors due connection forcibly closed by the OS like &quot;General network error&quot;.</p>  <h4>Recommendation</h4>  <p>On Windows 2003 SP1+ system with high number of TCP connections and/or heavy TCP traffic, set to 0 the registry key value &quot;SynAttackProtect&quot; under “HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters&quot; as explained in these two KB articles:</p>  <p>A BizTalk Server Host instance fails, and a &quot;General Network&quot; error is written to the Application log when the BizTalk Server-based server processes a high volume of documents</p>  <p><a href="https://support.microsoft.com/?id=899599">https://support.microsoft.com/?id=899599</a></p>  <p>910228: SQL Server 2005 Readme and installation requirements</p>  <p><a href="https://support.microsoft.com/kb/910228">https://support.microsoft.com/kb/910228</a></p>  <p></p>  <p><a name="_Toc231276158"></a></p> There is not a risk of elevation of privileges, remote code execution or any other security risk. It just makes it more subjective to Denial Of Service attacks, which should be handled by perimeter devices such a switches for instance.   <p></p>  <p>Hardening servers only might result in a situation where the customers facing this issues would put a SQL box directly connected to an unsecure network.</p>  <h4>Conclusion</h4>  <ul>   <li>Set the SynAttackProtect key value to 0 on the affected servers</li>    <li>Communicate the issue to the network infrastructure team to ensure this kind of attack is addressed on the “Layer 3” TCP Transport level</li> </ul>]]></content:encoded>
    </item>
    <item>
      <title>SharePoint 2007 Local vs. Global deployments</title>
      <link>https://docs.microsoft.com/archive/blogs/pabenois/sharepoint-2007-local-vs-global-deployments</link>
      <pubDate>Thu, 10 Jun 2010 05:17:00 GMT</pubDate>
      <dc:creator><![CDATA[pabenois]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.technet.microsoft.com/pabenois/2010/06/10/sharepoint-2007-local-vs-global-deployments/</guid>
      <description><![CDATA[Technorati Tags: Sharepoint,Development,Deployment  Solutions are deployed in one of two ways:...]]></description>
      <content:encoded><![CDATA[<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:73f2acf6-443c-47a8-a90d-2212fad7ecad" class="wlWriterEditableSmartContent">Technorati Tags: <a href="https://technorati.com/tags/Sharepoint" rel="tag">Sharepoint</a>,<a href="https://technorati.com/tags/Development" rel="tag">Development</a>,<a href="https://technorati.com/tags/Deployment" rel="tag">Deployment</a></div>  <p>Solutions are deployed in one of two ways: either locally or by using a timer service.    <br />This applies both to new deployments, as well as to deployments of solution upgrades.     <br />Both local and timer-based deployments can be triggered either by using command-line instructions or programmatically by using the object model.</p>  <p>Local deployments that are initiated from the command line by a user with administrator privileges run in the context of the administrator. If initiated by using the timer service, however, the deployment runs in the context of the timer job itself, which uses administrator pool account credentials. Either set of credentials should be sufficient to read and write to the configuration store.</p>  <h4>Local Deployment</h4>  <p>In a local deployment, solution files are deployed only to the computer from which the deployment operation was initiated. Under this scenario, the solution is not marked as &quot;deployed&quot; in the configuration database until the solution files are deployed to all applicable servers in the server farm. Then, in the case of new solution deployments, solution features are registered, and schema and definition files are committed to the configuration store.</p>  <h4>Timer Service Deployments</h4>  <p>In deployments that use the timer service, the deployment creates a timer job. This timer job is picked up by the timer service on each Web server in the server farm. The timer job uses the Windows SharePoint Services Administrative Web service to access appropriate privileges to deploy solution files to each computer.</p>  <p>Initially, manifest and feature manifests are parsed to find assembly and _layouts files, which are copied to the appropriate locations. All other files contained within a feature directory are copied to the feature directory. After solution files are copied to the target computers, a configuration reset is scheduled for all front-end Web servers; the reset then deploys the files and restarts Microsoft Internet Information Services (IIS).</p>  <p>For upgrades, the deployment has no impact to the end user experience. The new versions of the solution files do not overwrite the old files; therefore, if a computer is restarted, or the upgrade process is aborted, the servers are synchronized with their other data files.</p>  <p>Finally, for new solution deployments, solution features are registered, and schema and definition files are committed to the configuration store.</p>  <p>I recently cam acroos the following issue:</p>  <p><font size="1" face="Lucida Console">stsadm -o deploysolution -name &quot;my_solution.wsp&quot; –url &quot;https://server.somedom.net&quot; -local –allowGacDeployment</font></p>  <p>This command fails, the following message is displayed:</p>  <p><font size="1" face="Lucida Console">This solution contains no resources scoped for a Web application and cannot be deployed to a particular Web application</font>.</p>  <p>While this command completes successfully</p>  <p><font size="1" face="lucinda">stsadm -o deploysolution -name &quot;my_solution.wsp&quot; -local –allowGacDeployment</font></p>  <p>When looking at the manifest.xml and feature.xml files for this package, we can figure out this package has no “resources”, which means no content has to be copied to a particular web application virtual directory.</p>  <p>The bottom line is that if your solution specifies elements (a.k.a. &quot;resources&quot;) that need to be merged into a Web.config file (i.e. &quot;for a Web application&quot;) then you <u>must</u> specify the <var>url</var> parameter. If your solution does not have an assembly or if your solution contains workflows, then you <u>cannot</u> specify the <var>url</var> parameter.</p>  <p>The same goes for packages that would not contain an assembly.</p>]]></content:encoded>
    </item>
    <item>
      <title>MOSS 2007 databases corruption</title>
      <link>https://docs.microsoft.com/archive/blogs/pabenois/moss-2007-databases-corruption</link>
      <pubDate>Thu, 10 Jun 2010 03:34:12 GMT</pubDate>
      <dc:creator><![CDATA[pabenois]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.technet.microsoft.com/pabenois/2010/06/10/moss-2007-databases-corruption/</guid>
      <description><![CDATA[I lately came across a situation where one of my customers suffers from corruption in the production...]]></description>
      <content:encoded><![CDATA[<p>I lately came across a situation where one of my customers suffers from corruption in the production MOSS content databases, most likely due to some SAN related corruption issue.</p>  <p>This corruption was only discovered after several weeks, and unfortunately the earliest usable backup dates from weeks ago. On top of this, the transaction logs that could be used to “replay” all database transactions starting from this last good backup, are also unusable.</p>  <p>The first thing to do would be to checkout the I/O subsystem - as it looks like that is what caused the problem. The damaged pages are contiguous, which usually is a symptom of I/O subsystem failure. </p>  <p>This customer came to me with questions about the way to fix this issue. The answer is pretty obvious: restore the last valid backup. Any operation on the MOSS databases would totally unsupported, which means that DBCC REPAIR_WITH_DATA_LOSS scenario may not be applied here. </p>  <p>I must stress that the only official and supported solution Microsoft is able to provide at this point, is to revert to the last usable database. </p>  <p>Basically, the only thing I have been able to do for this customer is helping them evaluate which kind of content is affected by the corruption.</p>  <p>So, what I have to do is identify which content is excatly affected by the corrption.</p>  <p>When looking at the DBCC CHECK output, I have the following:</p>  <p>&#160;</p>  <p><font size="1" face="Lucida Console">DBCC results for 'AllDocStreams'.</font></p>  <p><font size="1" face="Lucida Console">Msg 8928, Level 16, State 1, Line 1</font></p>  <p><font size="1" face="Lucida Console">Object ID 293576084, index ID 1, partition ID 72057595341373440, alloc unit ID 72057594043957248 (type LOB data): Page (1:1760824) could not be processed. See other errors for details.</font></p>  <p><font size="1" face="Lucida Console">Msg 8965, Level 16, State 1, Line 1</font></p>  <p><font size="1" face="Lucida Console">Table error: Object ID 293576084, index ID 1, partition ID 72057595341373440, alloc unit ID 72057594043957248 (type LOB data). The off-row data node at page (1:1760824), slot 0, text ID 813336166400 is referenced by page (1:1760788), slot 0, but was not seen in the scan.</font></p>  <p><font size="1" face="Lucida Console">Msg 8928, Level 16, State 1, Line 1</font></p>  <p><font size="1" face="Lucida Console">Object ID 293576084, index ID 1, partition ID 72057595341373440, alloc unit ID 72057594043957248 (type LOB data): Page (1:1760825) could not be processed. See other errors for details.</font></p>  <p><font size="1" face="Lucida Console">Msg 8965, Level 16, State 1, Line 1</font></p>  <p><font size="1" face="Lucida Console">Table error: Object ID 293576084, index ID 1, partition ID 72057595341373440, alloc unit ID 72057594043957248 (type LOB data). The off-row data node at page (1:1760825), slot 0, text ID 813336166400 is referenced by page (1:1760788), slot 0, but was not seen in the scan.</font></p>  <p><font size="1" face="Lucida Console">Msg 8929, Level 16, State 1, Line 1</font></p>  <p><font size="1" face="Lucida Console">Object ID 293576084, index ID 1, partition ID 72057595341373440, alloc unit ID 72057595387314176 (type In-row data): Errors found in off-row data with ID 813336166400 owned by data record identified by RID = (1:1916095:6)</font></p>  <p><font size="1" face="Lucida Console">There are 62627 rows in 855 pages for object &quot;AllDocStreams&quot;.</font></p>  <p><font size="1" face="Lucida Console">CHECKDB found 0 allocation errors and 5 consistency errors in table 'AllDocStreams' (object ID 293576084).</font></p>  <p>Based on this information, one thing we should do is to have a look at the rows that are damaged using the DBCC PAGE command</p>  <p>dbcc page ( {'dbname' | dbid}, filenum, pagenum [, printopt={0|1|2|3} ])</p>  <p>The filenum and pagenum parameters are taken from the page IDs that come from various system tables and appear in DBCC or other system error messages. A page ID of, say, (1:354) has filenum = 1 and pagenum = 354.</p>  <p>The printopt parameter has the following meanings:</p>  <p>· 0 - print just the page header</p>  <p>· 1 - page header plus per-row hex dumps and a dump of the page slot array (unless its a page that doesn't have one, like allocation bitmaps)</p>  <p>· 2 - page header plus whole page hex dump</p>  <p>· 3 - page header plus detailed per-row interpretation</p>  <p>Knowing this we run the following command for instance:</p>  <p><font size="1" face="Lucida Console">dbcc traceon (3604)</font></p>  <p><font size="1" face="Lucida Console">go</font></p>  <p><font size="1" face="Lucida Console">dbcc page (your_content_database_name, 1,1760824,3)</font></p>  <p><font size="1" face="Lucida Console">Go</font></p>  <p><font size="1" face="Lucida Console">dbcc traceon (3604)</font></p>  <p><font size="1" face="Lucida Console">go</font></p>  <p><font size="1" face="Lucida Console">dbcc page (your_content_database_name, 1,1760825,3)</font></p>  <p><font size="1" face="Lucida Console">go</font></p>  <p>Running this operation will dump the corrupted pages content. Based on this output we should able to identify which particular piece of content suffers from corruption.</p>  <p>The analysis of the output should provide valuable information in order to have a more precise evaluation of the risks and have a better understanding of the impact on the entire MOSS environment.</p>  <p>Having a look at the content of the SQL pages dumps, we have been to figure out the corrupted items are not always the current ones. It explains why the last published item is still accessible. However, when trying to access the version history of the item through the UI, we get an “unknow error” message due to the corruption of some of the item versions.</p>  <p>In no case it would be feasible to delete the database rows containing the corrupted versions of the item without globally breaking the integrity of the item.</p>  <p>&#160;</p>  <p>This is actually an easy scenario since the corruption affects data stored in the data rows (IndexID 1 in the DBCC Check output). You might be facing some cases where the corruption affects the page header (IndexID –1 in the DBCC CHeck output) itself as below</p>  <p>Consider how a SQL page is structured:</p>  <p><a href="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/prod.evol.blogs.technet.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/81/92/metablogapi/3678.image_2.png" original-url="https://blogs.technet.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-81-92-metablogapi/3678.image_5F00_2.png"><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="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/prod.evol.blogs.technet.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/81/92/metablogapi/4336.image_thumb.png" original-url="https://blogs.technet.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-81-92-metablogapi/4336.image_5F00_thumb.png" width="244" height="207" /></a> </p>  <p>The clustered index is how the data is arranged physically; therefore there can be only one clustered index for a given table.</p>  <p>Internally if we need to add data, we do not shift everything on the page in order to insert it in the right place, we just use the slot array. Because there is only one slot array, this is the “physical” order of the data. </p>  <p>The corruption can affect the Page header, the Data rows or the Row offset array. Unfortunately, it looks like the index itself might be corrupted which is a scenario which makes the processing of the SQL page dumps way more difficult and complex: using DBCC IND in order to identify which page belongs to which object and so on…</p>  <p>In the latest example, some corruption occurred in the header and row offset array of the page as well. It means the following command cannot be run with the <b>printopt</b> parameter set to <b>3</b>, which was the option that made the relevant information about particular SharePoint items available to us in the Horizon scenario:</p>  <p>dbcc page ( {'dbname' | dbid}, filenum, pagenum [, printopt={0|1|2|3} ])</p>  <p>Not being able to use the <b>3 </b>switch is an additional demonstration of the fact that the data “metadata” is corrupted and the interpretation of the data is subsequently impossible.</p>  <p>Without being able to identify which SharePoint items are affected by the corruption, performing a repair on the database will leave this one in a state where the impact of the operation cannot be determined at all since we cannot match this data to any SharePoint equivalent object.</p>  <h4>Conclusion</h4>  <p>As a reminder, beyond the concerns expressed in this post, modifying the database schema or database structures is <u>unsupported</u> for additional reasons. Changes that you make to the database contents may be overwritten when you install updates or service packs for Windows SharePoint Services, or when you upgrade an installation to the next product version.</p>  <p>Regarded of the supportability, I would strongly advise to evaluate and implement a strong backup strategy, efficient proactive monitoring and a well-tested Disaster Recovery Planning in order to avoid or mitigate similar situations you might have in the future.</p>]]></content:encoded>
    </item>
  </channel>
</rss>