<?xml version="1.0" encoding="utf-8"?>
<rss xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0">
  <channel>
    <title>Abilitics Blog - SharePoint</title>
    <link>http://blogs.abilitics.com/</link>
    <description />
    <language>en-us</language>
    <copyright>Rossen Zhivkov</copyright>
    <lastBuildDate>Mon, 17 Nov 2008 21:32:14 GMT</lastBuildDate>
    <generator>newtelligence dasBlog 2.0.7226.0</generator>
    <managingEditor>rzhivkov@gmail.com</managingEditor>
    <webMaster>rzhivkov@gmail.com</webMaster>
    <item>
      <trackback:ping>http://blogs.abilitics.com/Trackback.aspx?guid=38c15f5a-f88d-4766-bd80-c46a46dff13b</trackback:ping>
      <pingback:server>http://blogs.abilitics.com/pingback.aspx</pingback:server>
      <pingback:target>http://blogs.abilitics.com/PermaLink,guid,38c15f5a-f88d-4766-bd80-c46a46dff13b.aspx</pingback:target>
      <dc:creator>Rossen Zhivkov</dc:creator>
      <wfw:comment>http://blogs.abilitics.com/CommentView,guid,38c15f5a-f88d-4766-bd80-c46a46dff13b.aspx</wfw:comment>
      <wfw:commentRss>http://blogs.abilitics.com/SyndicationService.asmx/GetEntryCommentsRss?guid=38c15f5a-f88d-4766-bd80-c46a46dff13b</wfw:commentRss>
      <title>SharePoint high-availability with SQL Server 2008 Database Mirroring</title>
      <guid isPermaLink="false">http://blogs.abilitics.com/PermaLink,guid,38c15f5a-f88d-4766-bd80-c46a46dff13b.aspx</guid>
      <link>http://blogs.abilitics.com/2008/11/17/SharePointHighavailabilityWithSQLServer2008DatabaseMirroring.aspx</link>
      <pubDate>Mon, 17 Nov 2008 21:32:14 GMT</pubDate>
      <description>&lt;p&gt;
