<?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>Bits&amp;Bytes</title>
    <atom:link
      href="https://docs.microsoft.com/archive/blogs/suryaj/feed.xml"
      rel="self"
      type="application/rss+xml" />
    <link>https://docs.microsoft.com/archive/blogs/suryaj/feed.xml</link>
    <description>Order in the chaotic world of bits and bytes</description>
    <lastBuildDate>Wed, 17 Apr 2019 03:28:41 GMT</lastBuildDate>
    <language>en-US</language>
    <sy:updatePeriod>hourly</sy:updatePeriod>
    <sy:updateFrequency>1</sy:updateFrequency>
    <item>
      <title>Logging with Enterprise Library</title>
      <link>https://docs.microsoft.com/archive/blogs/suryaj/logging-with-enterprise-library</link>
      <pubDate>Tue, 27 Jan 2009 20:33:00 GMT</pubDate>
      <dc:creator><![CDATA[sp jak]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/suryaj/2009/01/27/logging-with-enterprise-library/</guid>
      <description><![CDATA[As noted in the previous Logging blog post, the framework for our platform ended up using Enterprise...]]></description>
      <content:encoded><![CDATA[<P>As noted in the previous <A href="https://blogs.msdn.com/suryaj/archive/2009/01/09/logging.aspx" mce_href="https://blogs.msdn.com/suryaj/archive/2009/01/09/logging.aspx">Logging</A> blog post, the framework for our platform ended up using Enterprise Library 3.1. Some of the compelling reasons for choosing Enterprise Library over the alternative options were: </P>
<UL>
<LI>Breadth of listeners and&nbsp;formatters for free with access to source code </LI>
<LI>Config file driven design allowing you to turn on/turn off logging without changing a line of code </LI>
<LI>Proven and tested components helping you build on top of them with a high sense of reliability </LI></UL>
<P>The logging component of our framework provides a simple design-time experience to developers, abstracting away the generic APIs that Enterprise Library provides: </P>
<P style="MARGIN-LEFT: 40pt"><IFRAME style="PADDING-RIGHT: 0pt; PADDING-LEFT: 0pt; PADDING-BOTTOM: 0pt; MARGIN: 3px; WIDTH: 229px; PADDING-TOP: 0pt; HEIGHT: 178px" marginWidth=0 marginHeight=0 src="https://ijw7gg.blu.livefilestore.com/y1pk8lRjxR551L06UKEu81YdG_xXr-AbbD2-iB6IFegcgG6lZuNL6fGrLpmFKUwjW4ReQ3Unp4WhuM/LogClass.jpg" frameBorder=0 scrolling=no mce_src="https://ijw7gg.blu.livefilestore.com/y1pk8lRjxR551L06UKEu81YdG_xXr-AbbD2-iB6IFegcgG6lZuNL6fGrLpmFKUwjW4ReQ3Unp4WhuM/LogClass.jpg"></IFRAME></P>
<P>This is essentially a façade to Enterprise Library (currently version 3.1) where implementation of <EM>Debug</EM> looks similar to: </P>
<P style="MARGIN-LEFT: 36pt"><SPAN style="FONT-SIZE: 8pt; FONT-FAMILY: Arial"><SPAN style="COLOR: blue">public static void </SPAN><SPAN style="COLOR: black">Debug(</SPAN><SPAN style="COLOR: blue">string </SPAN><SPAN style="COLOR: black">log)</SPAN></SPAN><SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: Times New Roman"> </SPAN></P>
<P style="MARGIN-LEFT: 36pt"><SPAN style="FONT-SIZE: 8pt; COLOR: black; FONT-FAMILY: Arial">{</SPAN><SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: Times New Roman"> </SPAN></P>
<P style="MARGIN-LEFT: 72pt"><SPAN style="FONT-SIZE: 8pt; COLOR: blue; FONT-FAMILY: Arial">try</SPAN><SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: Times New Roman"> </SPAN></P>
<P style="MARGIN-LEFT: 72pt"><SPAN style="FONT-SIZE: 8pt; FONT-FAMILY: Arial"><SPAN style="COLOR: blue"></SPAN><SPAN style="COLOR: black">{</SPAN></SPAN><SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: Times New Roman"> </SPAN></P>
<P style="MARGIN-LEFT: 96pt"><SPAN style="FONT-SIZE: 8pt; FONT-FAMILY: Arial"><SPAN style="COLOR: blue"></SPAN><SPAN style="COLOR: #2b91af">Logger</SPAN><SPAN style="COLOR: black">.Write(log, CATEGORY_DEBUG); </SPAN><SPAN style="COLOR: #2b91af">// CATEGORY_DEBUG is a string for category "Debug"</SPAN></SPAN><SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: Times New Roman"> </SPAN></P>
<P style="MARGIN-LEFT: 72pt"><SPAN style="FONT-SIZE: 8pt; FONT-FAMILY: Arial"><SPAN style="COLOR: #2b91af"></SPAN><SPAN style="COLOR: black">}</SPAN></SPAN><SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: Times New Roman"> </SPAN></P>
<P style="MARGIN-LEFT: 72pt"><SPAN style="FONT-SIZE: 8pt; FONT-FAMILY: Arial"><SPAN style="COLOR: #2b91af"></SPAN><SPAN style="COLOR: blue">catch</SPAN><SPAN style="COLOR: black"> (System.Configuration.</SPAN><SPAN style="COLOR: #2b91af">ConfigurationException </SPAN><SPAN style="COLOR: black">configErr)</SPAN></SPAN><SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: Times New Roman"> </SPAN></P>
<P style="MARGIN-LEFT: 72pt"><SPAN style="FONT-SIZE: 8pt; FONT-FAMILY: Arial"><SPAN style="COLOR: #2b91af"></SPAN><SPAN style="COLOR: black">{</SPAN></SPAN><SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: Times New Roman"> </SPAN></P>
<P style="MARGIN-LEFT: 96pt"><SPAN style="FONT-SIZE: 8pt; FONT-FAMILY: Arial"><SPAN style="COLOR: #2b91af"></SPAN><SPAN style="COLOR: black">System.Diagnostics.</SPAN><SPAN style="COLOR: #2b91af">Trace</SPAN><SPAN style="COLOR: black">.Write(</SPAN><SPAN style="COLOR: blue">string</SPAN><SPAN style="COLOR: black">.Format(</SPAN><SPAN style="COLOR: #a31515">"Config info missing for Logger. Details: {0}. Exception is: {1}"</SPAN></SPAN><SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: Times New Roman"> </SPAN><SPAN style="FONT-SIZE: 8pt; FONT-FAMILY: Arial"><SPAN style="COLOR: #a31515"></SPAN><SPAN style="COLOR: black">, GetDebugInfo()</SPAN></SPAN><SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: Times New Roman"> </SPAN><SPAN style="FONT-SIZE: 8pt; COLOR: black; FONT-FAMILY: Arial">, configErr.ToString()));</SPAN><SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: Times New Roman"> </SPAN></P>
<P style="MARGIN-LEFT: 72pt"><SPAN style="FONT-SIZE: 8pt; FONT-FAMILY: Arial"><SPAN style="COLOR: #a31515"></SPAN><SPAN style="COLOR: black">} </SPAN></SPAN><SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: Times New Roman"></SPAN></P>
<P style="MARGIN-LEFT: 72pt"><SPAN style="FONT-SIZE: 8pt; FONT-FAMILY: Arial"><SPAN style="COLOR: #a31515"></SPAN><SPAN style="COLOR: blue">catch (</SPAN><SPAN style="COLOR: #2b91af">Exception </SPAN><SPAN style="COLOR: black">e)</SPAN></SPAN><SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: Times New Roman"> </SPAN></P>
<P style="MARGIN-LEFT: 72pt"><SPAN style="FONT-SIZE: 8pt; FONT-FAMILY: Arial"><SPAN style="COLOR: #2b91af"></SPAN><SPAN style="COLOR: black">{</SPAN></SPAN><SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: Times New Roman"> </SPAN></P>
<P style="MARGIN-LEFT: 96pt"><SPAN style="FONT-SIZE: 8pt; FONT-FAMILY: Arial"><SPAN style="COLOR: #2b91af"></SPAN><SPAN style="COLOR: black">System.Diagnostics.</SPAN><SPAN style="COLOR: #2b91af">Trace</SPAN><SPAN style="COLOR: black">.Write(</SPAN><SPAN style="COLOR: blue">string</SPAN><SPAN style="COLOR: black">.Format(</SPAN><SPAN style="COLOR: #a31515">"Error occured while logging the debug statement: {0}:. Exception is: {1}"</SPAN><SPAN style="COLOR: black">, log,e.ToString()));</SPAN></SPAN><SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: Times New Roman"> </SPAN></P>
<P style="MARGIN-LEFT: 72pt"><SPAN style="FONT-SIZE: 8pt; FONT-FAMILY: Arial"><SPAN style="COLOR: #a31515"></SPAN><SPAN style="COLOR: black">} </SPAN></SPAN><SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: Times New Roman"></SPAN></P>
<P style="MARGIN-LEFT: 36pt"><SPAN style="FONT-SIZE: 8pt; COLOR: black; FONT-FAMILY: Arial">} </SPAN></P>
<P>Overloaded methods of Debug, Info, Warn and Error provide the consuming components to pass in context ids, severity for error messages among multiple others. </P>
<P>Consuming .NET applications (exe's, web site, web services, windows services) would: </P>
<OL>
<LI>Reference essentially only the framework assembly (don't need to add all the enterprise library assemblies) </LI>
<LI>Ensure appdomain's config file (app.config/web.config/.exe.config) has the requisite entries (In my next blogpost I will talk as how we went about automating this for SharePoint Web Applications) </LI></OL>
<P>Now all the developer would need to do is use the lightweight <SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Courier New"><SPAN style="COLOR: #2b91af">Log</SPAN>.Debug(<SPAN style="COLOR: #a31515">"Just log me"</SPAN>)</SPAN>and the operations/engineering team&nbsp;can use tail/sql query/DebugView/trace listeners/event viewer/inbox to troubleshoot&nbsp;and/or analyze system issues</SPAN></P>]]></content:encoded>
    </item>
    <item>
      <title>Report Approval Workflow</title>
      <link>https://docs.microsoft.com/archive/blogs/suryaj/report-approval-workflow</link>
      <pubDate>Mon, 12 Jan 2009 13:10:00 GMT</pubDate>
      <dc:creator><![CDATA[sp jak]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/suryaj/2009/01/12/report-approval-workflow/</guid>
      <description><![CDATA[One of the visions of this reporting platform was to become the single source of truth for...]]></description>
      <content:encoded><![CDATA[<P>One of the visions of this reporting platform was to become the single source of truth for Marketing. It would be a centralized destination for marketers from around the global subsidiaries to, where primarily their task might be one among the following: </P>
<OL style="MARGIN-LEFT: 38pt">
<LI>Design, save or share reports </LI>
<LI>View reports available on the platform </LI>
<LI>
<DIV>Schedule often viewed report </DIV></LI></OL>
<P>Requirements 1 and 2 could conflict and contradict each other given the global nature of our platform. An example would be a marketer who builds a report a certain way and saves it to the platform. Another marketer views this report and there is no way for us, as a platform, to guarantee the validity of the report. Scenarios like this could certainly erode the trust and our vision to be the single source of truth. </P>
<P>To overcome this challenge while still satisfying the overall goal of an open platform which allows users to design, view, save and schedule reports, we introduced a concept of report approval workflow. </P>
<UL>
<LI>Use cases of scenario 1 would primarily design and save reports to a draft reports list. </LI>
<LI>Use cases of scenario 2 would primarily view published reports list which are certified reports </LI></UL>
<P>What happens between a) and b) is where the report approval workflow triggers and that's what makes the reports in published reports list certified. </P>
<OL>
<LI>Users from use case 1 (let's call him contributor) above design and save a report to the drafts list. After going through multiple iterations, once the user is comfortable with the design of the report, he chooses "Publish" from the SPS context menu. The contributor is prompted to choose a destination <EM>report folder</EM> before he can submit the report for publishing (the report folder drop down is populated from a Report Approvers SharePoint list which contains the report folders and their corresponding approvers alias) </LI>
<LI>At this point the workflow kicks in. Workflow looks up the name of the approvers for the report folder chosen by the user. It creates a SharePoint task for each approver and sends an email with content asking for report approval </LI>
<LI>
<DIV>The approver(s) can choose to approve, reject or ask the user to make modifications to the report. </DIV>
<OL>
<LI>If the report is approved, it is moved from the draft to the corresponding folder in the published reports list. If the destination folder doesn't exist, the workflow creates a new folder assigns full permissions only to the approvers/admins and RO to all other authenticated users. </LI>
<LI>
<DIV>If the report is rejected or medications have been requested, the report stays in the drafts list </DIV>
<P>An email is sent to the report contributor letting him know the outcome of the process </P></LI></OL></LI></OL>
<P>This workflow was developed using the Approval Workflow Sample from the <A href="https://www.microsoft.com/downloads/details.aspx?FamilyId=6D94E307-67D9-41AC-B2D6-0074D6286FA9&amp;displaylang=en" mce_href="https://www.microsoft.com/downloads/details.aspx?FamilyId=6D94E307-67D9-41AC-B2D6-0074D6286FA9&amp;displaylang=en">SharePoint Server 2007 SDK</A> as the base. Some of the features of this modified workflow that I would like to call out are: </P>
<UL>
<LI>
<DIV><STRONG>Meta-data inside a SharePoint list</STRONG>: The workflow as well as certain pieces of UI needs the list of approvers for a given report folder which was stored in a SharePoint list. The nice thing of doing it this way is that a) you can re-use the list info in other places within SharePoint like DIP (document information panel), SharePoint web parts among other places b) You get both a persistence medium as well as nice UI for your site admins to manage the meta-data. </DIV></LI>
<LI>
<DIV><STRONG>Config info inside a SharePoint list</STRONG>: Report approval workflow is heavily config driven where you can customize the same workflow to publish to a different list, modify subject/content of email to approvers, contributors, and enable/disable sending email among multiple other ones. </DIV></LI>
<LI><STRONG>Logging</STRONG>: Centralized logging using the Logging component described <A href="https://blogs.msdn.com/suryaj/archive/2009/01/09/logging.aspx" mce_href="https://blogs.msdn.com/suryaj/archive/2009/01/09/logging.aspx">here</A>. </LI></UL>
<P>Some of the common <EM>activities</EM> that were fairly used across the workflow are: </P>
<UL>
<LI>
<DIV><STRONG>Create Folder</STRONG>: Creating a folder on the destination Published Reports List requires that all <SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Courier New"><SPAN style="COLOR: #2b91af">List</SPAN>&lt;<SPAN style="COLOR: #2b91af">Contact</SPAN>&gt; admins</SPAN> have full permissions: </DIV>
<P style="MARGIN-LEFT: 36pt"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Courier New"><SPAN style="COLOR: #2b91af">SPFolder</SPAN> spFld = list.RootFolder.SubFolders.Add(folder); </SPAN></P>
<P style="MARGIN-LEFT: 36pt"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Courier New">spFld.Item.BreakRoleInheritance(<SPAN style="COLOR: blue">true</SPAN>); </SPAN></P>
<P style="MARGIN-LEFT: 36pt"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Courier New"><SPAN style="COLOR: blue">foreach</SPAN> (<SPAN style="COLOR: #2b91af">Contact</SPAN> admin <SPAN style="COLOR: blue">in</SPAN> admins) </SPAN></P>
<P style="MARGIN-LEFT: 36pt"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Courier New">{ </SPAN></P>
<P style="MARGIN-LEFT: 60pt"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Courier New"><SPAN style="COLOR: #2b91af">SPRoleAssignment</SPAN> userRoleAssignment = <SPAN style="COLOR: blue">new</SPAN> <SPAN style="COLOR: #2b91af">SPRoleAssignment</SPAN>(admin.GetPrincipal(list.ParentWeb)); </SPAN></P>
<P style="MARGIN-LEFT: 60pt"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Courier New">userRoleAssignment.RoleDefinitionBindings.Add(list.ParentWeb.RoleDefinitions.GetByType(<SPAN style="COLOR: #2b91af">SPRoleType</SPAN>.Administrator)); </SPAN></P>
<P style="MARGIN-LEFT: 60pt"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Courier New">spFld.Item.RoleAssignments.Add(userRoleAssignment); </SPAN></P>
<P style="MARGIN-LEFT: 36pt"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Courier New">} </SPAN></P>
<P style="MARGIN-LEFT: 36pt"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Courier New">spFld.Item.Update();</SPAN> </P></LI>
<LI>
<DIV><STRONG>File Exists</STRONG>: Check if a <SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Courier New">fileName</SPAN> exists in the destination Published Reports <SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Courier New"><SPAN style="COLOR: #2b91af">SPList</SPAN> list </SPAN>in the <SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Courier New">folder</SPAN> </DIV>
<P style="MARGIN-LEFT: 36pt"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Courier New"><SPAN style="COLOR: #2b91af">SPFolder</SPAN> subFolder = list.RootFolder.SubFolders[folder]; </SPAN></P>
<P style="MARGIN-LEFT: 36pt"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Courier New"><SPAN style="COLOR: #2b91af">SPQuery</SPAN> query = <SPAN style="COLOR: blue">new</SPAN> <SPAN style="COLOR: #2b91af">SPQuery</SPAN>(); </SPAN></P>
<P style="MARGIN-LEFT: 36pt"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Courier New">query.Folder = subFolder; </SPAN></P>
<P style="MARGIN-LEFT: 36pt"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Courier New"><SPAN style="COLOR: #2b91af">SPListItemCollection</SPAN> folderFiles = list.GetItems(query); </SPAN></P>
<P style="MARGIN-LEFT: 36pt"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Courier New"><SPAN style="COLOR: blue">for</SPAN> (<SPAN style="COLOR: blue">int</SPAN> i = 0; i &lt; folderFiles.Count; i++) </SPAN></P>
<P style="MARGIN-LEFT: 36pt"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Courier New">{ </SPAN></P>
<P style="MARGIN-LEFT: 60pt"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Courier New"><SPAN style="COLOR: blue">if</SPAN> (fileName.Equals(folderFiles[i].Name, <SPAN style="COLOR: #2b91af">StringComparison</SPAN>.CurrentCultureIgnoreCase)) </SPAN></P>
<P style="MARGIN-LEFT: 60pt"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Courier New">{ </SPAN></P>
<P style="MARGIN-LEFT: 74pt"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Courier New">&nbsp;&nbsp;&nbsp;&nbsp;ret = <SPAN style="COLOR: blue">true</SPAN>; </SPAN></P>
<P style="MARGIN-LEFT: 96pt"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Courier New"><SPAN style="COLOR: blue">break</SPAN>; </SPAN></P>
<P style="MARGIN-LEFT: 60pt"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Courier New">} </SPAN></P>
<P style="MARGIN-LEFT: 36pt"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Courier New">}</SPAN> </P></LI>
<LI>
<DIV><STRONG>Get Approvers</STRONG>: We stored the report folder name and its approvers in a SharePoint list. When the workflow needed to know the names of the approvers for a given report folder, we discovered that SharePoint doesn't exactly return what we store inside it where the pattern seemed to be: <SPAN style="FONT-SIZE: 10pt; COLOR: green; FONT-FAMILY: Courier New">1;#Joe;#23;#Henry;#19;#Andrew</SPAN>. So we wrote our little method to retrieve the <SPAN style="FONT-SIZE: 10pt; COLOR: #2b91af; FONT-FAMILY: Courier New">List </SPAN>of approvers where <SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Courier New"><SPAN style="COLOR: #2b91af">Constants</SPAN>.APPROVERSDELIMITCHAR = <SPAN style="COLOR: #a31515">';'</SPAN></SPAN>: </DIV>
<P style="MARGIN-LEFT: 36pt"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Courier New"><SPAN style="COLOR: #2b91af">List</SPAN>&lt;<SPAN style="COLOR: blue">string</SPAN>&gt; ret = <SPAN style="COLOR: blue">new</SPAN> <SPAN style="COLOR: #2b91af">List</SPAN>&lt;<SPAN style="COLOR: blue">string</SPAN>&gt;(); </SPAN></P>
<P style="MARGIN-LEFT: 36pt"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Courier New"><SPAN style="COLOR: blue">string</SPAN>[] splitApprovers = approverItemVal.Split(<SPAN style="COLOR: blue">new</SPAN> <SPAN style="COLOR: blue">char</SPAN>[] { <SPAN style="COLOR: #2b91af">Constants</SPAN>.APPROVERSDELIMITCHAR }, </SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Courier New"><SPAN style="COLOR: #2b91af">StringSplitOptions</SPAN>.RemoveEmptyEntries); </SPAN></P>
<P style="MARGIN-LEFT: 36pt"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Courier New"><SPAN style="COLOR: blue">for</SPAN>(<SPAN style="COLOR: blue">int</SPAN> i = 0; i &lt; splitApprovers.Length; i++) </SPAN></P>
<P style="MARGIN-LEFT: 36pt"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Courier New">{ </SPAN></P>
<P style="MARGIN-LEFT: 60pt"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Courier New"><SPAN style="COLOR: blue">if</SPAN>(0 != i % 2) <SPAN style="COLOR: green">//The pattern needs us to split where every second one is our value </SPAN></SPAN></P>
<P style="MARGIN-LEFT: 60pt"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Courier New">ret.Add(splitApprovers[i].Split(<SPAN style="COLOR: blue">new</SPAN> <SPAN style="COLOR: blue">char</SPAN>[] { <SPAN style="COLOR: #2b91af">Constants</SPAN>.METAINFOPARSERCHAR })[1]); </SPAN></P>
<P style="MARGIN-LEFT: 36pt"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Courier New">} </SPAN></P></LI></UL>]]></content:encoded>
    </item>
    <item>
      <title>Logging</title>
      <link>https://docs.microsoft.com/archive/blogs/suryaj/logging</link>
      <pubDate>Fri, 09 Jan 2009 13:23:00 GMT</pubDate>
      <dc:creator><![CDATA[sp jak]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/suryaj/2009/01/09/logging/</guid>
      <description><![CDATA[Given the scope of the reporting platform, one of the first things we identified we needed is a...]]></description>
      <content:encoded><![CDATA[<P>Given the scope of the reporting platform, one of the first things we identified we needed is a framework to provide common functionality. These help you standardize components, structure data while solving the problem of migration or upgrade at one place and one time </P>
<P>One of them first pre-requisites for customer facing component has got be Logging or Tracing as you would like to call it. Logging is highly useful to troubleshoot or debug issues, capturing errors, auditing code paths or events as they occur. The analysis of these logs can lead to increased code quality, improved business scenarios, quick turnaround on issues as they arise and high predictability in getting to the root cause of an issue among other things. </P>
<P>A few choices for the logging component we could use were: </P>
<UL>
<LI>Write our own customizable listeners, writers, formatters as part of our logging library </LI>
<LI>Write custom <A href="https://msdn.microsoft.com/en-us/library/aa979522.aspx" mce_href="https://msdn.microsoft.com/en-us/library/aa979522.aspx">TraceProvider</A> utilizing the underlying MOSS framework to emit logs into ULS </LI>
<LI>Enterprise Library </LI></UL>
<P>In the end our choice was to use Enterprise library as our core component for logging functionality since it encompasses and provides beyond what 1 and 2 above offers. In order to maintain consistency and to standardize the logging functionality while ensuring backward compatibility, we provided a wrapper class around the Enterprise Library's Logger functionality. To the consuming component or application we abstract all the base functionality and provide four simple methods Debug, Info, Warn, and Error. </P>
<P><SPAN style="COLOR: #333333"><SPAN style="TEXT-DECORATION: underline">Config File</SPAN>: Once the consuming application or component integrates the library for logging, they use a configuration file to drive Logger to emit the&nbsp;tracing statements to a common destination. This common destination could be windows trace, flat file, event viewer, database or a remote service. This file needs to be part of the main application's config file (app.config/web.config/[MAIN APPLICATION NAME].exe.config). </SPAN></P>
<P>We provided a SharePoint solution using <A href="https://msdn.microsoft.com/en-us/library/microsoft.sharepoint.administration.spwebconfigmodification.aspx" mce_href="https://msdn.microsoft.com/en-us/library/microsoft.sharepoint.administration.spwebconfigmodification.aspx">SPWebConfigModification</A><SPAN style="COLOR: #333333"> which allowed us to add Enterprise Library related config entries to any web application in our farm. The same solution was added to the central admin, SSP Admin as well as our main site. </SPAN></P>
<P>For viewing the logs as they are being written, tenants would use tail/sql query/<A href="https://www.microsoft.com/technet/sysinternals/Miscellaneous/DebugView.mspx" mce_href="https://www.microsoft.com/technet/sysinternals/Miscellaneous/DebugView.mspx">DebugView</A>/trace listeners/event viewer/e-mail&nbsp;inbox/custom destination depending on how the <EM>destination(s) </EM>is configured.</P>]]></content:encoded>
    </item>
    <item>
      <title>Accessing CA Search Admin with SPN set for Index Server</title>
      <link>https://docs.microsoft.com/archive/blogs/suryaj/accessing-ca-search-admin-with-spn-set-for-index-server</link>
      <pubDate>Fri, 05 Dec 2008 15:20:00 GMT</pubDate>
      <dc:creator><![CDATA[sp jak]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/suryaj/2008/12/05/accessing-ca-search-admin-with-spn-set-for-index-server/</guid>
      <description><![CDATA[Side effect of setting up an SPN for the index server is that your search administration page(s) for...]]></description>
      <content:encoded><![CDATA[<P>Side effect of setting up an SPN for the index server is that your search administration page(s) for central administration will be broken. This happens as accessing farm level search administration pages via the Central Administration UI results in request being sent to the root SearchAdmin.asmx. As this web site now accepts only Kerberos tokens, the client will be asked to authenticate themselves using Kerberos protocol. Ensuing request for Kerberos ticket to KDC will be a response packet with a service ticket encrypted with SSP domain account's password. Since the root web site is running under Network service account, it will be unsuccessful in decrypting the packet, resulting in access denial to the root web service (Refer to <A href="https://blogs.msdn.com/suryaj/archive/2008/11/13/enterprise-search.aspx" mce_href="https://blogs.msdn.com/suryaj/archive/2008/11/13/enterprise-search.aspx">Enterprise Search</A> and <A href="https://blogs.msdn.com/suryaj/archive/2008/11/03/kerberos-protocol.aspx" mce_href="https://blogs.msdn.com/suryaj/archive/2008/11/03/kerberos-protocol.aspx">Kerberos Protocol</A> for more details). More specifically accessing the following pages will result in a failure as shown below: </P>
<UL>
<LI>
<DIV>Central Administration -&gt; Operations -&gt; Services on Server -&gt; Office SharePoint Server Search Service Settings </DIV>
<P style="MARGIN-LEFT: 40pt"><IFRAME style="PADDING-RIGHT: 0pt; PADDING-LEFT: 0pt; PADDING-BOTTOM: 0pt; MARGIN: 3px; WIDTH: 720px; PADDING-TOP: 0pt; HEIGHT: 120px" marginWidth=0 marginHeight=0 src="https://ijw7gg.blu.livefilestore.com/y1pek01oegaRka3ZSq16gYuWMMdr-MZmCYFLGx28YEKTul2uMcTbMoUmEUusEmACDeA4sl4eMdL-GA/CA%20Search%20Error.jpg" frameBorder=0 scrolling=no mce_src="https://ijw7gg.blu.livefilestore.com/y1pek01oegaRka3ZSq16gYuWMMdr-MZmCYFLGx28YEKTul2uMcTbMoUmEUusEmACDeA4sl4eMdL-GA/CA%20Search%20Error.jpg"></IFRAME></P></LI></UL>
<UL>
<LI>
<DIV>Central Administration -&gt; Application Management -&gt; Search Service </DIV>
<P style="MARGIN-LEFT: 40pt"><IFRAME style="PADDING-RIGHT: 0pt; PADDING-LEFT: 0pt; PADDING-BOTTOM: 0pt; MARGIN: 3px; WIDTH: 720px; PADDING-TOP: 0pt; HEIGHT: 120px" marginWidth=0 marginHeight=0 src="https://ijw7gg.blu.livefilestore.com/y1plB2ZalqdVeaZUZ5JGgRRN75ZicNlhykdOzNdTm6QEx-HAd8AliePp1IOCfZmBgvwqBTjjSeOHiA/CA%20Search%20Service%20Error.jpg" frameBorder=0 scrolling=no mce_src="https://ijw7gg.blu.livefilestore.com/y1plB2ZalqdVeaZUZ5JGgRRN75ZicNlhykdOzNdTm6QEx-HAd8AliePp1IOCfZmBgvwqBTjjSeOHiA/CA%20Search%20Service%20Error.jpg"></IFRAME></P></LI></UL>
<P>In case you wanted to reconfigure your Farm's Search settings and/or wanted to use the above pages for other administrative tasks, follow the steps below on the Index server to work around the problem: </P>
<OL>
<LI><SPAN style="FONT-SIZE: 11pt; FONT-FAMILY: Calibri">Stop Windows SharePoint Services Timer service (windows service) on Index server </SPAN></LI>
<LI><SPAN style="FONT-SIZE: 11pt; FONT-FAMILY: Calibri">Change the application pool identity of the root web site Office Server Web Services, which is typically OfficeServerApplicationPool, to run under the SSP's domain account domain\sspacct </SPAN></LI>
<LI><SPAN style="FONT-SIZE: 11pt; FONT-FAMILY: Calibri">Set your farm settings by navigating to the Farm's Search settings pages listed above </SPAN></LI></OL>
<P>In order to revert steps (1) and (2) above, start the Windows SharePoint Services Timer service on the Index server. </P>]]></content:encoded>
    </item>
    <item>
      <title>SPN for Index Server</title>
      <link>https://docs.microsoft.com/archive/blogs/suryaj/spn-for-index-server</link>
      <pubDate>Thu, 04 Dec 2008 17:13:00 GMT</pubDate>
      <dc:creator><![CDATA[sp jak]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/suryaj/2008/12/04/spn-for-index-server/</guid>
      <description><![CDATA[If you had followed our blog post Configuring Kerberos Delegation (without infrastructure update),...]]></description>
      <content:encoded><![CDATA[<P>If you had followed our blog post <A href="https://blogs.msdn.com/suryaj/archive/2008/11/14/configuring-kerberos-delegation-without-infrastructure-update.aspx" mce_href="https://blogs.msdn.com/suryaj/archive/2008/11/14/configuring-kerberos-delegation-without-infrastructure-update.aspx">Configuring Kerberos Delegation (without infrastructure update)</A>, you might have noticed that we had asked you to setup an SPN for the Index server. You might ask why and how does the Index server come into picture when all I want to do is setup Kerberos for Excel Services. Allow us to explain: </P>
<P>As we had mentioned in our <A href="https://blogs.msdn.com/suryaj/archive/2008/11/13/enterprise-search.aspx" mce_href="https://blogs.msdn.com/suryaj/archive/2008/11/13/enterprise-search.aspx">Enterprise Search</A> blog post, Office Server Web services web site contains ECS as well as Search component for each of the SSPs created in the farm. Setting up SPN's for Ids 1, 2 and 4 (<A href="https://blogs.msdn.com/suryaj/archive/2008/11/14/configuring-kerberos-delegation-without-infrastructure-update.aspx" mce_href="https://blogs.msdn.com/suryaj/archive/2008/11/14/configuring-kerberos-delegation-without-infrastructure-update.aspx">Configuring Kerberos Delegation (without infrastructure update)</A>) would force both the search services (Central Administration and SSP administration) to use Kerberos protocol. </P>
<P>If Index and ECS roles are assigned to separate servers during the farm setup, and as a pre-requisite for Kerberos authentication, let us say you would have created a SPN in KDC for Ids 1, 2 and 4 from Step 1 and completed Step 2 and 3. Now if you try to access the search settings page under the SSP (/ssp/admin/_layouts/searchsspsettings.aspx) you would encounter authentication failure to access SSP search administration pages. The error message on the UI would be similar to: </P>
<P>"<SPAN style="FONT-SIZE: 8pt; COLOR: #4c4c4c; FONT-FAMILY: Tahoma">The search service is currently offline. Visit the Services on Server page in SharePoint Central Administration to verify whether the service is enabled. This might also be because an indexer move is in progress."</SPAN> </P>
<P>while the more descriptive errors in the ULS logs would be: </P>
<P><SPAN style="FONT-SIZE: 8pt; COLOR: red; FONT-FAMILY: Microsoft Sans Serif">Exception caught in Search Admin web-service proxy (client). System.Net.WebException: The request failed with HTTP status 401: Unauthorized. </SPAN></P>
<P><SPAN style="FONT-SIZE: 8pt; COLOR: red; FONT-FAMILY: Microsoft Sans Serif">at System.Web.Services.Protocols.SoapHttpClientProtocol.ReadResponse(SoapClientMessage message, WebResponse response, Stream responseStream, Boolean asyncCall) </SPAN></P>
<P><SPAN style="FONT-SIZE: 8pt; COLOR: red; FONT-FAMILY: Microsoft Sans Serif">at System.Web.Services.Protocols.SoapHttpClientProtocol.Invoke(String methodName, Object[] parameters) </SPAN></P>
<P><SPAN style="FONT-SIZE: 8pt; FONT-FAMILY: Microsoft Sans Serif"><SPAN style="COLOR: red">at Microsoft.Office.Server.Search.Administration.SearchWebServiceProxy.RunWithSoapExceptionHandling[T](String methodName, Object[] parameters)</SPAN> </SPAN></P>
<P>To resolve this issue ensure an SPN for the index server is setup using the SSP account as Id&nbsp;3 prescribes in the blog post <A href="https://blogs.msdn.com/suryaj/archive/2008/11/14/configuring-kerberos-delegation-without-infrastructure-update.aspx" mce_href="https://blogs.msdn.com/suryaj/archive/2008/11/14/configuring-kerberos-delegation-without-infrastructure-update.aspx">Configuring Kerberos Delegation (without infrastructure update)</A>. <SPAN style="FONT-SIZE: 8pt; FONT-FAMILY: Microsoft Sans Serif"></SPAN></P>]]></content:encoded>
    </item>
    <item>
      <title>Configuring Kerberos Delegation (without infrastructure update)</title>
      <link>https://docs.microsoft.com/archive/blogs/suryaj/configuring-kerberos-delegation-without-infrastructure-update</link>
      <pubDate>Fri, 14 Nov 2008 15:16:00 GMT</pubDate>
      <dc:creator><![CDATA[sp jak]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/suryaj/2008/11/14/configuring-kerberos-delegation-without-infrastructure-update/</guid>
      <description><![CDATA[This blog post will detail the steps needed to configure a SharePoint farm to successfully delegate...]]></description>
      <content:encoded><![CDATA[<P>This blog post will detail the steps needed to configure a SharePoint farm to successfully delegate credentials to a backend data source <STRONG>without the <A href="https://support.microsoft.com/kb/951695" mce_href="https://support.microsoft.com/kb/951695"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">Infrastructure update</SPAN></A></STRONG> (Infrastructure update for SharePoint 2007 resolves an issue with SSP delegation which I will talk about in my next blog post). To configure Kerberos delegation in a <A href="https://support.microsoft.com/kb/951695" mce_href="https://support.microsoft.com/kb/951695"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">SharePoint farm with Infrastructure update</SPAN></A> already installed please refer to this technet article: <A href="https://technet.microsoft.com/en-us/library/cc263449.aspx" mce_href="https://technet.microsoft.com/en-us/library/cc263449.aspx"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">Configure Kerberos authentication (Office SharePoint Server)</SPAN></A>. </P>
<P style="MARGIN-LEFT: 36pt">Configuring Kerberos delegation in a SharePoint farm for Excel Services involves the following steps: </P>
<OL style="MARGIN-LEFT: 90pt">
<LI>
<DIV><STRONG>Setting up SPN's</STRONG>: </DIV></LI>
<P style="MARGIN-LEFT: 10pt">As mentioned in the <A href="https://blogs.msdn.com/suryaj/archive/2008/11/03/kerberos-protocol.aspx" mce_href="https://blogs.msdn.com/suryaj/archive/2008/11/03/kerberos-protocol.aspx"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">Kerberos Protocol blog post</SPAN></A>, setting up SPN's is an essential prerequisite for Kerberos delegation. Following is an example of the SPN's that will need to be setup where the data source is a SSAS 2005 cube: </P>
<DIV style="MARGIN-LEFT: 40pt">
<TABLE class="" style="BORDER-COLLAPSE: collapse" border=0>
<COLGROUP>
<COL style="WIDTH: 12px">
<COL style="WIDTH: 100px">
<COL style="WIDTH: 270px">
<COL style="WIDTH: 220px"></COLGROUP>
<TBODY vAlign=top>
<TR>
<TD class="" style="BORDER-RIGHT: 0.5pt solid; PADDING-RIGHT: 7px; BORDER-TOP: 0.5pt solid; PADDING-LEFT: 7px; BORDER-LEFT: 0.5pt solid; BORDER-BOTTOM: 0.5pt solid">
<P style="TEXT-ALIGN: center"><STRONG>Id</STRONG></P></TD>
<TD class="" style="BORDER-RIGHT: 0.5pt solid; PADDING-RIGHT: 7px; BORDER-TOP: 0.5pt solid; PADDING-LEFT: 7px; BORDER-LEFT: medium none; BORDER-BOTTOM: 0.5pt solid">
<P style="TEXT-ALIGN: center"><STRONG>Service Class</STRONG></P></TD>
<TD class="" style="BORDER-RIGHT: 0.5pt solid; PADDING-RIGHT: 7px; BORDER-TOP: 0.5pt solid; PADDING-LEFT: 7px; BORDER-LEFT: medium none; BORDER-BOTTOM: 0.5pt solid">
<P style="TEXT-ALIGN: center"><STRONG>Host</STRONG></P></TD>
<TD class="" style="BORDER-RIGHT: 0.5pt solid; PADDING-RIGHT: 7px; BORDER-TOP: 0.5pt solid; PADDING-LEFT: 7px; BORDER-LEFT: medium none; BORDER-BOTTOM: 0.5pt solid">
<P style="TEXT-ALIGN: center"><STRONG>Service account</STRONG></P></TD></TR>
<TR>
<TD class="" style="BORDER-RIGHT: 0.5pt solid; PADDING-RIGHT: 7px; BORDER-TOP: medium none; PADDING-LEFT: 7px; BORDER-LEFT: 0.5pt solid; BORDER-BOTTOM: 0.5pt solid">
<P style="TEXT-ALIGN: center">1</P></TD>
<TD class="" style="BORDER-RIGHT: 0.5pt solid; PADDING-RIGHT: 7px; BORDER-TOP: medium none; PADDING-LEFT: 7px; BORDER-LEFT: medium none; BORDER-BOTTOM: 0.5pt solid">
<P style="TEXT-ALIGN: left">HTTP</P></TD>
<TD class="" style="BORDER-RIGHT: 0.5pt solid; PADDING-RIGHT: 7px; BORDER-TOP: medium none; PADDING-LEFT: 7px; BORDER-LEFT: medium none; BORDER-BOTTOM: 0.5pt solid">
<P style="TEXT-ALIGN: left">All servers which have WFE configured </P></TD>
<TD class="" style="BORDER-RIGHT: 0.5pt solid; PADDING-RIGHT: 7px; BORDER-TOP: medium none; PADDING-LEFT: 7px; BORDER-LEFT: medium none; BORDER-BOTTOM: 0.5pt solid">
<P style="TEXT-ALIGN: left">Web app's app&nbsp;pool account </P></TD></TR>
<TR>
<TD class="" style="BORDER-RIGHT: 0.5pt solid; PADDING-RIGHT: 7px; BORDER-TOP: medium none; PADDING-LEFT: 7px; BORDER-LEFT: 0.5pt solid; BORDER-BOTTOM: 0.5pt solid">
<P style="TEXT-ALIGN: center">2</P></TD>
<TD class="" style="BORDER-RIGHT: 0.5pt solid; PADDING-RIGHT: 7px; BORDER-TOP: medium none; PADDING-LEFT: 7px; BORDER-LEFT: medium none; BORDER-BOTTOM: 0.5pt solid">
<P style="TEXT-ALIGN: left">HTTP</P></TD>
<TD class="" style="BORDER-RIGHT: 0.5pt solid; PADDING-RIGHT: 7px; BORDER-TOP: medium none; PADDING-LEFT: 7px; BORDER-LEFT: medium none; BORDER-BOTTOM: 0.5pt solid">
<P style="TEXT-ALIGN: left">All servers which have ECS configured </P></TD>
<TD class="" style="BORDER-RIGHT: 0.5pt solid; PADDING-RIGHT: 7px; BORDER-TOP: medium none; PADDING-LEFT: 7px; BORDER-LEFT: medium none; BORDER-BOTTOM: 0.5pt solid">
<P style="TEXT-ALIGN: left">SSP Account </P></TD></TR>
<TR>
<TD class="" style="BORDER-RIGHT: 0.5pt solid; PADDING-RIGHT: 7px; BORDER-TOP: medium none; PADDING-LEFT: 7px; BORDER-LEFT: 0.5pt solid; BORDER-BOTTOM: 0.5pt solid">
<P style="TEXT-ALIGN: center">3</P></TD>
<TD class="" style="BORDER-RIGHT: 0.5pt solid; PADDING-RIGHT: 7px; BORDER-TOP: medium none; PADDING-LEFT: 7px; BORDER-LEFT: medium none; BORDER-BOTTOM: 0.5pt solid">
<P style="TEXT-ALIGN: left">HTTP</P></TD>
<TD class="" style="BORDER-RIGHT: 0.5pt solid; PADDING-RIGHT: 7px; BORDER-TOP: medium none; PADDING-LEFT: 7px; BORDER-LEFT: medium none; BORDER-BOTTOM: 0.5pt solid">
<P style="TEXT-ALIGN: left">MOSS Server configured for Index server role</P></TD>
<TD class="" style="BORDER-RIGHT: 0.5pt solid; PADDING-RIGHT: 7px; BORDER-TOP: medium none; PADDING-LEFT: 7px; BORDER-LEFT: medium none; BORDER-BOTTOM: 0.5pt solid">
<P style="TEXT-ALIGN: left">SSP Account</P></TD></TR>
<TR>
<TD class="" style="BORDER-RIGHT: 0.5pt solid; PADDING-RIGHT: 7px; BORDER-TOP: medium none; PADDING-LEFT: 7px; BORDER-LEFT: 0.5pt solid; BORDER-BOTTOM: 0.5pt solid">
<P style="TEXT-ALIGN: center">4</P></TD>
<TD class="" style="BORDER-RIGHT: 0.5pt solid; PADDING-RIGHT: 7px; BORDER-TOP: medium none; PADDING-LEFT: 7px; BORDER-LEFT: medium none; BORDER-BOTTOM: 0.5pt solid">
<P style="TEXT-ALIGN: left">MSOLAPSvc.3 </P></TD>
<TD class="" style="BORDER-RIGHT: 0.5pt solid; PADDING-RIGHT: 7px; BORDER-TOP: medium none; PADDING-LEFT: 7px; BORDER-LEFT: medium none; BORDER-BOTTOM: 0.5pt solid">
<P style="TEXT-ALIGN: left">SSAS Server</P></TD>
<TD class="" style="BORDER-RIGHT: 0.5pt solid; PADDING-RIGHT: 7px; BORDER-TOP: medium none; PADDING-LEFT: 7px; BORDER-LEFT: medium none; BORDER-BOTTOM: 0.5pt solid">
<P style="TEXT-ALIGN: left">SQL Server Analysis Server Account</P></TD></TR></TBODY></TABLE></DIV>
<P style="MARGIN-LEFT: 40pt"><STRONG>Note:</STRONG> Setup SPN's for both netbios name as well as FQDN names. </P>
<P style="MARGIN-LEFT: 10pt">In addition, constrained delegation will need to be setup for the following SPN's: </P>
<UL style="MARGIN-LEFT: 40pt">
<LI>Between the set of SPN's in 1 and the set of SPN's in 2 </LI>
<LI>Between the set of SPN's in 2 and the set of SPN's in 4 </LI></UL><BR>
<LI><STRONG>Enabling Kerberos for Shared Services Provider</STRONG>: </LI>
<P style="MARGIN-LEFT: 40pt"><IFRAME style="PADDING-RIGHT: 0pt; PADDING-LEFT: 0pt; PADDING-BOTTOM: 0pt; MARGIN: 3px; WIDTH: 480px; PADDING-TOP: 0pt; HEIGHT: 140px" marginWidth=0 marginHeight=0 src="https://ijw7gg.blu.livefilestore.com/y1p80gfYr2FV6PrPdPtg8qJDR5ycQKs7m7tocp-Mm0dYbY0UnEpUUqyVsyIrR4edstiYWjgxIAemaE/SharePoint%20Farm.jpg" frameBorder=0 scrolling=no mce_src="https://ijw7gg.blu.livefilestore.com/y1p80gfYr2FV6PrPdPtg8qJDR5ycQKs7m7tocp-Mm0dYbY0UnEpUUqyVsyIrR4edstiYWjgxIAemaE/SharePoint%20Farm.jpg"></IFRAME></P>
<P style="MARGIN-LEFT: 10pt">The web front end (step 1) rendering the excel report calls the ECS component (step 2) to refresh the data (refer section for more details). To make ECS delegate user credentials to back end data sources, Kerberos authentication will have to be enabled for the web site hosting the ECS component. </P>
<P style="MARGIN-LEFT: 10pt">Running the following <EM>stsadm</EM> command will change the authentication settings of the "Office Server Web Services" (refer to the following blog posts for more details: <A href="https://blogs.msdn.com/suryaj/archive/2008/11/04/sharepoint-server-2007.aspx" mce_href="https://blogs.msdn.com/suryaj/archive/2008/11/04/sharepoint-server-2007.aspx"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">SharePoint Server 2007</SPAN></A> and <A href="https://blogs.msdn.com/suryaj/archive/2008/11/13/enterprise-search.aspx" mce_href="https://blogs.msdn.com/suryaj/archive/2008/11/13/enterprise-search.aspx"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">Enterprise Search</SPAN></A>) web site to use only Kerberos protocol: </P>
<P style="MARGIN-LEFT: 30pt">STSADM –o setsharedwebserviceauthn –negotiate </P>
<P style="MARGIN-LEFT: 30pt">STSADM –o execadmsvcjobs </P>
<LI><STRONG>Enabling delegation for ECS</STRONG> </LI>
<P style="MARGIN-LEFT: 10pt">Enabling Kerberos authentication protocol would provide the ability for the ECS sitting under that web site to delegate the end user credentials to the back end sources. But to specifically let ECS to do the delegation following stsadm admin command has to be executed: </P>
<P style="MARGIN-LEFT: 30pt">STSADM –o set-ecssecurity –ssp &lt;SSPTitle&gt; -accessmodel delegation </P>
<P style="MARGIN-LEFT: 30pt">STSADM –o execadmsvcjobs </P>
<P style="MARGIN-LEFT: 10pt">Execution of the above commands would result in ECS successfully forwarding the Kerberos token to the data source (step 3).</P></OL>
<P style="MARGIN-LEFT: 36pt">After completion of the above steps, you should be able to refresh your excel based report in a browser with user credentials successfully getting forwarded to your data source. </P>]]></content:encoded>
    </item>
    <item>
      <title>Enterprise Search</title>
      <link>https://docs.microsoft.com/archive/blogs/suryaj/enterprise-search</link>
      <pubDate>Thu, 13 Nov 2008 17:58:00 GMT</pubDate>
      <dc:creator><![CDATA[sp jak]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/suryaj/2008/11/13/enterprise-search/</guid>
      <description><![CDATA[Another key component of MOSS 2007 relevant to enabling Kerberos in the farm is Enterprise Search....]]></description>
      <content:encoded><![CDATA[<P>Another key component of MOSS 2007<STRONG> </STRONG>relevant to enabling Kerberos in the farm is Enterprise Search. MOSS 2007<STRONG> </STRONG>builds upon the<STRONG> </STRONG>two<STRONG> </STRONG>core search components of Windows SharePoint Services 3.0 - the Index engine and the Query engine. </P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;Administration of Enterprise Search in MOSS 2007 is twofold: </P>
<UL style="MARGIN-LEFT: 90pt">
<LI><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">Central Administration: Allows the farm administrator to specify farm level search settings </SPAN></LI>
<LI>
<DIV><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">Shared Services Provider Administration: Allows the SSP Administrator to administer search settings for their SSP</SPAN> </DIV></LI></UL>
<DIV style="MARGIN-LEFT: 90pt">
<TABLE class="" style="BORDER-COLLAPSE: collapse" border=0>
<COLGROUP>
<COL style="WIDTH: 255px">
<COL style="WIDTH: 263px"></COLGROUP>
<TBODY vAlign=top>
<TR>
<TD class="" style="BACKGROUND: #111111" align=middle colSpan=2><SPAN style="FONT-SIZE: 12pt; COLOR: #fafafa; FONT-FAMILY: Verdana; TEXT-ALIGN: center"><STRONG>Search Administration </STRONG></SPAN></TD></TR>
<TR>
<TD class="" style="BORDER-RIGHT: 0.5pt solid; PADDING-RIGHT: 7px; BORDER-TOP: 0.5pt solid; PADDING-LEFT: 7px; BACKGROUND: #f1f1f1; BORDER-LEFT: 0.5pt solid; BORDER-BOTTOM: 0.5pt solid">
<P style="TEXT-ALIGN: center"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana"><STRONG>Central Administration</STRONG></SPAN></P></TD>
<TD class="" style="BORDER-RIGHT: 0.5pt solid; PADDING-RIGHT: 7px; BORDER-TOP: 0.5pt solid; PADDING-LEFT: 7px; BACKGROUND: #f1f1f1; BORDER-LEFT: medium none; BORDER-BOTTOM: 0.5pt solid">
<P style="TEXT-ALIGN: center"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana"><STRONG>Shared Services Provider Administration</STRONG></SPAN></P></TD></TR>
<TR>
<TD class="" style="BORDER-RIGHT: 0.5pt solid; PADDING-RIGHT: 7px; BORDER-TOP: medium none; PADDING-LEFT: 7px; BORDER-LEFT: 0.5pt solid; BORDER-BOTTOM: 0.5pt solid">
<P mce_keep="true"><IFRAME style="PADDING-RIGHT: 0pt; PADDING-LEFT: 0pt; PADDING-BOTTOM: 0pt; MARGIN: 3px; WIDTH: 380px; PADDING-TOP: 0pt; HEIGHT: 178px" marginWidth=0 marginHeight=0 src="https://ijw7gg.blu.livefilestore.com/y1pGaWO-Jvlo22EuRHypso6hRlJL3jB3gB9HBKT7k6nRgC9Iu747VCgx1C98wGc0ZFNvSQ8v-eUQZ8/Search_CA.jpg" frameBorder=0 scrolling=no mce_src="https://ijw7gg.blu.livefilestore.com/y1pGaWO-Jvlo22EuRHypso6hRlJL3jB3gB9HBKT7k6nRgC9Iu747VCgx1C98wGc0ZFNvSQ8v-eUQZ8/Search_CA.jpg"></IFRAME></P></TD>
<TD class="" style="BORDER-RIGHT: 0.5pt solid; PADDING-RIGHT: 7px; BORDER-TOP: medium none; PADDING-LEFT: 7px; BORDER-LEFT: medium none; BORDER-BOTTOM: 0.5pt solid">
<P mce_keep="true"><IFRAME style="PADDING-RIGHT: 0pt; PADDING-LEFT: 0pt; PADDING-BOTTOM: 0pt; MARGIN: 3px; WIDTH: 380px; PADDING-TOP: 0pt; HEIGHT: 178px" marginWidth=0 marginHeight=0 src="https://ijw7gg.blu.livefilestore.com/y1pnC8RNkg2Bmkccvnghf1oBWj4PH0MptbF3pSOWQiuwDJWu21V5OrRTIQ-d88AnOxzepJO_4NwYQc/Search_SSP.jpg" frameBorder=0 scrolling=no mce_src="https://ijw7gg.blu.livefilestore.com/y1pnC8RNkg2Bmkccvnghf1oBWj4PH0MptbF3pSOWQiuwDJWu21V5OrRTIQ-d88AnOxzepJO_4NwYQc/Search_SSP.jpg"></IFRAME></P></TD></TR>
<TR>
<TD class="" style="BORDER-RIGHT: 0.5pt solid; PADDING-RIGHT: 7px; BORDER-TOP: medium none; PADDING-LEFT: 7px; BORDER-LEFT: 0.5pt solid; BORDER-BOTTOM: 0.5pt solid">
<P><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">Runs under <EM>Network Service</EM> Account</SPAN></P></TD>
<TD class="" style="BORDER-RIGHT: 0.5pt solid; PADDING-RIGHT: 7px; BORDER-TOP: medium none; PADDING-LEFT: 7px; BORDER-LEFT: medium none; BORDER-BOTTOM: 0.5pt solid">
<P><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">Runs under <EM>SSP Account</EM></SPAN></P></TD></TR>
<TR>
<TD class="" style="BORDER-RIGHT: 0.5pt solid; PADDING-RIGHT: 7px; BORDER-TOP: medium none; PADDING-LEFT: 7px; BORDER-LEFT: 0.5pt solid; BORDER-BOTTOM: 0.5pt solid">
<P><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">SearchAdmin web service is used to administer farm level search settings like assigning index and query roles to servers in the farm, setting up physical index location, crawl proxy settings</SPAN></P></TD>
<TD class="" style="BORDER-RIGHT: 0.5pt solid; PADDING-RIGHT: 7px; BORDER-TOP: medium none; PADDING-LEFT: 7px; BORDER-LEFT: medium none; BORDER-BOTTOM: 0.5pt solid">
<P><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">SearchAdmin web service is used to administer search settings for this SSP (SSPMain as in the above example). It is used to specify content sources for crawls and setting up their schedules, creating and updating <EM>managed properties</EM>, managing scopes among other things</SPAN></P></TD></TR></TBODY></TABLE></DIV>
<P>For more details regarding the MOSS 2007 Search architecture, refer to <A href="https://msdn.microsoft.com/en-us/library/ms570748.aspx" mce_href="https://msdn.microsoft.com/en-us/library/ms570748.aspx">https://msdn.microsoft.com/en-us/library/ms570748.aspx</A></P>]]></content:encoded>
    </item>
    <item>
      <title>SharePoint Server 2007</title>
      <link>https://docs.microsoft.com/archive/blogs/suryaj/sharepoint-server-2007</link>
      <pubDate>Tue, 04 Nov 2008 18:29:00 GMT</pubDate>
      <dc:creator><![CDATA[sp jak]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/suryaj/2008/11/04/sharepoint-server-2007/</guid>
      <description><![CDATA[SharePoint in its current version, Microsoft Office SharePoint Server 2007 (MOSS), has evolved from...]]></description>
      <content:encoded><![CDATA[<P>SharePoint in its current version, Microsoft Office SharePoint Server 2007 (MOSS), has evolved from its early days of a portal management system to a complete platform providing services ranging from document management, collaboration, social networking to a complete suite of business intelligence (BI) capabilities to build upon. </P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;SharePoint introduces the concept of Shared Services Provider (SSP) which are composed of a set of services and functionality that can be applied to multiple SharePoint sites at the same time. These services include Excel Services, Enterprise Search among others. During a complete install of MOSS 2007 on a server, "Office Server Web Services" Web site is created, which provides the functionality required by Shared Service Providers. For each SSP created in farm, a virtual directory with the same name as the SSP title is created under this web site. Each of the virtual directories created for a SSP in farm will have the following directories under it: ExcelCalculationServer, Search </P><IFRAME style="PADDING-RIGHT: 0pt; PADDING-LEFT: 0pt; PADDING-BOTTOM: 0pt; MARGIN: 3px; WIDTH: 480px; PADDING-TOP: 0pt; HEIGHT: 182px" marginWidth=0 marginHeight=0 src="https://ijw7gg.blu.livefilestore.com/y1p97As1wEERnyBVRVfzcKQWHFmCXRFRetfM0Do3Ez8ea4eLnbeNZPU0H4b7XB73EHzxSt847os-gs/IIS_SSP.JPG" frameBorder=0 scrolling=no mce_src="https://ijw7gg.blu.livefilestore.com/y1p97As1wEERnyBVRVfzcKQWHFmCXRFRetfM0Do3Ez8ea4eLnbeNZPU0H4b7XB73EHzxSt847os-gs/IIS_SSP.JPG"></IFRAME>
<P style="TEXT-ALIGN: center" mce_keep="true">&nbsp;</P>
<H3>Excel/Excel Services </H3>
<P>Microsoft Office Excel 2007 provides a rich set of features allowing BI users to connect to data sources, prepare reports, perform real time analysis thereby simplifying the decision making process. In order to provide a seamless experience for Microsoft Office Excel users on the web, MOSS 2007 includes Excel services that enable some of the powerful Excel features to be available on the browser. </P>
<P>Reports built using Excel client can be published to document libraries in MOSS 2007 sites. Excel services can load and render these reports as a web page providing interactive capabilities on the browser. Excel services require the location of these reports to be configured as a Trusted Location which have to be configured as part of SSP administration. </P>
<P>Excel can connect to external data using data connections created and persisted as Office data connection (.ODC) files which include authentication settings for Excel Services. In a SharePoint farm running ECS, these data connection files are secured in central library called Data Connection libraries (DCL's) by site administrators. In a typical Excel Services configuration, these DCL locations will need to be configured as a Trusted Data Connection Library as part of SSP administration. Refer to this technet article for more details: <A class="" title="Plan external data connections for Excel Services" href="https://technet.microsoft.com/en-us/library/cc262899.aspx" target=_blank mce_href="https://technet.microsoft.com/en-us/library/cc262899.aspx">Plan external data connections for Excel Services</A> </P>
<P>The following are the core Excel Service components: </P>
<DIV style="MARGIN-LEFT: 23pt">
<TABLE class="" style="BORDER-COLLAPSE: collapse" border=0>
<COLGROUP>
<COL style="WIDTH: 38px">
<COL style="WIDTH: 100px">
<COL style="WIDTH: 469px"></COLGROUP>
<TBODY vAlign=top>
<TR>
<TD class="" style="BORDER-RIGHT: 0.5pt solid; PADDING-RIGHT: 7px; BORDER-TOP: 0.5pt solid; PADDING-LEFT: 7px; BACKGROUND: #00b050; BORDER-LEFT: 0.5pt solid; BORDER-BOTTOM: 0.5pt solid" rowSpan=2>
<P style="MARGIN-LEFT: 5pt; TEXT-ALIGN: center">UI Tier</P></TD>
<TD class="" style="BORDER-RIGHT: 0.5pt solid; PADDING-RIGHT: 7px; BORDER-TOP: 0.5pt solid; PADDING-LEFT: 7px; BORDER-LEFT: medium none; BORDER-BOTTOM: 0.5pt solid">
<P style="MARGIN-LEFT: 54pt"><STRONG>Excel Web Access (EWA)</STRONG></P></TD>
<TD class="" style="BORDER-RIGHT: 0.5pt solid; PADDING-RIGHT: 7px; BORDER-TOP: 0.5pt solid; PADDING-LEFT: 7px; BORDER-LEFT: medium none; BORDER-BOTTOM: 0.5pt solid">
<P style="MARGIN-LEFT: 54pt">This web part deployed on all WFEs creates the HTML from the results provided by ECS component. It also provides interactivity for the end users</P></TD></TR>
<TR>
<TD class="" style="BORDER-RIGHT: 0.5pt solid; PADDING-RIGHT: 7px; BORDER-TOP: medium none; PADDING-LEFT: 7px; BORDER-LEFT: 0.5pt solid; BORDER-BOTTOM: 0.5pt solid">
<P style="MARGIN-LEFT: 54pt"><STRONG>Excel Web Services (EWS)</STRONG></P></TD>
<TD class="" style="BORDER-RIGHT: 0.5pt solid; PADDING-RIGHT: 7px; BORDER-TOP: medium none; PADDING-LEFT: 7px; BORDER-LEFT: medium none; BORDER-BOTTOM: 0.5pt solid">
<P style="MARGIN-LEFT: 54pt">This web service provides programmatic access to spreadsheets </P></TD></TR>
<TR style="HEIGHT: 76px">
<TD class="" style="BORDER-RIGHT: 0.5pt solid; PADDING-RIGHT: 7px; BORDER-TOP: medium none; PADDING-LEFT: 7px; BACKGROUND: #00b0f0; BORDER-LEFT: 0.5pt solid; BORDER-BOTTOM: 0.5pt solid">
<P style="MARGIN-LEFT: 5pt; TEXT-ALIGN: center">Application Tier</P></TD>
<TD class="" style="BORDER-RIGHT: 0.5pt solid; PADDING-RIGHT: 7px; BORDER-TOP: medium none; PADDING-LEFT: 7px; BORDER-LEFT: medium none; BORDER-BOTTOM: 0.5pt solid">
<P style="MARGIN-LEFT: 54pt"><STRONG>Excel Calculation Services (ECS)</STRONG></P></TD>
<TD class="" style="BORDER-RIGHT: 0.5pt solid; PADDING-RIGHT: 7px; BORDER-TOP: medium none; PADDING-LEFT: 7px; BORDER-LEFT: medium none; BORDER-BOTTOM: 0.5pt solid">
<P style="MARGIN-LEFT: 54pt">The ECS is the key component responsible for loading spreadsheets, calculations, refreshing external data and manages session state for interactivity. ECS is exposed as a web service under the SSP virtual directory. e.g. <A><SPAN style="FONT-SIZE: 10pt">https://&lt;server&gt;:56737/&lt;SSPTitle&gt;/ExcelCalculationServer/ExcelService.asmx</SPAN></A> </P><IFRAME style="PADDING-RIGHT: 0pt; PADDING-LEFT: 0pt; PADDING-BOTTOM: 0pt; MARGIN: 3px; WIDTH: 480px; PADDING-TOP: 0pt; HEIGHT: 178px" marginWidth=0 marginHeight=0 src="https://ijw7gg.blu.livefilestore.com/y1p97As1wEERnyBVRVfzcKQWHFmCXRFRetfM0Do3Ez8ea4eLnbeNZPU0H4b7XB73EHzxSt847os-gs/IIS_SSP.JPG" frameBorder=0 scrolling=no mce_src="https://ijw7gg.blu.livefilestore.com/y1p97As1wEERnyBVRVfzcKQWHFmCXRFRetfM0Do3Ez8ea4eLnbeNZPU0H4b7XB73EHzxSt847os-gs/IIS_SSP.JPG"></IFRAME>
<P style="MARGIN-LEFT: 54pt" mce_keep="true">&nbsp;</P></TD></TR></TBODY></TABLE></DIV>
<P><SPAN style="COLOR: #0070c0"></SPAN>&nbsp;</P>]]></content:encoded>
    </item>
    <item>
      <title>Kerberos Protocol</title>
      <link>https://docs.microsoft.com/archive/blogs/suryaj/kerberos-protocol</link>
      <pubDate>Mon, 03 Nov 2008 20:00:00 GMT</pubDate>
      <dc:creator><![CDATA[sp jak]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/suryaj/2008/11/03/kerberos-protocol/</guid>
      <description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;Authentication in Microsoft domain networks has traditionally been done...]]></description>
      <content:encoded><![CDATA[<P>&nbsp;&nbsp;&nbsp;&nbsp;Authentication in Microsoft domain networks has traditionally been done using NTLM or Kerberos protocol. Kerberos protocol is a more secure authentication mechanism than NTLM which also overcomes the well-known <EM>double hop</EM> issue associated with NTLM. </P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;Microsoft's implementation of the Kerberos protocol involves three parties – client, server and the Key Distribution Center (KDC). The client and server referred above are also known as Service Principals. An essential pre-requisite for Kerberos to work is that target services in the conversation must have had their Service Principal Names (SPN) registered. An SPN comprises of the following format: <STRONG>[service class]</STRONG>/<STRONG>[host]</STRONG>:<STRONG>[port]/[service name]</STRONG>. <STRONG>Service</STRONG> <STRONG>class </STRONG>represents the type of service (well known examples being HOST, HTTP), <STRONG>host</STRONG> is the fully-qualified DNS name or the NetBIOS name of the host. <STRONG>Port</STRONG> and <STRONG>service name</STRONG> are optional fields. An example of a SPN entry would be: <EM>HTTP/3rdRock</EM> where the service class is <EM>HTTP</EM> and the host is <EM>3rdRock</EM>. </P>
<P>A few points to note about SPN's: </P>
<UL style="MARGIN-LEFT: 54pt">
<LI>A SPN must be registered only for one service account. We cannot have the same SPN to be registered under different service account. </LI>
<P style="MARGIN-LEFT: 18pt">E.g.: Following registration will result in the second SPN to be active. </P>
<P style="MARGIN-LEFT: 36pt">http/server1 redmond\account1 </P>
<P style="MARGIN-LEFT: 36pt">http/server1 redmond\account2 </P>
<LI>
<DIV>For a service behind a load balancer, services in all the servers should be configured to use same account. </DIV></LI>
<LI>It is generally a good idea to create the SPN for both the FQDN as well as the NetBIOS name </LI></UL>
<P style="MARGIN-LEFT: 54pt">http/server1 redmond\account1 </P>
<P style="MARGIN-LEFT: 54pt">http/server1.redmond.corp.microsoft.com redmond\account1 </P>
<UL style="MARGIN-LEFT: 54pt">
<LI>Currently some Kerberos clients do not construct the SPN correctly if the service is configured to be listening on a non-default port. <A href="https://support.microsoft.com/kb/908209/en-us" mce_href="https://support.microsoft.com/kb/908209/en-us"><SPAN style="FONT-SIZE: 10pt">https://support.microsoft.com/kb/908209/en-us</SPAN></A> </LI></UL>
<P>Kerberos Domain Controller (KDC), running on a Windows Domain Controller, serves as the trusted third party, and performs two service functions: Authentication Service (AS) and Ticket Granting Service (TGS). </P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;The following is a simplified view of the authentication process: </P>
<DIV style="MARGIN-LEFT: 23pt">
<TABLE class="" style="BORDER-COLLAPSE: collapse" border=0>
<COLGROUP>
<COL style="WIDTH: 449px">
<COL style="WIDTH: 351px"></COLGROUP>
<TBODY vAlign=top>
<TR>
<TD class="" style="BORDER-RIGHT: 0.5pt solid; PADDING-RIGHT: 7px; BORDER-TOP: 0.5pt solid; PADDING-LEFT: 7px; BORDER-LEFT: 0.5pt solid; BORDER-BOTTOM: 0.5pt solid">
<P style="MARGIN-LEFT: 4pt" mce_keep="true"><IFRAME style="PADDING-RIGHT: 0pt; PADDING-LEFT: 0pt; PADDING-BOTTOM: 0pt; MARGIN: 3px; WIDTH: 480px; PADDING-TOP: 0pt; HEIGHT: 328px" marginWidth=0 marginHeight=0 src="https://ijw7gg.blu.livefilestore.com/y1pTdTJpVMnh9dKTSruuHFeKfgsSSXGlk1X2rJ1zpO9XkSr1e_UPtqNElBLa70menNLdxltkRXYP28/Kerberos.jpg" frameBorder=0 scrolling=no mce_src="https://ijw7gg.blu.livefilestore.com/y1pTdTJpVMnh9dKTSruuHFeKfgsSSXGlk1X2rJ1zpO9XkSr1e_UPtqNElBLa70menNLdxltkRXYP28/Kerberos.jpg"></IFRAME></P></TD>
<TD class="" style="BORDER-RIGHT: 0.5pt solid; PADDING-RIGHT: 7px; BORDER-TOP: 0.5pt solid; PADDING-LEFT: 7px; BORDER-LEFT: medium none; BORDER-BOTTOM: 0.5pt solid">
<OL>
<LI><SPAN style="FONT-SIZE: 9pt"><EM>Client</EM> (Joe) sends a request to the AS asking for a TGT (which will later help to authenticate to the <EM>service</EM>). </SPAN></LI>
<LI><SPAN style="FONT-SIZE: 9pt">AS responds by sending a TGT along with additional information encrypted with <EM>client</EM> master key (password hash). Client decrypts the additional information to extract a session key (which will be used for further communication with KDC). </SPAN></LI>
<LI><SPAN style="FONT-SIZE: 9pt">When <EM>client</EM> wants to access a <EM>service</EM> (Kerberos enabled site), it sends a request for service ticket to TGS constructing the SPN for the <EM>service</EM> along with the TGT (received in Step 2). </SPAN></LI>
<LI><SPAN style="FONT-SIZE: 9pt">TGS decrypts the TGT to extract the session key and validate the client. TGS prepares the service ticket for SPNs and encrypts using <EM>service</EM> master key, which is the key for the service account of the target <EM>service</EM>. </SPAN></LI>
<LI><SPAN style="FONT-SIZE: 9pt"><EM>Client</EM> receives the response and sends service ticket to the <EM>service</EM> (web server). </SPAN></LI>
<LI><SPAN style="FONT-SIZE: 9pt"><EM>Service</EM> uses its master key to decrypt the ticket and extract the session key. <EM>Service</EM> uses this session key to authenticate the <EM>client</EM> and sends an appropriate response. </SPAN></LI></OL></TD></TR></TBODY></TABLE></DIV>
<P>Handy tools to help you with Kerberos: </P>
<DIV style="BORDER-RIGHT: gray 2px dashed; BORDER-TOP: gray 2px dashed; MARGIN-LEFT: 5pt; BORDER-LEFT: gray 2px dashed; BORDER-BOTTOM: gray 2px dashed">
<UL>
<LI><B>setspn:</B> Command line tool to set and verify SPN entries. It is available with default installation of Windows Server 2008 (For Windows Server 2003: <A href="https://support.microsoft.com/kb/892777">Windows Server 2003 Service Pack 1 Support Tools</A>) </LI>
<LI><B>ldp.exe:</B> GUI tool to verify constrained delegation. It is available with default installation of Windows Server 2008 once the Active Directory Domain Services role is added (For Windows Server 2003: <A href="https://technet.microsoft.com/en-us/library/cc772839.aspx">Ldp overview and download</A>). Also refer <A href="https://support.microsoft.com/kb/224543">here</A> for help with the tool.&nbsp;To verify CD, your search filter for this tool might look like: (&amp;(objectClass=user)(sAMAccountName=[service name]))&nbsp;</LI>
<LI><B>klist:</B> Command line tool to view all the kerberos tickets (cached)</LI>
<LI><B>netmon:</B> Can't get any better than this. Put up a network sniffer to troubleshoot any issues with Kerberos</LI></UL></DIV>
<P>A few other good resources to learn about Kerberos Protocol: </P>
<OL>
<LI><A href="https://www.microsoft.com/windowsserver2003/technologies/security/kerberos/default.mspx" mce_href="https://www.microsoft.com/windowsserver2003/technologies/security/kerberos/default.mspx"><SPAN style="FONT-SIZE: 10pt">Kerberos Authentication in Windows Server 2003</SPAN></A>: One stop source to learn, plan and deploy Kerberos authentication in a Windows Server 2003 environment. </LI>
<LI>Designing Secure Web-Based applications for Microsoft Windows 2000, Michael Howard: Even though the title of the book suggests it is for Windows 2000, chapter 14: An Introduction to Kerberos Authentication in Windows 2000, is one of the best primer for anyone who wants to know the basics of Kerberos in a Windows environment. </LI>
<LI><A href="https://support.microsoft.com/kb/326985" mce_href="https://support.microsoft.com/kb/326985"><SPAN style="FONT-SIZE: 10pt">How to troubleshoot Kerberos-related issues in IIS</SPAN></A>: A good start point to get help in troubleshooting Kerberos-related issues</LI></OL>]]></content:encoded>
    </item>
    <item>
      <title>Marketing Platform and Services</title>
      <link>https://docs.microsoft.com/archive/blogs/suryaj/marketing-platform-and-services</link>
      <pubDate>Fri, 31 Oct 2008 20:46:00 GMT</pubDate>
      <dc:creator><![CDATA[sp jak]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/suryaj/2008/10/31/marketing-platform-and-services/</guid>
      <description><![CDATA[One of the main charters of our group, Marketing Platform and Services, is to be a partner to...]]></description>
      <content:encoded><![CDATA[<P>One of the main charters of our group, Marketing Platform and Services, is to be a partner to Microsoft Marketing and help them in their day to day job by building a suite of software tools to increase their productivity and be effective at it. The software translation if it was that we had a whole range of software applications and tools revolving around planning, execution and sales of Microsoft's products. </P>
<P>Last year this time, a major overhaul was planned for our suite of reporting tools. Until then reporting was done in silos where each application would provide its own set of reports. Listening to our customers, we could see there was huge ask for our team to build a reporting platform which can transcend application data and have the ability to report and analyze it all in one place. </P>
<P>In this blog series, I wanted to share how we went ahead in putting the platform together, the technologies chosen; some of the architectural decisions made and share our experiences along the way. The content for this blog series is out of a white paper jointly authored by your host and a colleague of mine, Subbu. I would like to take this opportunity and acknowledge the time and effort, Derek Bevan, Senior Architect of our group, had put in to help us publish this white paper. We are also grateful to the contributions of Mark Grossbard, Ira Levin, Pej Javaheri, John Campbell and last but not the least Praba Manoharan.</P>
<P>Without further ado ...</P>
<P><STRONG>Scenario: </STRONG></P>
<P>Most enterprise reporting and analytics applications (referred to as Business Intelligence (BI)), require knowing the user who is requesting the data at the data layer. Ours was no different as our platform would be required to host secured data wherein authorizing at each layer became one of the top requirements from a security stand point. </P>
<P><STRONG>Technologies: </STRONG></P>
<P><SPAN style="FONT-SIZE: 11pt; FONT-FAMILY: Calibri">Microsoft Office SharePoint (MOSS) 2007 offers a complete suite of components and services to build rich business intelligence (BI) portals. Excel is the most widely used tool for performing data analysis and reporting. Excel Services, offered as part of MOSS 2007, enhances this capability by enabling these features to be available on the browser through a server-based excel calculation service (ECS) and interactive web-based user interface. </SPAN></P>
<P><SPAN style="FONT-SIZE: 11pt; FONT-FAMILY: Calibri">A typical BI portal using SharePoint farm can be represented by the figure below: </SPAN></P><IFRAME style="PADDING-RIGHT: 0pt; PADDING-LEFT: 0pt; PADDING-BOTTOM: 0pt; MARGIN: 3px; WIDTH: 480px; PADDING-TOP: 0pt; HEIGHT: 140px" marginWidth=0 marginHeight=0 src="https://ijw7gg.blu.livefilestore.com/y1p80gfYr2FV6PrPdPtg8qJDR5ycQKs7m7tocp-Mm0dYbY0UnEpUUqyVsyIrR4edstiYWjgxIAemaE/SharePoint%20Farm.jpg" frameBorder=0 scrolling=no mce_src="https://ijw7gg.blu.livefilestore.com/y1p80gfYr2FV6PrPdPtg8qJDR5ycQKs7m7tocp-Mm0dYbY0UnEpUUqyVsyIrR4edstiYWjgxIAemaE/SharePoint%20Farm.jpg"></IFRAME>
<P>In the above scenario, if the Excel report, hosted in a SharePoint site, connects to external data sources which require the end user credentials, then client identity (1) has to flow from the SharePoint farm (2) to the data source server (3) as illustrated in the figure (x). </P>
<P>In this scenario, following three authentication types are supported by Excel Services </P>
<UL style="MARGIN-LEFT: 54pt">
<LI>Windows Authentication </LI>
<LI>SSO </LI>
<LI>None<SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana"> </SPAN></LI></UL>
<P>Once the choice to go with Windows authentication was made we had to decide what the underlying protocol would be, choices being&nbsp;- NTLM or Kerberos. NTLM is plain easy in a Windows domain and doesn't require any additional configuration&nbsp;as long as you dont cross a physical machine boundary. In our scenario above NTLM would have lead us to the well-known "double hop" issue and would result in authentication failure at Excel Services layer (ECS) given the multiple hops it would take for us to reach the <EM>data source</EM>. Kerberos protocol can address this issue as it supports delegating credentials across services/physical machines. </P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;In order to help readers of this blog series understand the technicalities of enabling Kerberos in a SharePoint farm, I plan to provide an overview of the technologies involved in the process: </P>
<UL style="MARGIN-LEFT: 54pt">
<LI><A class="" title="Kerberos Protocol" href="https://blogs.msdn.com/suryaj/archive/2008/11/03/kerberos-protocol.aspx" mce_href="https://blogs.msdn.com/suryaj/archive/2008/11/03/kerberos-protocol.aspx">Kerberos Protocol</A> </LI>
<LI><A class="" title="SharePoint Server 2007 and Excel Services" href="https://blogs.msdn.com/suryaj/archive/2008/11/04/sharepoint-server-2007.aspx" mce_href="https://blogs.msdn.com/suryaj/archive/2008/11/04/sharepoint-server-2007.aspx">SharePoint Server 2007 and Excel Services</A> </LI>
<LI><A class="" title="Enterprise Search" href="https://blogs.msdn.com/suryaj/archive/2008/11/13/enterprise-search.aspx" mce_href="https://blogs.msdn.com/suryaj/archive/2008/11/13/enterprise-search.aspx">Enterprise Search</A> </LI></UL>
<P>and then move to:</P>
<UL style="MARGIN-LEFT: 54pt">
<LI><A class="" title="Configuring Kerberos Delegation (without infrastructure update)" href="https://blogs.msdn.com/suryaj/archive/2008/11/14/configuring-kerberos-delegation-without-infrastructure-update.aspx" mce_href="https://blogs.msdn.com/suryaj/archive/2008/11/14/configuring-kerberos-delegation-without-infrastructure-update.aspx">Configuring Kerberos Delegation (without infrastructure update)</A> </LI></UL>
<P>and a few follow ups once SSP is Kerberos enabled:</P>
<UL style="MARGIN-LEFT: 54pt">
<LI><A class="" title="SPN for Index Server" href="https://blogs.msdn.com/suryaj/archive/2008/12/04/spn-for-index-server.aspx" mce_href="https://blogs.msdn.com/suryaj/archive/2008/12/04/spn-for-index-server.aspx">SPN for Index Server</A> </LI>
<LI><A class="" title="Accessing CA Search Admin with SPN set for Index Server" href="https://blogs.msdn.com/suryaj/archive/2008/12/05/accessing-ca-search-admin-with-spn-set-for-index-server.aspx" mce_href="https://blogs.msdn.com/suryaj/archive/2008/12/05/accessing-ca-search-admin-with-spn-set-for-index-server.aspx">Accessing CA Search Admin with SPN set for Index Server</A> </LI></UL>]]></content:encoded>
    </item>
  </channel>
</rss>