&lt;span lang=EN style="FONT-SIZE: 8.5pt; COLOR: #585858; LINE-HEIGHT: 115%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: Calibri; mso-fareast-theme-font: minor-latin; mso-bidi-font-family: Tahoma; mso-ansi-language: EN; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"&gt;A
week ago we completed the &lt;b style="mso-bidi-font-weight: normal"&gt;migration&lt;/b&gt; of
SharePoint implementation to new infrastructure for a client of ours. The non-functional
requirements included high-availability which we met with SQL Server 2008 Database
Mirroring. Below are some of the architecture decisions from this project. &lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;img src="/content/binary/mirror0.png" border=0&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 10pt"&gt;
&lt;span lang=EN style="FONT-SIZE: 8.5pt; COLOR: #585858; LINE-HEIGHT: 115%; FONT-FAMILY: 'Verdana','sans-serif'; mso-bidi-font-family: Tahoma; mso-ansi-language: EN"&gt;&lt;?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /&gt;Fig
1: Content DB is running as principal on SQL2 and mirror on SQL1, while all the others
are running as principal SQL1, and mirror on SQL2.&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 10pt"&gt;
&lt;b style="mso-bidi-font-weight: normal"&gt;&lt;span lang=EN style="FONT-SIZE: 8.5pt; COLOR: #585858; LINE-HEIGHT: 115%; FONT-FAMILY: 'Verdana','sans-serif'; mso-bidi-font-family: Tahoma; mso-ansi-language: EN"&gt;Asynchronous
vs. Synchronous database mirroring&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;&lt;/b&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 10pt; tab-stops: 69.9pt"&gt;
&lt;span lang=EN style="FONT-SIZE: 8.5pt; COLOR: #585858; LINE-HEIGHT: 115%; FONT-FAMILY: 'Verdana','sans-serif'; mso-bidi-font-family: Tahoma; mso-ansi-language: EN"&gt;With &lt;b style="mso-bidi-font-weight: normal"&gt;asynchronous&lt;/b&gt; mirroring
(high-performance mode), the transaction is completed on principal server before it
is applied on mirrored server. This means that if fail down occurs, there is possibility
of data loss.&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 10pt; tab-stops: 69.9pt"&gt;
&lt;span lang=EN style="FONT-SIZE: 8.5pt; COLOR: #585858; LINE-HEIGHT: 115%; FONT-FAMILY: 'Verdana','sans-serif'; mso-bidi-font-family: Tahoma; mso-ansi-language: EN"&gt;With &lt;b style="mso-bidi-font-weight: normal"&gt;synchronous&lt;/b&gt; mirroring,
transaction on the principal is committed after it has been completed on the mirror
server, thus causing a performance delays. Synchronous mirroring requires a high-performance
network infrastructure with low latency. 
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 10pt"&gt;
&lt;span lang=EN style="FONT-SIZE: 8.5pt; COLOR: #585858; LINE-HEIGHT: 115%; FONT-FAMILY: 'Verdana','sans-serif'; mso-bidi-font-family: Tahoma; mso-ansi-language: EN"&gt;Note
that asynchronous is available only in &lt;b style="mso-bidi-font-weight: normal"&gt;Enterprise
version&lt;/b&gt; of SQL Server.&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 10pt"&gt;
&lt;b style="mso-bidi-font-weight: normal"&gt;&lt;span lang=EN style="FONT-SIZE: 8.5pt; COLOR: #585858; LINE-HEIGHT: 115%; FONT-FAMILY: 'Verdana','sans-serif'; mso-bidi-font-family: Tahoma; mso-ansi-language: EN"&gt;Using
SQL Aliases&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;&lt;/b&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 10pt"&gt;
&lt;span lang=EN style="FONT-SIZE: 8.5pt; COLOR: #585858; LINE-HEIGHT: 115%; FONT-FAMILY: 'Verdana','sans-serif'; mso-bidi-font-family: Tahoma; mso-ansi-language: EN"&gt;SharePoint
is sensitive (meaning lots of stsadm work required) to changing the database server
for Configuration database. Using &lt;b style="mso-bidi-font-weight: normal"&gt;SQL aliases&lt;/b&gt;,
you can trick SharePoint to “think” that it is connecting to the same principal database,
while in reality it is using the mirrored database (when principal is down).&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 10pt"&gt;
&lt;span lang=EN style="FONT-SIZE: 8.5pt; COLOR: #585858; LINE-HEIGHT: 115%; FONT-FAMILY: 'Verdana','sans-serif'; mso-bidi-font-family: Tahoma; mso-ansi-language: EN"&gt;You
shall be setting SQL aliases on &lt;b style="mso-bidi-font-weight: normal"&gt;front end
servers,&lt;/b&gt; where you don’t have SQL Server installed. Then, you shall use SQL Client
Configuration utility &lt;b style="mso-bidi-font-weight: normal"&gt;cliconfig&lt;/b&gt;, located
here: C:\Windows\System32\cliconfg.exe.&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 10pt"&gt;
&lt;span lang=EN style="FONT-SIZE: 8.5pt; COLOR: #585858; LINE-HEIGHT: 115%; FONT-FAMILY: 'Verdana','sans-serif'; mso-bidi-font-family: Tahoma; mso-ansi-language: EN"&gt;Here
is the location to the key that this tool sets. This key can be directly modified
in &lt;b style="mso-bidi-font-weight: normal"&gt;registry&lt;/b&gt; to change the alias. 
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;span lang=EN style="FONT-SIZE: 8.5pt; COLOR: #585858; LINE-HEIGHT: 115%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: Calibri; mso-fareast-theme-font: minor-latin; mso-bidi-font-family: Tahoma; mso-ansi-language: EN; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"&gt;[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer\Client\ConnectTo]&lt;br&gt;
SQL -&amp;gt; DBMSSOCN, SQL1&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;img src="/content/binary/mirrorr1.png" border=0&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 10pt"&gt;
&lt;b style="mso-bidi-font-weight: normal"&gt;&lt;span lang=EN style="FONT-SIZE: 8.5pt; COLOR: #585858; LINE-HEIGHT: 115%; FONT-FAMILY: 'Verdana','sans-serif'; mso-bidi-font-family: Tahoma; mso-ansi-language: EN"&gt;“Active-active”
Database mirroring&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;&lt;/b&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 10pt"&gt;
&lt;span lang=EN style="FONT-SIZE: 8.5pt; COLOR: #585858; LINE-HEIGHT: 115%; FONT-FAMILY: 'Verdana','sans-serif'; mso-bidi-font-family: Tahoma; mso-ansi-language: EN"&gt;By
definition, Database mirroring implies that one server is the principal, and the other
is the mirror. With this configuration, each of the servers is running as &lt;b style="mso-bidi-font-weight: normal"&gt;principal&lt;/b&gt; for
some of the databases, and &lt;b style="mso-bidi-font-weight: normal"&gt;mirror&lt;/b&gt; for
the others, and vice versa. 
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 10pt"&gt;
&lt;span lang=EN style="FONT-SIZE: 8.5pt; COLOR: #585858; LINE-HEIGHT: 115%; FONT-FAMILY: 'Verdana','sans-serif'; mso-bidi-font-family: Tahoma; mso-ansi-language: EN"&gt;The
purpose is to &lt;b style="mso-bidi-font-weight: normal"&gt;distribute the load&lt;/b&gt; between
the two servers and to utilize the memory of both of the servers. If you have read
operation, than only the principal server of the database will register &lt;b style="mso-bidi-font-weight: normal"&gt;disk
IO&lt;/b&gt;. Of course, if you have write operation, than both the principal and the mirror
will carry out the operation.&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 10pt"&gt;
&lt;span lang=EN style="FONT-SIZE: 8.5pt; COLOR: #585858; LINE-HEIGHT: 115%; FONT-FAMILY: 'Verdana','sans-serif'; mso-bidi-font-family: Tahoma; mso-ansi-language: EN"&gt;Also,
with SharePoint, you can put &lt;b style="mso-bidi-font-weight: normal"&gt;site collections&lt;/b&gt; in
separate content databases. That means that you can have half of the site collections
running on SQL 1 as principal, and half of them running on SQL 2 as principal.&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 10pt"&gt;
&lt;span lang=EN style="FONT-SIZE: 8.5pt; COLOR: #585858; LINE-HEIGHT: 115%; FONT-FAMILY: 'Verdana','sans-serif'; mso-bidi-font-family: Tahoma; mso-ansi-language: EN"&gt;Note
that if you use “active-active” type of DB Mirroring, you will have to &lt;b style="mso-bidi-font-weight: normal"&gt;license&lt;/b&gt; the
both of the SQL Servers. If one server is acting as only mirror instance, then you
will have to have license only one SQL Server – the principal server. 
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 10pt"&gt;
&lt;b style="mso-bidi-font-weight: normal"&gt;&lt;span lang=EN style="FONT-SIZE: 8.5pt; COLOR: #585858; LINE-HEIGHT: 115%; FONT-FAMILY: 'Verdana','sans-serif'; mso-bidi-font-family: Tahoma; mso-ansi-language: EN"&gt;Manual
vs. Automatic Failover&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;&lt;/b&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 10pt"&gt;
&lt;span lang=EN style="FONT-SIZE: 8.5pt; COLOR: #585858; LINE-HEIGHT: 115%; FONT-FAMILY: 'Verdana','sans-serif'; mso-bidi-font-family: Tahoma; mso-ansi-language: EN"&gt;With &lt;b style="mso-bidi-font-weight: normal"&gt;manual&lt;/b&gt; failover
you will have to run the following scripts:&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoListParagraphCxSpFirst style="MARGIN: 0in 0in 0pt 0.5in; TEXT-INDENT: -0.25in; mso-list: l0 level1 lfo1"&gt;
&lt;span lang=EN style="FONT-SIZE: 8.5pt; COLOR: #585858; LINE-HEIGHT: 115%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: Verdana; mso-bidi-font-family: Verdana; mso-ansi-language: EN"&gt;&lt;span style="mso-list: Ignore"&gt;-&lt;span style="FONT: 7pt 'Times New Roman'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;b style="mso-bidi-font-weight: normal"&gt;&lt;span lang=EN style="FONT-SIZE: 8.5pt; COLOR: #585858; LINE-HEIGHT: 115%; FONT-FAMILY: 'Verdana','sans-serif'; mso-bidi-font-family: Tahoma; mso-ansi-language: EN"&gt;T-SQL
Script&lt;/span&gt;&lt;/b&gt;&lt;span lang=EN style="FONT-SIZE: 8.5pt; COLOR: #585858; LINE-HEIGHT: 115%; FONT-FAMILY: 'Verdana','sans-serif'; mso-bidi-font-family: Tahoma; mso-ansi-language: EN"&gt; on
the active server to force manual failover on the mirror server (with data loss if
you use asynchronous mirroring)&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoListParagraphCxSpLast style="MARGIN: 0in 0in 10pt 0.5in; TEXT-INDENT: -0.25in; mso-list: l0 level1 lfo1"&gt;
&lt;span lang=EN style="FONT-SIZE: 8.5pt; COLOR: #585858; LINE-HEIGHT: 115%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: Verdana; mso-bidi-font-family: Verdana; mso-ansi-language: EN"&gt;&lt;span style="mso-list: Ignore"&gt;-&lt;span style="FONT: 7pt 'Times New Roman'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;b style="mso-bidi-font-weight: normal"&gt;&lt;span lang=EN style="FONT-SIZE: 8.5pt; COLOR: #585858; LINE-HEIGHT: 115%; FONT-FAMILY: 'Verdana','sans-serif'; mso-bidi-font-family: Tahoma; mso-ansi-language: EN"&gt;Registry
update script&lt;/span&gt;&lt;/b&gt;&lt;span lang=EN style="FONT-SIZE: 8.5pt; COLOR: #585858; LINE-HEIGHT: 115%; FONT-FAMILY: 'Verdana','sans-serif'; mso-bidi-font-family: Tahoma; mso-ansi-language: EN"&gt; on
each of the front-end servers to update the SQL Aliases. Also, you can use remote
registry in order to run the script remotely on each of the servers in the farm.&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 10pt"&gt;
&lt;span lang=EN style="FONT-SIZE: 8.5pt; COLOR: #585858; LINE-HEIGHT: 115%; FONT-FAMILY: 'Verdana','sans-serif'; mso-bidi-font-family: Tahoma; mso-ansi-language: EN"&gt;SharePoint
with does not support truly &lt;b style="mso-bidi-font-weight: normal"&gt;automatic&lt;/b&gt; failover.
However, what you can do is you can use&amp;nbsp;a specific event that is triggered when&amp;nbsp;DB
mirroring failver has occured. The event will initiate a SQL server job, which in
turn will update the SQL aliases.&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 10pt"&gt;
&lt;span lang=EN style="FONT-SIZE: 8.5pt; COLOR: #585858; LINE-HEIGHT: 115%; FONT-FAMILY: 'Verdana','sans-serif'; mso-bidi-font-family: Tahoma; mso-ansi-language: EN"&gt;Once
the other server is up and running, you will have to revert the databases to their,
and update the SQL aliases as well. 
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 10pt"&gt;
&lt;b style="mso-bidi-font-weight: normal"&gt;&lt;span lang=EN style="FONT-SIZE: 8.5pt; COLOR: #585858; LINE-HEIGHT: 115%; FONT-FAMILY: 'Verdana','sans-serif'; mso-bidi-font-family: Tahoma; mso-ansi-language: EN"&gt;Our
implementation:&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;&lt;/b&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;span lang=EN style="FONT-SIZE: 8.5pt; COLOR: #585858; LINE-HEIGHT: 115%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: Calibri; mso-fareast-theme-font: minor-latin; mso-bidi-font-family: Tahoma; mso-ansi-language: EN; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"&gt;We
implemented asynchronous active-active mirroring, with fully-scripted manual failover
without witness server.&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;span lang=EN style="FONT-SIZE: 8.5pt; COLOR: #585858; LINE-HEIGHT: 115%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: Calibri; mso-fareast-theme-font: minor-latin; mso-bidi-font-family: Tahoma; mso-ansi-language: EN; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"&gt;Sincerely,&lt;br&gt;
Rossen Zhivkov&lt;/span&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blogs.abilitics.com/aggbug.ashx?id=38c15f5a-f88d-4766-bd80-c46a46dff13b" /&gt;</description>
      <comments>http://blogs.abilitics.com/CommentView,guid,38c15f5a-f88d-4766-bd80-c46a46dff13b.aspx</comments>
      <category>SharePoint</category>
    </item>
    <item>
      <trackback:ping>http://blogs.abilitics.com/Trackback.aspx?guid=bbf2fe68-31b5-4c9d-87f0-3213802b4f29</trackback:ping>
      <pingback:server>http://blogs.abilitics.com/pingback.aspx</pingback:server>
      <pingback:target>http://blogs.abilitics.com/PermaLink,guid,bbf2fe68-31b5-4c9d-87f0-3213802b4f29.aspx</pingback:target>
      <dc:creator>Rossen Zhivkov</dc:creator>
      <wfw:comment>http://blogs.abilitics.com/CommentView,guid,bbf2fe68-31b5-4c9d-87f0-3213802b4f29.aspx</wfw:comment>
      <wfw:commentRss>http://blogs.abilitics.com/SyndicationService.asmx/GetEntryCommentsRss?guid=bbf2fe68-31b5-4c9d-87f0-3213802b4f29</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
          <strong>
            <font size="3">The scenario: </font>
          </strong>
        </p>
        <p>
One of our current projects required that we had to create a SharePoint list item
(task) when specific condition occurs in CRM - "Responsible person" is selected on
opportunity level. 
</p>
        <p>
          <strong>
            <font size="3">The solution:</font>
          </strong>
        </p>
        <p>
          <strong>1. Create web service on SharePoint Server</strong>
        </p>
        <p>
Often, you will have you SharePoint infrastructure reside on different server than
CRM. Then, you cannot access the object model directly so you need to create a web
serivice. Decide also on service authentication.
</p>
        <p>
In our case - the web service creates an list item (task) in SharePoint, and fills
it with the necessary properties.<br /><br /><strong>2. Create custom workflow activity<br /><br /></strong><span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"><font face="Verdana" size="2">2.1.
Create sharepoint workflow activity library. Add CRM assemblies (from CRM SDK). Annotate
class with appropriate attributes.</font></span></p>
        <pre>
          <span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">[CrmWorkflowActivity(<span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4">"Crm
Workflow Activity"</span>, <span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4">"SharePoint
Activity"</span>)] <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">public</span> partial <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">class</span> SharePointActivity:
SequenceActivity { <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">   public</span> SharePointActivity()
   {       InitializeComponent();    }
}</span>
        </pre>
        <p>
2.2. Register dependency properties, which will then be fed from CRM 
</p>
        <pre>
          <span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">
            <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">public</span>
            <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">static</span> DependencyProperty
responsiblePersonProperty <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">=<br /></span>   DependencyProperty.Register(<span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4">"responsiblePerson"</span>, <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">typeof</span>(<span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">string</span>), <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">typeof</span>(SharePointActivity));
[CrmInput(<span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4">"responsiblePerson"</span>)]
[CrmDefault(<span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4">@""</span>)] <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">public</span><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">string</span> responsiblePerson
{    get    { <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">      return</span> (<span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">string</span>)<span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">base</span>.GetValue(responsiblePersonProperty);
   }    set    { <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">      base</span>.SetValue(responsiblePersonProperty,
value);    }<br />
}</span>
        </pre>
        <p>
2.3. Call the SharePoint web service. For simplicity - no error handling &amp; no
security calling the service.
</p>
        <pre>
          <span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">
            <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">protected</span>
            <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">override</span> ActivityExecutionStatus
Execute(ActivityExecutionContext executionContext) {    SamsService
sams <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">=</span><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">new</span> SamsService();
   sams.CreateTask(responsiblePerson); <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">   return</span> ActivityExecutionStatus.Closed;
}</span>
        </pre>
        <p>
          <strong>3. Register the custom workflow activity in CRM and enable debugging</strong>
        </p>
        <p>
Registration is pretty straighforward with tools in CRM SDK (plugin registration).
CRM workflows are run "assyncronously" by CRM Assyncronours Service - this means that
in order to debug your custom workflow activites, you need to attach to this service,
not to w3wp. Also,  your code is run with service's credentials  (network
service by default), so you might experience security issues. 
</p>
        <p>
Remember also iisreset &amp; restart assync service on every change<br /></p>
        <p>
          <strong>4. Create CRM workflow that uses the custom activity</strong>
        </p>
        <p>
The workflow is started automatically when opportunity is created. The workflow waits
untill "Reponsible person" is not blank. Then the workllow executes our custom workflow
activity for SharePoint integration, passing all the required properties. 
</p>
        <p>
          <img src="/content/binary/png1.png" width="630" border="0" />
        </p>
        <p>
          <br />
You can pass data from opportunity level, or any related entites such as Primary Contact
or Account to every custom activity's dependency property that has been marked
with the CrmInput attribute.
</p>
        <p>
          <img src="/content/binary/png2.png" width="630" border="0" />
        </p>
        <p>
Sincerely,<br />
Rossen
</p>
        <img width="0" height="0" src="http://blogs.abilitics.com/aggbug.ashx?id=bbf2fe68-31b5-4c9d-87f0-3213802b4f29" />
      </body>
      <title>Integrating CRM 4.0 and SharePoint with Workflows</title>
      <guid isPermaLink="false">http://blogs.abilitics.com/PermaLink,guid,bbf2fe68-31b5-4c9d-87f0-3213802b4f29.aspx</guid>
      <link>http://blogs.abilitics.com/2008/11/12/IntegratingCRM40AndSharePointWithWorkflows.aspx</link>
      <pubDate>Wed, 12 Nov 2008 21:41:43 GMT</pubDate>
      <description>&lt;p&gt;
&lt;strong&gt;&lt;font size=3&gt;The scenario: &lt;/font&gt;&lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
One of our current projects required that we had to create a SharePoint list item
(task) when specific condition occurs in CRM - "Responsible person" is selected on
opportunity level. 
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;&lt;font size=3&gt;The solution:&lt;/font&gt;&lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;1. Create web service on SharePoint Server&lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
Often, you will have you SharePoint infrastructure reside on different server than
CRM. Then, you cannot access the object model directly so you need to create a web
serivice. Decide also on service authentication.
&lt;/p&gt;
&lt;p&gt;
In our case - the web service creates an list item (task) in SharePoint, and fills
it with the necessary properties.&lt;br&gt;
&lt;br&gt;
&lt;strong&gt;2. Create custom workflow activity&lt;br&gt;
&lt;br&gt;
&lt;/strong&gt;&lt;span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&lt;font face=Verdana size=2&gt;2.1.
Create sharepoint workflow activity library. Add CRM assemblies (from CRM SDK). Annotate
class with appropriate attributes.&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;pre&gt;&lt;span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;[CrmWorkflowActivity(&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"Crm
Workflow Activity"&lt;/span&gt;, &lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"SharePoint
Activity"&lt;/span&gt;)] &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;public&lt;/span&gt; partial &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;class&lt;/span&gt; SharePointActivity:
SequenceActivity { &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;public&lt;/span&gt; SharePointActivity()
&amp;nbsp;&amp;nbsp;&amp;nbsp;{ &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;InitializeComponent(); &amp;nbsp;&amp;nbsp;&amp;nbsp;}
}&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;
2.2. Register dependency properties, which will then be fed from CRM 
&lt;/p&gt;
&lt;pre&gt;&lt;span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;public&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;static&lt;/span&gt; DependencyProperty
responsiblePersonProperty &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;br&gt;
&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;DependencyProperty.Register(&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"responsiblePerson"&lt;/span&gt;, &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;typeof&lt;/span&gt;(&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;string&lt;/span&gt;), &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;typeof&lt;/span&gt;(SharePointActivity));
[CrmInput(&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"responsiblePerson"&lt;/span&gt;)]
[CrmDefault(&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;@""&lt;/span&gt;)] &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;public&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;string&lt;/span&gt; responsiblePerson
{ &amp;nbsp;&amp;nbsp;&amp;nbsp;get &amp;nbsp;&amp;nbsp;&amp;nbsp;{ &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&lt;/span&gt; (&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;string&lt;/span&gt;)&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;base&lt;/span&gt;.GetValue(responsiblePersonProperty);
&amp;nbsp;&amp;nbsp;&amp;nbsp;} &amp;nbsp;&amp;nbsp;&amp;nbsp;set &amp;nbsp;&amp;nbsp;&amp;nbsp;{ &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;base&lt;/span&gt;.SetValue(responsiblePersonProperty,
value); &amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;
}&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;
2.3. Call the SharePoint web service. For simplicity - no error handling &amp;amp; no
security calling the service.
&lt;/p&gt;
&lt;pre&gt;&lt;span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;protected&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;override&lt;/span&gt; ActivityExecutionStatus
Execute(ActivityExecutionContext executionContext) { &amp;nbsp;&amp;nbsp;&amp;nbsp;SamsService
sams &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;new&lt;/span&gt; SamsService();
&amp;nbsp;&amp;nbsp;&amp;nbsp;sams.CreateTask(responsiblePerson); &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&lt;/span&gt; ActivityExecutionStatus.Closed;
}&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;
&lt;strong&gt;3. Register the custom workflow activity in CRM and enable debugging&lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
Registration is pretty straighforward with tools in CRM SDK (plugin registration).
CRM workflows are run "assyncronously" by CRM Assyncronours Service - this means that
in order to debug your custom workflow activites, you need to attach to this service,
not to w3wp. Also,&amp;nbsp; your code is run with service's credentials&amp;nbsp; (network
service by default), so you might experience security issues. 
&lt;/p&gt;
&lt;p&gt;
Remember also iisreset &amp;amp; restart assync service on every change&lt;br&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;4. Create CRM workflow that uses the custom activity&lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
The workflow is started automatically when opportunity is created. The workflow waits
untill "Reponsible person" is not blank. Then the workllow executes our custom workflow
activity for SharePoint integration, passing all the required properties. 
&lt;/p&gt;
&lt;p&gt;
&lt;img src="/content/binary/png1.png" width=630 border=0&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;br&gt;
You can pass data from opportunity level, or any related entites such as Primary Contact
or Account to every&amp;nbsp;custom activity's dependency property that has been marked
with the CrmInput attribute.
&lt;/p&gt;
&lt;p&gt;
&lt;img src="/content/binary/png2.png" width=630 border=0&gt;
&lt;/p&gt;
&lt;p&gt;
Sincerely,&lt;br&gt;
Rossen
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blogs.abilitics.com/aggbug.ashx?id=bbf2fe68-31b5-4c9d-87f0-3213802b4f29" /&gt;</description>
      <comments>http://blogs.abilitics.com/CommentView,guid,bbf2fe68-31b5-4c9d-87f0-3213802b4f29.aspx</comments>
      <category>CRM</category>
      <category>SharePoint</category>
    </item>
    <item>
      <trackback:ping>http://blogs.abilitics.com/Trackback.aspx?guid=a5ed35e5-2532-42a9-9e7b-80ae6341d14c</trackback:ping>
      <pingback:server>http://blogs.abilitics.com/pingback.aspx</pingback:server>
      <pingback:target>http://blogs.abilitics.com/PermaLink,guid,a5ed35e5-2532-42a9-9e7b-80ae6341d14c.aspx</pingback:target>
      <dc:creator>Rossen Zhivkov</dc:creator>
      <wfw:comment>http://blogs.abilitics.com/CommentView,guid,a5ed35e5-2532-42a9-9e7b-80ae6341d14c.aspx</wfw:comment>
      <wfw:commentRss>http://blogs.abilitics.com/SyndicationService.asmx/GetEntryCommentsRss?guid=a5ed35e5-2532-42a9-9e7b-80ae6341d14c</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
We have recently completed a SharePoint Services 3.0 project for task management and
business processes automation. It is a good habit to keep track of what issues
appeared in the project, so that you can make better architecture decisions in
the future.
</p>
        <p>
          <img src="http://blogs.abilitics.com/content/binary/Image_SharePont.png" width="600" border="0" />
        </p>
        <p>
Here is the quick “lessons learned” list:
</p>
        <p>
          <strong>1. Forms authentication<br /></strong>Create first a SharePoint web application with windows authentication, then
extent the web application with forms authentication. Develop or purchase additional
component for users’ registration with features like resetting passwords and emailing
forgotten password.<br /><br />
Articles:<br /><a href="http://msdn.microsoft.com/en-us/library/bb975136.aspx">http://msdn.microsoft.com/en-us/library/bb975136.aspx</a><br /><a href="http://www.simple-talk.com/dotnet/windows-forms/configuring-forms-authentication-in-sharepoint-2007/">http://www.simple-talk.com/dotnet/windows-forms/configuring-forms-authentication-in-sharepoint-2007/</a><br />
Free tool to manage users:<br /><a href="http://www.codeplex.com/fba/Wiki/View.aspx?title=basic%20FBA%20user%20and%20role%20management&amp;referringTitle=Home">http://www.codeplex.com/fba/Wiki/View.aspx?title=basic%20FBA%20user%20and%20role%20management&amp;referringTitle=Home</a></p>
        <p>
          <strong>2. Office integration with SharePoint with Forms authentication<br /></strong>Not working by default as you might have guessed. These are the steps (in
brief) how to configure it:
</p>
        <ul>
          <li>
Enable “client integration” In Central administration -&gt; Application Management
-&gt; Authentication Providers for the selected zone 
</li>
          <li>
When users sign in, they must check “remember me”. In that way, the authentication
cookie is persisted and the rich clients can authenticate to SharePoint. 
</li>
          <li>
SharePoint site must be in trusted sites, or in other internet explorer zone, which
has Internet explorer Protected mode turned off. Protected mode being off enables
other applications (such as Word, SharePoint designer), to use the authentication
cookie 
</li>
          <li>
The user must have appropriate access permissions to use rich client with SharePoint
(check permission levels)</li>
        </ul>
        <p>
Article: 
<br /><a href="http://msdn.microsoft.com/en-us/library/bb977430.aspx">http://msdn.microsoft.com/en-us/library/bb977430.aspx</a></p>
        <p>
          <strong>3. Alternate mappings for publishing SharePoint Services to Internet</strong>
          <br />
Check your alternate access mappings or use load-balanced URL when extending the SharePoint
site. Incorrect alternate access mappings cause login form to appear, but after logon,
a 404 error is given. General rule of thumb - if functionality are working in intranet,
but you have issues in internet, do check the alternate access mappings. Also, check
windows firewall if you use custom ports. You need to open incoming requests on these
ports.<br /><br />
Article:<br /><a href="http://blogs.msdn.com/sharepoint/archive/2007/03/06/what-every-sharepoint-administrator-needs-to-know-about-alternate-access-mappings-part-1.aspx">http://blogs.msdn.com/sharepoint/archive/2007/03/06/what-every-sharepoint-administrator-needs-to-know-about-alternate-access-mappings-part-1.aspx</a> (read
part 1, 2 and 3)<br /><br /><strong>4. Customizing Edit Pages 
<br /></strong>Customized edit pages enables you to rearrange fields, set some fields as
read only, adding additional user controls on the web page, and more.<br />
Abilitics free Edit Page redirector will be available soon. Edit page redirector “redirects”
users to appropriate edit page, based on their group membership or based on field
values. Stay tuned.<br /><br /><strong>5. SharePoint designer workflows &amp; Custom actions<br /></strong>Custom workflow activities enable you to add additional functionality to
workflows that you develop with SharePoint designer. 
<br />
Download free SharePoint designer activities: <a href="http://www.codeplex.com/SPDActivities">http://www.codeplex.com/SPDActivities</a>.
Giving permissions to users with forms authentication does not work. You have to modify
the code of this tool.<br /><br />
Some SharePoint designer workflow issues &amp; solutions:<br /><br />
Issue: Cannot select multiple users when selecting users (as in granting permissions
activity)<br />
Solution: The reason is because SharePoint designer user picker designer type does
not allow you to select multiple users. The workaround is to save the multiple users
in a dynamic string, and then feed the dynamic string to the activity.<br /><br />
Issue: After you edit workflow with SharePoint designer, SharePoint still runs the
old workflow<br />
Solution: it appears to be a bug of some kind. Our workaround is to copy the workflow
and associate it with another library, delete it from the original location, and then
return it back. A friend of mine with the same problem suggested to save the workflow
locally, delete it from SharePoint (the action deletes all previous versions), and
then upload it again.<br /><br />
Issue: SharePoint designer does not show latest version of a custom developed activity<br />
Solution: Delete SharePoint cache from this location C:\Users\rossen.ABILITICS\AppData\Local\Microsoft\WebsiteCache
(on Vista)<br /><br />
Issue: Access denied when custom SharePoint activity is run<br />
Solution: By default, the workflow runs with the security account of the user who
initiated the workflow. You need to run with elevated privileges with SPSecurity.RunWithElevatedPrivileges.
Do remember to recreate new SPSite &amp; SPWeb.
</p>
        <p>
          <strong>6. Modifying item when you have only read-only access</strong>
          <br />
Imagine a vacation request business process. Once approved, you will have read-only
access, because you should not be able to modify it. But you must be able to cancel
your vacation request.<br />
The solution: Create custom web part with single button (Cancel Vacation Request),
put it on the DispForm. The web part will use elevation of privilege (SPSecurity.RunWithElevatedPrivilege)
to modify the current item. DispForm is accessible when you have read-only access,
but edit form is not. 
<br /><br /><strong>7. Script Everything<br /></strong>If you repeat some action twice – script it! 
</p>
        <ul>
          <li>
Script web part deployment, SharePoint designer custom activity deployment, features
activation and deactivation 
</li>
          <li>
Script application pool recycling and web site warming up (<a href="http://blogs.msdn.com/joelo/archive/2006/08/13/697044.aspx">http://blogs.msdn.com/joelo/archive/2006/08/13/697044.aspx</a>) 
</li>
          <li>
Script backup and restore operations(and run backup as scheduled task, or backup the
DB regularily)</li>
        </ul>
        <p>
Script user configuration:<br />
Incorrectly set user accounts and group membership can ruin a perfectly fine SharePoint
implementation. User configuration shall be automated and validated for errors. 
</p>
        <ul>
          <li>
The client provides user accounts, temporary password, emails, user profiles, group
membership in excel file 
</li>
          <li>
Custom application creates the users in the SQL Server AspNetSqlMembership provider
database 
</li>
          <li>
Custom application fills in and validates user profiles in SharePoint (missing properties,
missing managers, incorrect email addresses) 
</li>
          <li>
Stsadm script adds the users to the required security groups in SharePoint</li>
        </ul>
        <p>
Sincerely,<br />
Rossen
</p>
        <img width="0" height="0" src="http://blogs.abilitics.com/aggbug.ashx?id=a5ed35e5-2532-42a9-9e7b-80ae6341d14c" />
      </body>
      <title>Lessons learned from SharePoint Services 3.0 project</title>
      <guid isPermaLink="false">http://blogs.abilitics.com/PermaLink,guid,a5ed35e5-2532-42a9-9e7b-80ae6341d14c.aspx</guid>
      <link>http://blogs.abilitics.com/2008/09/02/LessonsLearnedFromSharePointServices30Project.aspx</link>
      <pubDate>Tue, 02 Sep 2008 19:39:41 GMT</pubDate>
      <description>&lt;p&gt;
We have recently completed a SharePoint Services 3.0 project for task management and
business processes automation. It is a&amp;nbsp;good habit to keep track of what issues
appeared in the project, so that you&amp;nbsp;can make better architecture decisions in
the future.
&lt;/p&gt;
&lt;p&gt;
&lt;img src="http://blogs.abilitics.com/content/binary/Image_SharePont.png" width=600 border=0&gt;
&lt;/p&gt;
&lt;p&gt;
Here is the&amp;nbsp;quick “lessons learned” list:
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;1. Forms authentication&lt;br&gt;
&lt;/strong&gt;Create first a SharePoint web application with windows authentication, then
extent the web application with forms authentication. Develop or purchase additional
component for users’ registration with features like resetting passwords and emailing
forgotten password.&lt;br&gt;
&lt;br&gt;
Articles:&lt;br&gt;
&lt;a href="http://msdn.microsoft.com/en-us/library/bb975136.aspx"&gt;http://msdn.microsoft.com/en-us/library/bb975136.aspx&lt;/a&gt;
&lt;br&gt;
&lt;a href="http://www.simple-talk.com/dotnet/windows-forms/configuring-forms-authentication-in-sharepoint-2007/"&gt;http://www.simple-talk.com/dotnet/windows-forms/configuring-forms-authentication-in-sharepoint-2007/&lt;/a&gt;
&lt;br&gt;
Free tool to manage users:&lt;br&gt;
&lt;a href="http://www.codeplex.com/fba/Wiki/View.aspx?title=basic%20FBA%20user%20and%20role%20management&amp;amp;referringTitle=Home"&gt;http://www.codeplex.com/fba/Wiki/View.aspx?title=basic%20FBA%20user%20and%20role%20management&amp;amp;referringTitle=Home&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;2. Office integration with SharePoint with Forms authentication&lt;br&gt;
&lt;/strong&gt;Not working by default as you might have guessed. These are the steps (in
brief) how to configure&amp;nbsp;it:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
Enable “client integration” In Central administration -&amp;gt; Application Management
-&amp;gt; Authentication Providers for the selected zone 
&lt;li&gt;
When users sign in, they must check “remember me”. In that way, the authentication
cookie is persisted and the rich clients can authenticate to SharePoint. 
&lt;li&gt;
SharePoint site must be in trusted sites, or in other internet explorer zone, which
has Internet explorer Protected mode turned off.&amp;nbsp;Protected mode being off enables
other applications (such as Word, SharePoint designer), to use the authentication
cookie 
&lt;li&gt;
The user must have appropriate access permissions to use rich client with SharePoint
(check permission levels)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
Article: 
&lt;br&gt;
&lt;a href="http://msdn.microsoft.com/en-us/library/bb977430.aspx"&gt;http://msdn.microsoft.com/en-us/library/bb977430.aspx&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;3. Alternate mappings for publishing SharePoint Services to Internet&lt;/strong&gt;
&lt;br&gt;
Check your alternate access mappings or use load-balanced URL when extending the SharePoint
site. Incorrect alternate access mappings cause login form to appear, but after logon,
a 404 error is given. General rule of thumb - if functionality are working in intranet,
but you have issues in internet, do check the alternate access mappings. Also, check
windows firewall if you use custom ports. You need to open incoming requests on these
ports.&lt;br&gt;
&lt;br&gt;
Article:&lt;br&gt;
&lt;a href="http://blogs.msdn.com/sharepoint/archive/2007/03/06/what-every-sharepoint-administrator-needs-to-know-about-alternate-access-mappings-part-1.aspx"&gt;http://blogs.msdn.com/sharepoint/archive/2007/03/06/what-every-sharepoint-administrator-needs-to-know-about-alternate-access-mappings-part-1.aspx&lt;/a&gt; (read
part 1, 2 and 3)&lt;br&gt;
&lt;br&gt;
&lt;strong&gt;4. Customizing Edit Pages 
&lt;br&gt;
&lt;/strong&gt;Customized edit pages enables you to rearrange fields, set some fields as
read only, adding additional user controls on the web page, and more.&lt;br&gt;
Abilitics free Edit Page redirector will be available soon. Edit page redirector “redirects”
users to appropriate edit page, based on their group membership or based on field
values. Stay tuned.&lt;br&gt;
&lt;br&gt;
&lt;strong&gt;5. SharePoint designer workflows &amp;amp; Custom actions&lt;br&gt;
&lt;/strong&gt;Custom workflow activities enable you to add additional functionality to
workflows that you develop with SharePoint designer. 
&lt;br&gt;
Download free SharePoint designer activities: &lt;a href="http://www.codeplex.com/SPDActivities"&gt;http://www.codeplex.com/SPDActivities&lt;/a&gt;.
Giving permissions to users with forms authentication does not work. You have to modify
the code of this tool.&lt;br&gt;
&lt;br&gt;
Some SharePoint designer workflow issues&amp;nbsp;&amp;amp; solutions:&lt;br&gt;
&lt;br&gt;
Issue: Cannot select multiple users when selecting users (as in granting permissions
activity)&lt;br&gt;
Solution: The reason is because SharePoint designer user picker designer type does
not allow you to select multiple users. The workaround is to save the multiple users
in a dynamic string, and then feed the dynamic string to the activity.&lt;br&gt;
&lt;br&gt;
Issue: After you edit workflow with SharePoint designer, SharePoint still runs the
old workflow&lt;br&gt;
Solution: it appears to be a bug of some kind. Our workaround is to copy the workflow
and associate it with another library, delete it from the original location, and then
return it back. A friend of mine with the same problem suggested to save the workflow
locally, delete it from SharePoint (the action deletes all previous versions), and
then upload it again.&lt;br&gt;
&lt;br&gt;
Issue: SharePoint designer does not show latest version of a custom developed activity&lt;br&gt;
Solution: Delete SharePoint cache from this location C:\Users\rossen.ABILITICS\AppData\Local\Microsoft\WebsiteCache
(on Vista)&lt;br&gt;
&lt;br&gt;
Issue: Access denied when&amp;nbsp;custom SharePoint activity&amp;nbsp;is run&lt;br&gt;
Solution: By default, the workflow runs with the security account of the user who
initiated the workflow. You need to run with elevated privileges with SPSecurity.RunWithElevatedPrivileges.
Do remember to recreate new SPSite &amp;amp; SPWeb.
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;6. Modifying item when you have only&amp;nbsp;read-only access&lt;/strong&gt;
&lt;br&gt;
Imagine a vacation request business process. Once approved, you will have read-only
access, because you should not be able to modify it. But you must be able to cancel
your vacation request.&lt;br&gt;
The solution: Create custom web part with single button (Cancel Vacation Request),
put it on the DispForm. The web part&amp;nbsp;will&amp;nbsp;use elevation of privilege (SPSecurity.RunWithElevatedPrivilege)
to modify the current item. DispForm is accessible when you have read-only access,
but edit form is not. 
&lt;br&gt;
&lt;br&gt;
&lt;strong&gt;7. Script Everything&lt;br&gt;
&lt;/strong&gt;If you repeat some action twice – script it! 
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
Script web part deployment, SharePoint designer custom activity deployment, features
activation and deactivation 
&lt;li&gt;
Script application pool recycling and web site warming up (&lt;a href="http://blogs.msdn.com/joelo/archive/2006/08/13/697044.aspx"&gt;http://blogs.msdn.com/joelo/archive/2006/08/13/697044.aspx&lt;/a&gt;) 
&lt;li&gt;
Script backup and restore operations(and run backup as scheduled task, or backup the
DB regularily)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
Script user configuration:&lt;br&gt;
Incorrectly set user accounts and group membership can ruin a perfectly fine SharePoint
implementation. User configuration shall be automated and validated for errors.&amp;nbsp;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
The client provides user accounts, temporary password, emails, user profiles, group
membership in excel file 
&lt;li&gt;
Custom application creates the users in the SQL Server AspNetSqlMembership provider
database 
&lt;li&gt;
Custom application fills in and validates user profiles in SharePoint (missing properties,
missing managers, incorrect email addresses) 
&lt;li&gt;
Stsadm script adds the users to the required security groups in SharePoint&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
Sincerely,&lt;br&gt;
Rossen
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blogs.abilitics.com/aggbug.ashx?id=a5ed35e5-2532-42a9-9e7b-80ae6341d14c" /&gt;</description>
      <comments>http://blogs.abilitics.com/CommentView,guid,a5ed35e5-2532-42a9-9e7b-80ae6341d14c.aspx</comments>
      <category>SharePoint</category>
    </item>
    <item>
      <trackback:ping>http://blogs.abilitics.com/Trackback.aspx?guid=68705d71-a4db-4efb-8b57-a5d42401f4f2</trackback:ping>
      <pingback:server>http://blogs.abilitics.com/pingback.aspx</pingback:server>
      <pingback:target>http://blogs.abilitics.com/PermaLink,guid,68705d71-a4db-4efb-8b57-a5d42401f4f2.aspx</pingback:target>
      <dc:creator>Rossen Zhivkov</dc:creator>
      <wfw:comment>http://blogs.abilitics.com/CommentView,guid,68705d71-a4db-4efb-8b57-a5d42401f4f2.aspx</wfw:comment>
      <wfw:commentRss>http://blogs.abilitics.com/SyndicationService.asmx/GetEntryCommentsRss?guid=68705d71-a4db-4efb-8b57-a5d42401f4f2</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Dear friend,
</p>
        <p>
Welcome to my blog. I am the one in the right corner, couple of years younger … and
probably wiser :). Brave visionary, determined to go on a hard, but fulfilling journey
for creating success. 
<br />
Here is a little information where I came from, where I am now and where I want to
go!
</p>
        <p>
          <strong>The past</strong>
          <br />
I have spent 3-4 years in one of the leading IT services company in Bulgaria, working
on various projects for .NET, SharePoint and SQL Server. It has been a wild journey
between project work, presales activities, consulting, trainings, presentations, team
building events and everything. 
</p>
        <p>
Despite the fact that I enjoyed my work there and the strong friendships I built,
I decided that it is time to move on. It is time for new beginning, it is time to
make things the way I want them to be and the way I believe they should be.
</p>
        <p>
          <strong>The present 
<br /></strong>I found Abilitics, with lots of passion and belief that it will grow as one
beautiful and healthy company.  So far things are going better than expected.
Our clients believe and trust us, we respond with a quality work, dedication and great
results. 
</p>
        <p>
The team is great, motivated and happy.  We have lots of fun and laugher, which
is the way how we will make our way through the difficulties.   
</p>
        <p>
I am happy that I managed to find the right people for all of the key roles necessary
to deliver our services – we have the PM  &amp; Business analysis girl, the developer
guys, the infrastructure consultant and the QA.  Soon some of them will be blogging
too. The dev guys are great professionals, though I am little jealous that they are
getting better development experts than me. However, that is something that I expected
and ready to give up for the sake of the company success. 
</p>
        <p>
          <strong>The future<br /></strong>Unknown! Fortunately.
</p>
        <p>
Stay with us, I am sure it will be a wild and very interesting ride.
</p>
        <p>
I will share you our experience about various topics around architecture and development
from our SharePoint and .NET projects, as well as Business Intelligence solutions
and Data Mining.
</p>
        <p>
I will give you some insights of our successful practices and the mistakes we
made in Abilitics business, sales and the management.<br />
Abilitics is launching lots of SharePoint-related products right now, some of them
commercial, but some of them are free.  Stay tuned to see how we can make your
life easier with delivering sharepoint projects.  
</p>
        <p>
          <strong>The end<br /></strong>Wish you all lots of good luck, interesting projects and a quality leisure
time. Enjoy!
</p>
        <p>
          <br />
Sincerely,<br /><em>Rossen Zhivkov<br /></em>Founder and Solution Architect,<br />
Abilitics Ltd.<br /></p>
        <img width="0" height="0" src="http://blogs.abilitics.com/aggbug.ashx?id=68705d71-a4db-4efb-8b57-a5d42401f4f2" />
      </body>
      <title>The past, the present and the future</title>
      <guid isPermaLink="false">http://blogs.abilitics.com/PermaLink,guid,68705d71-a4db-4efb-8b57-a5d42401f4f2.aspx</guid>
      <link>http://blogs.abilitics.com/2008/08/06/ThePastThePresentAndTheFuture.aspx</link>
      <pubDate>Wed, 06 Aug 2008 15:06:31 GMT</pubDate>
      <description>&lt;p&gt;
Dear friend,
&lt;/p&gt;
&lt;p&gt;
Welcome to my blog. I am the one in the right corner, couple of years younger … and
probably wiser :). Brave visionary, determined to go on a hard, but fulfilling journey
for creating success. 
&lt;br&gt;
Here is a little information where I came from, where I am now and where I want to
go!
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;The past&lt;/strong&gt;
&lt;br&gt;
I have spent 3-4 years in one of the leading IT services company in Bulgaria, working
on various projects for .NET, SharePoint and SQL Server. It has been a wild journey
between project work, presales activities, consulting, trainings, presentations, team
building events and everything. 
&lt;/p&gt;
&lt;p&gt;
Despite the fact that I enjoyed my work there and the strong friendships I built,
I decided that it is time to move on. It is time for new beginning, it is time to
make things the way I want them to be and the way I believe they should be.
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;The present 
&lt;br&gt;
&lt;/strong&gt;I found Abilitics, with lots of passion and belief that it will grow as one
beautiful and healthy company.&amp;nbsp; So far things are going better than expected.
Our clients believe and trust us, we respond with a quality work, dedication and great
results. 
&lt;/p&gt;
&lt;p&gt;
The team is great, motivated and happy.&amp;nbsp; We have lots of fun and laugher, which
is the way how we will make our way through the difficulties.&amp;nbsp;&amp;nbsp; 
&lt;/p&gt;
&lt;p&gt;
I am happy that I managed to find the right people for all of the key roles necessary
to deliver our services – we have the PM&amp;nbsp; &amp;amp; Business analysis girl, the developer
guys, the infrastructure consultant and the QA.&amp;nbsp; Soon some of them will be blogging
too. The dev guys are great professionals, though I am little jealous that they are
getting better development experts than me. However, that is something that I expected
and ready to give up for the sake of the company success. 
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;The future&lt;br&gt;
&lt;/strong&gt;Unknown! Fortunately.
&lt;/p&gt;
&lt;p&gt;
Stay with us, I am sure it will be a wild and very interesting ride.
&lt;/p&gt;
&lt;p&gt;
I will share you our experience about various topics around architecture and development
from our SharePoint and .NET projects, as well as Business Intelligence solutions
and Data Mining.
&lt;/p&gt;
&lt;p&gt;
I will give you some insights of our successful practices&amp;nbsp;and the mistakes we
made in Abilitics business, sales and the management.&lt;br&gt;
Abilitics is launching lots of SharePoint-related products right now, some of them
commercial, but some of them are free.&amp;nbsp; Stay tuned to see how we can make your
life easier with delivering sharepoint projects.&amp;nbsp; 
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;The end&lt;br&gt;
&lt;/strong&gt;Wish you all lots of good luck, interesting projects and a quality leisure
time. Enjoy!
&lt;/p&gt;
&lt;p&gt;
&lt;br&gt;
Sincerely,&lt;br&gt;
&lt;em&gt;Rossen Zhivkov&lt;br&gt;
&lt;/em&gt;Founder and Solution Architect,&lt;br&gt;
Abilitics Ltd.&lt;br&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blogs.abilitics.com/aggbug.ashx?id=68705d71-a4db-4efb-8b57-a5d42401f4f2" /&gt;</description>
      <comments>http://blogs.abilitics.com/CommentView,guid,68705d71-a4db-4efb-8b57-a5d42401f4f2.aspx</comments>
      <category>General</category>
      <category>SharePoint</category>
    </item>
  </channel>
</rss>