2009/10/27

CRM 4.0 Disaster Recovery

1. Backup requirements summary
Backup requirements vary according to the servers involved. The following table is a summary of what to back up for Microsoft Dynamics CRM.
Server What to back up for Microsoft Dynamics CRM Comments
Domain controller Full System State None.
Exchange Server Backup not required by Microsoft Dynamics CRM. Backup may be required for Exchange.
SQL Server MSCRM_CONFIG
OrganizationName_MSCRM
master
msdb
ReportServer
ReportServertempdb Backup should be done by using Reporting Services. The OrganizationName_MSCRM and ReportServer databases should have full database backups and transaction log backups. For databases that are rarely updated, such as msdb and MSCRM_CONFIG, you may select only full database backup. Backup of the master and msdb databases are not required by Microsoft Dynamics CRM but should be part of an overall backup strategy.
Microsoft Dynamics CRM Server web.config
(Default location: c:\Inetpub\wwwroot)
Windows registry:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSCRM The web.config file is required only if the file has been changed from the default settings. The file location assumes the installation occurred at the Default Web site.
Windows registry subkey.

1.1 Selecting a backup model
When you back up to tape, we recommend that you select a tape backup rotation model that guarantees data protection in case a tape malfunctions or loss. When backing up to disk, you can implement similar logic for rotating disk files. A popular tape rotation scheme is grandparent-parent-child:
• The tape used for backup on the last Friday of each month is called the grandparent tape. This tape is stored off-site.
• The tape used for backup every Friday (except the last Friday of the month) is called the parent tape. This tape is also stored off-site.
• The tapes used for backup on Monday, Tuesday, Wednesday, and Thursday are called child tapes. Frequently all child tapes are stored on-site except for the tape from the previous day.
The following backup options are available when you use the Microsoft Backup and Restore Wizard:
• Normal. Backs up all selected files and marks the files as backed up.
• Copy. Backs up all selected files, but does not mark the files as backed up.
• Differential. Backs up selected files, only if they have not been previously backed up, or changed since the last backup, but does not mark the files as backed up.
• Incremental. Backs up selected files, only if they have not been previously backed up, or changed, since the last backup, and marks the files as backed up.
• Daily. Backs up only files that have been changed, on that particular day, and marks them as backed up.
Because many small businesses typically do not have system administrators on staff, a regular backup, which is performed daily and according to the suggested grandparent-parent-child backup model, is recommended for small organizations. Larger organizations likely have an existing backup methodology that Microsoft Dynamics CRM will fit into.


1.2 Backing up Windows Server 2003
Windows Server 2003 has a comprehensive backup utility that lets you back up important company data to disk or tape media. The scheduling capability found in the Backup and Restore Wizard provides data backup for the server itself and workstations in the small business network. The data backed up includes security information, file and share permissions, and registry data. For data security, only a member of the Administrators or Backup Operators group can perform a backup. Individual files and directories on the server can be restored by using the Backup and Restore Wizard.
When you back up to tape, the Backup and Restore Wizard requires that the tape backup device be connected to a compatible SCSI or non-SCSI controller card. The controller card must be installed correctly and functional. Windows Server 2003 automates the installation of a controller card because the new hardware is detected at system startup and the correct drivers are automatically installed.

1.3 Backing up Active Directory
The Backup and Restore Wizard can back up System State data, which includes Active Directory, system startup files, the Component Services Class Registration database, the registry, and SysVol. Possible backup locations for System State data include floppy disks, hard disks, removable media, recordable compact discs, and tapes.
Although we recommend that you back up Active Directory, the only way to avoid data loss is to have multiple Active Directory domain controllers. Then, if a domain controller fails, the other domain controllers will have a complete copy of the directory. With a tape backup, you have data only as recent as your last backup.
Active Directory is a transacted database system that uses log files that support roll-back semantics to make sure that transactions are committed to the database. The files associated with Active Directory are as follows:
• Ntds.dit. The database.
• Edbxxxxx.log. Transaction logs.
• Edb.chk. Checkpoint file.
• Res1.log and Res2.log. Reserved log files.
Ntds.dit grows as the database fills up. However, the logs are of fixed size (10 MB). Any change made to the database is also appended to the current log file, and its disk image is always kept up to date.
Edb.log is the current log file. When a change is made to the database, it is written to the Edb.log file. When the Edb.log file is full of transactions, it is renamed to Edbxxxxx.log. (It starts at 00001 and continues to increment by using hexadecimal notation.) Because Active Directory uses circular logging, old log files are constantly deleted as soon as they have been written to the database. At any point in time, you will have the Edb.log file and maybe one or more Edbxxxxx.log files.
The Edb.chk file stores the database checkpoint, which identifies the point where the database engine has to replay the logs, generally at the time of recovery or initialization.
Res1.log and Res2.log are "placeholders," designed to reserve (in this case) the last 20 MB of disk space. This gives the log files sufficient room for a graceful shutdown if all other disk space is consumed.


1.4 Backing up SQL Server, including Reporting Services
The Backup and Restore Wizard in Windows Server 2003 cannot back up SQL Server databases that are online, instead you must first stop the MSSQLSERVER service. A better solution that can be used while SQL Server runs is the built-in backup. Use SQL Server 2005 Management Studio to create a backup of the SQL Server databases. Then, you can run a backup job from the Backup and Restore Wizard to include database backups that Reporting Services created. You would schedule the backup routing in Reporting Services to run first, followed by a backup job run in the Backup and Restore Wizard. For more information about SQL Server backups, see Backing up and Restoring Databases in SQL Server Books Online.
Microsoft Dynamics CRM creates at least two Microsoft Dynamics CRM-specific databases on SQL Server. In addition, Microsoft Dynamics CRM requires the default master and msdb SQL Server databases for database services and the default report server SQL Server databases for Reporting Services. The databases that make up a Microsoft Dynamics CRM system on SQL Server are as follows:
• OrganizationName_MSCRM
• MSCRM_CONFIG
• ReportServer
• ReportServertempdb
• master
• msdb
Note
Your Microsoft Dynamics CRM deployment may include more than one OrganizationName_MSCRM database.
The SQL Server backup plan should address each of these databases to make sure that Microsoft Dynamics CRM could recover if one, or all, databases fail. If your organization already has SQL Server or another database application, your database administrator may have a database backup strategy. However, if this is the first database application in your organization, you can create and maintain scheduled backup jobs to perform the necessary backups by using the Maintenance Plan Wizard in SQL Server 2005 Management Studio. To start the Maintenance Plan Wizard, in Reporting Services, expand the server, expand the Management folder, right-click the Maintenance Plans folder, and then click Maintenance Plan Wizard.
Your backup plan for the Microsoft Dynamics CRM databases provides you a backup set that includes a full database backup and some number of transaction log backups, depending on the Microsoft Dynamics CRM installation and the frequency with which you determine whether you must have backups. For more information about backup and restore strategies, see SQL Server Books Online.
For databases that are updated infrequently, such as msdb and MSCRM_CONFIG, you might perform only full database backups. The OrganizationName_MSCRM and ReportServer databases should have both full database and transaction-log backups
Databases on which transaction log backups will be performed must have the Full recovery model database property set. You can set this property through SQL Server 2005 Management Studio. For more information about how to set database properties, see "How to Change the Configuration Settings for a Database" in SQL Server Books Online.
Schedule full database backups frequently enough to reduce the number of restores after a failure. For example, if one day's data loss is acceptable, you can back up the transaction log one time per day, and back up the database one time per week. If only one hour's maximum data loss is acceptable, you can back up the transaction log one time per hour. To reduce the number of restores, back up the database one time per day.
To create a database maintenance plan for scheduled backups, run the Maintenance Plan Wizard from SQL Server 2005 Management Studio. Select the option to back up the database as part of the maintenance plan for a full database backup. Select the option to back up the transaction log as part of the maintenance plan for a transaction log backup.
Your computer that is running SQL Server should also be designed with a level of fault-tolerance that is correct for a database server. This includes a RAID-5 disk array for your databases and a RAID-0 (mirror) for your transaction logs. With the correct level of hardware fault-tolerance, restoring from backup should be a very uncommon occurrence.


1.5 Backing up Exchange Server 2003 and Exchange Server 2007
The Backup and Restore Wizard in Windows Server 2003 can back up the Exchange Server 2003 or Exchange Server 2007 Information Store and directory services databases. Backing up the Exchange Information Store is an important part of creating a fault-tolerant messaging system. The backup and restore features in Exchange Server help you recover from various types of data loss with minimal downtime for your e-mail system.
Exchange Server uses the Backup and Restore Wizard to back up and restore the Exchange Information Store. The wizard helps you protect data from accidental loss or hardware and media failure by using a storage device to back up and restore data on any server in your organization locally, or over the network.
Improvements in Exchange Server make sure that backing up and restoring data is efficient and reliable. For example, you can restore one or more mailbox stores, or public folder stores, without shutting down the Information Store.
You can make sure that your organization is prepared to recover from data loss by performing the necessary planning and implementation. Developing a backup and restoration strategy consists of the following steps:
1. Understand Exchange Server database and storage group technology.
2. Design a backup plan.
3. Develop failure-recovery strategies.
4. Restore data.
The Microsoft Dynamics CRM E-mail Router can be installed to receive incoming e-mail messages from Exchange Servers. If the E-mail Router fails and is recovered, the E-mail Router component must be reinstalled so that it will continue to identify Microsoft Dynamics CRM e-mail messages as they enter the organization.


1.6 Backing up Microsoft Dynamics CRM Server
Backing up and restoring the Microsoft Dynamics CRM Server basically involves the following data:
• Microsoft Dynamics CRM Server database files (explained previously)
• Microsoft Dynamics CRM Server program files
• Microsoft Dynamics CRM Web site files
• Customizations made to Microsoft Dynamics CRM
By default, all Microsoft Dynamics CRM program files are located in the following folder:
C:\Program Files\Microsoft CRM\
By default, the Microsoft Dynamics CRM Web site files are located in the following folder:
C:\Inetpub\wwwroot
The Export Customizations tool can be used to back up Microsoft Dynamics CRM customizations such as modified forms, views, and mappings. The Export Customizations tool is located in the Customizations area of the Settings area in the Microsoft Dynamics CRM application. It is a good practice to make a backup of your customizations before you try to make changes.


1.6.1 Backing up your Customizations
It's a good idea to back up (Export) your Customizations on a fairly regular basis - after you create or alter any of your Entities, Workflows, etc. This is a very simple process that can make your live easier in the future. If you are just getting started with CRM Live, go ahead and create a baseline export of the pristine system.
1. Navigate to Settings -> Customizations -> Export Customizations.
2. Select More Actions -> Export All Customizations.
3. You may get an Internet Explorer warning. Click Download File.
4. Don't be surprised if your only result is that you go back to your main Workplace screen. Simply repeat steps 1 & 2 above and I expect you will be successful
5. Give the customization.zip file a logical name and save it to a location that has strong backup procedures in place.

2. Failure Recovery
To understand the failure-recovery procedures, you must examine several different scenarios to learn how restoration occurs in each case. For each scenario in this guide, total server failure is assumed. The following four scenarios contain information that shows the steps to ensure successful recovery.
2.1 SQL Server failure
If the computer that is running Microsoft SQL Server fails, you must restore the databases from backup, and then re-associate them with the Microsoft Dynamics CRM deployment.
To recover from this failure, follow these steps:
1. Install Windows Server 2003 or Windows Server 2008, and make sure that the computer is in the same domain as the Microsoft Dynamics CRM Server. In addition, you should use the same database name and disk structure. If you change either of these, you must take additional steps to correctly restore the SQL Server databases.
2. Install SQL Server.
3. If you have a valid backup of the master database, restore that backup. For more information, see Restoring the master Database in SQL Server Books Online.
4. Restore the msdb database. For more information, see Restoring the model and msdb Databases in SQL Server Books Online.
5. Restore the MSCRM_CONFIG and OrganizationName_MSCRM databases. For more information about how to restore databases, see Backing Up and Restoring Databases.
6. If Microsoft SQL Server Reporting Services and the Microsoft Dynamics CRM 4.0 Connector for Microsoft SQL Server Reporting Services are also installed on the instance of SQL Server, restore the ReportServer and ReportServertempDB databases. For more information about how to restore databases, see Backing Up and Restoring Databases.
7. If you restored the MSCRM_CONFIG database, you must run Microsoft Dynamics CRM Server Setup and use the Connect to existing databases option on the Specify Deployment Options page. If you did not restore the MSCRM_CONFIG database and the database is functioning correctly, you use the Import Organization feature in Microsoft Dynamics CRM Deployment Manager to re-associate the organization database with the Microsoft Dynamics CRM system. For more information about how to import an organization, see the Deployment Manager Help.
This scenario is a worst-case situation, that is, total failure of the computer that is running SQL Server. In other circumstances, such as the failure of a disk, you may only have to restore a single database to recover the environment

2.2 Microsoft Dynamics CRM Server failure
Most of the Microsoft Dynamics CRM configuration information is stored on the computer that is running SQL Server. Therefore, the information can be recovered if all, or part, of Microsoft Dynamics CRM Server fails. Registry entries on the Microsoft Dynamics CRM Server are recovered when you run repair or reinstall processes for the Microsoft Dynamics CRM Server and Microsoft Dynamics CRM 4.0 Connector for Microsoft SQL Server Reporting Services.
If the computer that is running Microsoft Dynamics CRM Server fails, follow these steps:
1. Install the operating system on another server and join the same domain as the computer that is running SQL Server.
2. Install Microsoft Dynamics CRM Server. During Setup, you must select Connect to existing databases when you are prompted. If Microsoft Dynamics CRM 4.0 Connector for Microsoft SQL Server Reporting Services was also installed on the computer that failed, install the Microsoft Dynamics CRM 4.0 Connector for Microsoft SQL Server Reporting Services after Microsoft Dynamics CRM Server is completed.
3. If ISV.config and web.config have been changed from their default settings, restore these files from backup.
4. Publish all customizations. To do this, in the Web application, click Settings, click Customization, click Customize Entities, on the Actions toolbar select More Actions, and then click Publish all Customizations.


2.2.1 Uninstall or repair Microsoft Dynamics CRM Server
To remove (uninstall) Microsoft Dynamics CRM Server, on the computer where the application is installed go to Add or Remove Programs, click Microsoft Dynamics CRM Server, click Change/Remove, select Uninstall to remove Microsoft Dynamics CRM Server, and then click Uninstall. Follow the instructions that are on the screen.
Important
The Microsoft Dynamics CRM uninstall process does not remove some components, such as the SQL Server databases, Active Directory groups, or the Microsoft Dynamics CRM Web site. Those components must be removed manually.
For more information about how to remove these components, or how to remove components if Setup cannot successfully remove them, see KB article 946980: How to manually remove the Microsoft Dynamics CRM 4.0 server.
To repair a damaged Microsoft Dynamics CRM Server installation, click Microsoft Dynamics CRM Server, click Change/Remove, select Repair, and then click Next. Follow the instructions that are on the screen.


2.3 Exchange Server failure
The process to restore a Microsoft Exchange Server computer that is used by Microsoft Dynamics CRM depends on the other uses of that instance of Exchange Server. Except for the forward mailbox, Microsoft Dynamics CRM does not directly use Exchange Server mailboxes.
Note
Installing the E-mail Router on a computer that is running Exchange Server is not required.
1. Restore Exchange Server.
2. If the E-mail Router was installed on the computer that is running Exchange Server, reinstall the E-mail Router.
3. Restore the Microsoft.Crm.Tools.EmailAgent.xml file. By default, this file is located in the Drive:\Program Files\Microsoft CRM Email\Service folder. If this file is not available, you must reconfigure the profiles, settings, users, queue, and forward-mailbox information by running the E-mail Router Configuration Manager.

2.4 Active Directory failure
In most environments, it is highly unlikely that Active Directory will fail on its own, because more than one Active Directory domain controller should be installed.
To recover from a failed domain controller, follow these steps:
1. Reinstall the Windows Server 2003 or Windows Server 2008operating system.
2. Perform a system state restore.
Make sure that you have a method for recovering from an Active Directory failure. Regardless of the size of your environment, you should consider having multiple domain controllers with regular backups of the system state. If your backups are not current, any data that belong to Microsoft Dynamics CRM objects in Active Directory will be orphaned in SQL Server and therefore will be unrecoverable. Any changes that are made in Microsoft Dynamics CRM, such as adding new Microsoft Dynamics CRM users or queues, requires that Active Directory is backed up immediately after the change.
One major problem can occur with Active Directory that stops Microsoft Dynamics CRM from functioning. If an administrator unintentionally deletes the organizational unit (OU) that corresponds to a Microsoft Dynamics CRM deployment, it becomes inoperable. Similarly, if any of the OU security groups that are created by Microsoft Dynamics CRM are deleted (such as PrivUserGroup, ReportingGroup, PrivReportingGroup, SQLAccessGroup, or UserGroup), Microsoft Dynamics CRM will no longer function correctly. In either of these events, an authoritative restore of Active Directory restores the deleted OU, and security groups, to their original state.


2.5 Microsoft Dynamics CRM for Outlook failure recovery
Microsoft Dynamics CRM for Microsoft Office Outlook with Offline Access includes functionality that uses Microsoft SQL Server 2005 Express Edition. This enables Microsoft Dynamics CRM users to work offline with data synchronized to SQL Server when Microsoft Dynamics CRM for Outlook with Offline Access is brought online again.
In some cases, Microsoft Dynamics CRM users may want to back up the local SQL Server 2005 Express Edition database. This is especially useful when Microsoft Dynamics CRM users are offline for prolonged periods. The following table indicates different methods that can be used for backing up Microsoft Dynamics CRM for Outlook with Offline Access.


Backup Method ,What to Back Up for Microsoft Dynamics CRM

Offline backup Contents of Microsoft Dynamics CRM data directory.
Default location is:
SystemDrive:\Documents and Settings\UserName\Application Data\Microsoft\MSCRM\Data
On Windows Vista, the default location is:
SystemDrive:\Users\UserName\AppData\Roaming\Microsoft\MSCRM\Data Before you start the backup, make sure that the SQL Server (CRM) service is stopped. Restart the service after the backup is complete.
Online backup using Microsoft tools MSCRM_MSDE.mdf
MSCRM_MSDE_log.LDF
Use the Osql.exe tool that is provided with Microsoft Office Server Extensions.
Online backup using non-Microsoft tools MSCRM_MSDE.mdf
MSCRM_MSDE_log.LDF
Look for tools that are compatible with SQL Server 2005 Express Edition.

If there is a problem with Microsoft Dynamics CRM for Outlook with Offline Access before the user can reconnect to the server, the backup can be used to restore Microsoft Dynamics CRM functionality to the client. Outlook should be in offline mode before you restore the backup. When restored, you can then connect to the Microsoft Dynamics CRM Server (online mode). The data not already on the server will be transferred to the server from the client. Be careful when reconnecting to the server. If you restore from an outdated backup, the existing data on the server may have subsequently changed. However, neither SQL Server 2005 Express Edition nor SQL Server recognizes this fact. Therefore you run the risk of overwriting current data on the server by using older data from the offline client backup.

2009/10/26

Update Rollup 7 for Microsoft Dynamics CRM 4.0

General Details about Update Rollup 7
Update Rollup 7 is cumulative. You do not need to install any previous Update Rollups prior to Update Rollup 7
The Update Rollup 7 download contains updates for the 40 supported Language Packs. Prior to installing the Update Rollup 7 Language pack you must install the original
Language pack. If you have Language Packs installed, you should
Download the Update Rollup 7 Language Pack
Install the Update Rollup 7 Language Pack
De-provision the Language Pack
Re-provision the Language Pack
Update Rollup 7 adds support for Windows 7, Windows Server 2008 R2 and SQL Server 2008 R2
Information about how to avoid reboots when installing the CRM Outlook Client can be found in the
Update Rollup 4 blog posting. If the Client is being installed via AutoUpdate a reboot will be required because the AutoUpdate code is being updated in Update Rollup 7.
The Update Rollup 7 Client can be deployed before the server is upgraded to Update Rollup 7
The Update Rollup 7 Client cannot be uninstalled because of schema changes made to the offline database. All other Update Rollup 7 components (Server, Language Pack, SRS, Exchange Router, etc) can be uninstalled.
The Update Rollup 7 Client package will be a prerequisite for all future Client Update Rollups. Starting with Update Rollup 8 the client updates will block installation if the Update Rollup 7 Client is not found.
The Update Rollup 7 Client has new prerequisites
An internet connection is required for successful Client installation
Client update installation will take longer than previous URs, so please be patient
Steps to make the Update Rollup 7 Client available via AutoUpdate can be found in the
Update Rollup 4 blog posting. Once published the Link and Patch IDs can be found in kb article 971782.

2009/10/14

CRM 4.0 System Requirements and Required Components

Microsoft Dynamics CRM requires several software applications and components that work together to create an effective system. Before you install Microsoft Dynamics CRM, use this section for guidance to verify that system requirements are met and the necessary software components are available.
Unless specified otherwise, Microsoft Dynamics CRM supports the latest version and service pack (SP) for all required components, such as Windows Server, SQL Server, Internet Explorer, and Exchange Server.
For the most up-to-date information about system requirements and required components, see the
Microsoft Dynamics CRM 4.0 Server Readme.
For more information, see:
Microsoft Dynamics CRM Server hardware requirements
Microsoft Dynamics CRM Server software requirements
Microsoft Dynamics CRM Connector for SQL Server Reporting Services
Microsoft Dynamics CRM E-mail Router software requirements
Microsoft Dynamics CRM for Outlook hardware requirements
Microsoft Dynamics CRM for Outlook software requirements
Microsoft Dynamics CRM Web client software requirements
Microsoft Dynamics CRM Data Migration Manager hardware requirements
Data Migration Manager software requirements
64-bit supported configurations
Language support
Currency support

2009/10/08

Microsoft Dynamics CRM Bulk Update and Export tool

Orbit One is a software development agency located in Ghent, Belgium.They specialize in internet facing websites, intranet and extranet applications.They use technologies such as ASP.Net, SharePoint and Microsoft Dynamics CRM.http://www.orbitone.com/

Makes it easier for people to update and/or export data from Microsoft Dynamics CRM 4.0. You won't need to do everything manually. Let the computer do the work, you do the thinking. It's developed in C# on the microsoft CRM SDK.

Features:
You can save your connection. We are a hosting company and we have 6 different CRM instances on 3 different servers, so this is quite nice.
One of our clients has 15.000+ records in their contacts. Because CRM returns only 5.000 records for each request, I can’t update them all in one go. This was changed by making multiple requests if necessary.
Access all the records and all the fields. In the MSCRM 4.0 Bulk Data Export Tool you can only use the tool on Advanced find views. I allow you to use the tool on the main entity. Which is really helpfull in some cases.
Change lookup fields.
It allows you to choose the Authentication type. You can connect to CRM with Active Directory, SPLA, Passport
You can export the data you got from CRM to Excel. Then you can do all your updates in Excel (with vlookup and such).
You can import the date and send it back to CRM.
You can see the update progress on the fly
If an error where to occur you can see the error by hovering over the error field.
Create bulk deletion jobs
You can correct the error or do minor changes in the tool's datagrid itself. Only the changed records will be sent to CRM upon update
Choose the csv delimiters
Define your own color codes for errors, changes, uploaded







2009/09/23

CRM 4.0 Software prerequisites

Not running on 2008 platform
In addition to the software prerequisites below,
the Main Admin Account (which will be the Main Service account in CRM) to be used in the CRM 4.0 Install
must be a local administrator on the CRM Application Server, and possibly on the SQL Server as well.

Also the Main Admin Account must have full+extended privileges on the specified Organizational Unit (OU) in Active Directory (AD)...

For the CRM Server (IIS Server), the following must be installed:
1. Windows Server 2003 (Standard or Enterprise Edition, preferably Enterprise Edition on Production) with Service Pack 2
2. IIS 6 (with all options installed)
3. Also Windows Indexing Service

Please note that the following services must then be running on the CRM Server (IIS Server):
- Indexing Service
- World Wide Web Publishing
- IIS Admin Service

Then the actual CRM install will go and install the rest of the software listed below (from Microsoft_Dynamics_CRM_IG_Installing.doc, Section 2-8, Page 15):
(Please note that Microsoft .Net Framework 2 and Microsoft .Net Framework 3 can and be installed before this)
• SQL Server 2005 Reporting Services Report Viewer control
• Microsoft SQL Server Native Client
• Microsoft Application Error Reporting tool
• Microsoft Visual C++ Runtime Library
• MSXML 6
• Microsoft .NET Framework 3.0, which includes the following components:
o .NET Framework 2.0 (required by Microsoft Dynamics CRM Server)
o Windows® Workflow Foundation (required by Microsoft Dynamics CRM Server)
o Windows Presentation Foundation
o Windows Communication Foundation

And the SQL Server 2005 Server must have SQL Server 2005 (Standard or Enterprise Edition, preferably Enterprise Edition on Production)
with the following SQL Server components installed with Service Pack 2 applied on them:
1. SQL Server 2005 Database Engine with SP2
2. SQL Server 2005 Agent with SP2
3. SQL Server 2005 Reporting Services with SP2
4. SQL Server 2005 Full Text Search with SP2

I think that about covers it, but If I missed anything, perhaps the other guys can spot it…

2009/09/02

Some useful CRMform jscripts

<span style="font-family:arial;font-size:85%;">/*
function isFormInCreateMode()
function isFormInUpdateMode()
isFormActive = function()
hideNavBarItemById = function(navBarItemId)
setNavBarItemVisibilityByName = function(sectionName, itemName, visible)
hideNavBarItemByName = function(sectionName, itemName)
showNavBarItemByName = function(sectionName, itemName)
setFormEnabled = function(enabled)
hideTabById = function(tabId)
hideTabByName = function(tabName)
setControlEnabled = function(fieldObject, enabled)
setFieldRequired = function(fieldObject)
setFieldRecommended = function(fieldObject)
setFieldNotRequired = function(fieldObject)
refParam = function()
getLastKnownGood = function(fieldObject)
setLastKnownGood = function(fieldObject, value)
captureLastKnownGood = function(fieldObject)
restoreLastKnownGood = function(fieldObject)
hookValidationOnChange = function(fieldObject)
hookValidationOnBlur = function(fieldObject)
hookValidation = function(fieldObject, functionPointer, optionalFocusFieldObject)
performValidation = function()
function guidString4()
createGuid = function()
hideActionMenuItem = function(itemName)
HideAssociatedViewButtons = function(loadAreaId, buttonTitles)

*/

<strong>// Check if form in CREATE mode</strong>
isFormInCreateMode = function()
{
if (crmForm.FormType == 1)
return true;
else
return false;
}

<strong>// Check if form in UPDATE mode
</strong>isFormInUpdateMode = function()
{
if (crmForm.FormType == 2)
return true;
else
return false;
}

isFormActive = function()
{
var active = true;
if (crmForm.all.statecode != null &amp;&amp; crmForm.all.statecode.DataValue != null )
active = (crmForm.all.statecode.DataValue == 0);
if( active )
active = (crmForm.FormType <> 4); // not readonly or disabled
return active;
}

/************************************************************************************************************************/
<strong>/* Navigation Map Functions</strong>
/************************************************************************************************************************/

/* hide a navigation bar item */
hideNavBarItemById = function(navBarItemId)
{
var navBar = document.getElementById(navBarItemId)

if (navBar != null)
{
navBar.style.display = "none";
}
}

<strong>/* hide a tab using the tab name as reference */</strong>
setNavBarSectionVisibilityByName = function( sectionName, visible )
{
var groups = document.getElementById("crmNavBar").childNodes;

if( groups != null )
{
for( var i = 0; i < groups.length; i++ )
{
var groupName = groups[i].childNodes[0];

if( groupName.innerText.trim() == sectionName )
{
groupName.style.display = visible ? "block" : "none";
groups[i].childNodes[1].style.display = visible ? "block" : "none";
}
}
}
}

<strong>/* hide a tab using the tab name as reference */</strong>
setNavBarItemVisibilityByName = function( sectionName, itemName, visible )
{
var groups = document.getElementById("crmNavBar").childNodes;

if( groups != null )
{
for( var i = 0; i < groups.length; i++ )
{
var groupName = groups[i].childNodes[0];

if( groupName.innerText.trim() == sectionName )
{
var items = groups[i].childNodes[1].childNodes;
for( var n = 0; n < items.length; n++ )
{
var item = items[n];

if( item.innerText.trim() == itemName )
item.style.display = visible ? "inline" : "none";
}
}
}
}
}

<strong>/* hide a tab using the tab name as reference */</strong>
hideNavBarItemByName = function( sectionName, itemName )
{
setNavBarItemVisibilityByName(sectionName, itemName, false);
}

/* hide a tab using the tab name as reference */
showNavBarItemByName = function( sectionName, itemName )
{
setNavBarItemVisibilityByName(sectionName, itemName, true);
}

/************************************************************************************************************************/
<strong>/* Form Functions</strong>
/************************************************************************************************************************/

setFormEnabled = function(enabled)
{
var iLen = crmForm.all.length;

for (i = 0; i < iLen; i++)
{
crmForm.all[i].Disabled = !enabled;
}
}

<strong>// gets the ordinal position of a tab</strong>
getTabNumber = function( tabName ) {
var tabs = document.getElementById("crmTabBar").childNodes;
if( tabs != null ) {
for (var i = 0; i < tabs.length; i++) {
var tab = tabs[i];
if (tab.innerText == tabName) {
return i;
}
}
}
return -1;
}

<strong>// returns a tab by name</strong>
getTabByName = function( tabName ) {
var tabs = document.getElementById("crmTabBar").childNodes;
if (tabs != null) {
var num = getTabNumber(tabName);
if( num >= 0 ) {
return tabs[num];
}
}
return null;
}

<strong>/* disable or enable tab using the tab name as reference */</strong>
setTabEnabledByName = function(tabName, enabled)
{
var tab = getTabByName(tabName);
if( tab != null ) {
tab.disabled = !enabled;
}
}

<strong>/* hide a tab using the tab id as reference */</strong>
hideTabById = function(tabId)
{
var tab = document.getElementById(tabId);
if( tab != null ) {
tab.style.display = "none";
}
}

<strong>/* hide a tab using the tab name as reference */</strong>
hideTabByName = function(tabName)
{
var tab = getTabByName(tabName);
if( tab != null ) {
//alert(tab.style.display);
tab.style.display = "none";
}
}

<strong>/* show a tab using the tab name as reference */
</strong>showTabByName = function(tabName)
{
var tab = getTabByName(tabName);
if( tab != null ) {
tab.style.display = "block";
}
}

<strong>/* Enabled/disable a control by setting the disabled property and toggling "ms-crm-ReadOnly" on the classname */</strong>
setControlEnabled = function(fieldObject, enabled)
{
fieldObject.disabled = !enabled;

if (!enabled &amp;&amp; fieldObject.className.indexOf("ms-crm-Text") >= 0) {
// append readonly property to className if not already there
if (fieldObject.className.indexOf("ms-crm-ReadOnly") < 0)
fieldObject.className += " ms-crm-ReadOnly";
}
else
fieldObject.className = fieldObject.className.replace(/ ms-crm-ReadOnly/gi, "");
}

setFieldRequired = function(fieldObject)
{
crmForm.SetFieldReqLevel(fieldObject.id, 2);
}

setFieldRecommended = function(fieldObject)
{
crmForm.SetFieldReqLevel(fieldObject.id, 1);
}

setFieldNotRequired = function(fieldObject)
{
crmForm.SetFieldReqLevel(fieldObject.id, 0);
}

/************************************************************************************************************************/
<strong>/* Validation base functions</strong>
/************************************************************************************************************************/

/* represents a parameter object to be passed by reference
* use param.setValue from a function to set the return value of the parameter
* use param.getValue to read the returned value
*/
refParam = function()
{
this.array = new Array(1);
this.setValue = function(v) { this.array[0] = v; }
this.getValue = function() { return this.array[0]; }
}

/* gets/captures/restores the value of the field as the last known good value */
getLastKnownGood = function(fieldObject)
{
return fieldObject.getAttribute("lastKnownGood");
}
setLastKnownGood = function(fieldObject, value)
{
fieldObject.setAttribute("lastKnownGood", value);
}
captureLastKnownGood = function(fieldObject)
{
setLastKnownGood(fieldObject, fieldObject.DataValue);
}
restoreLastKnownGood = function(fieldObject)
{
fieldObject.DataValue = getLastKnownGood(fieldObject);
}

/*
* captures last known good value (captureLastKnownGood)
* hooks validation of the field onto the "onchange" event
*/
hookValidationOnChange = function(fieldObject)
{
fieldObject.setAttribute("onblur", null);
fieldObject.setAttribute("onchange", performValidation);
}
hookValidationOnBlur = function(fieldObject)
{
fieldObject.setAttribute("onchange", null);
fieldObject.setAttribute("onblur", performValidation);
}
hookValidation = function(fieldObject, functionPointer, optionalFocusFieldObject)
{
captureLastKnownGood(fieldObject);
fieldObject.setAttribute("validationFunction", functionPointer);
if( optionalFocusFieldObject != null )
fieldObject.setAttribute("focusFieldObject", optionalFocusFieldObject);
fieldObject.setAttribute("onchange", performValidation);
}
performValidation = function()
{
var fieldObject = event.srcElement;
if( fieldObject.DataValue != getLastKnownGood(fieldObject) )
{
var functionPointer = fieldObject.getAttribute("validationFunction");

var message = new refParam();
var valid = functionPointer(fieldObject, message);

if( !valid )
{
var msg = message.getValue() + "rnnWould you like to correct the value?";
if( confirm(msg) )
{
var focusObject = fieldObject.getAttribute("focusFieldObject");
if( focusObject == null )
focusObject = fieldObject;
else
{
captureLastKnownGood(fieldObject);
hookValidationOnChange(fieldObject);
setLastKnownGood(focusObject, null);
}

focusObject.SetFocus();
event.returnValue = false;
hookValidationOnBlur(focusObject);
}
else
{
restoreLastKnownGood(fieldObject);
hookValidationOnChange(fieldObject);
}
}
else
{
captureLastKnownGood(fieldObject);
hookValidationOnChange(fieldObject);
}
}
else
hookValidationOnChange(fieldObject);
}

guidString4 = function()
{
return (((1 + Math.random()) * 0x10000) 0).toString(16).substring(1);
}

createGuid = function()
{
return (guidString4() + guidString4() + "-" + guidString4() + "-" + guidString4() + "-" + guidString4() + "-" + guidString4() + guidString4() + guidString4()).toUpperCase();
}

<strong>/* hide action menu item */</strong>
hideActionMenuItem = function(itemName)
{
var element = document.getElementById(itemName)

if (element != null) {
element.style.display = "none";
}
}

hideActionMenuDeleteButton = function()
{
hideActionMenuItem("_MIonActionMenuClickdelete" + crmForm.ObjectTypeCode);
}

hideActionMenuDeactivateButton = function()
{
hideActionMenuItem("_MIchangeStatedeactivate" + crmForm.ObjectTypeCode + "5");
}

hideActionMenuActivateButton = function()
{
hideActionMenuItem("_MIchangeStateactivate" + crmForm.ObjectTypeCode + "6");
}

/* Hides the associated Views buttons. i.e Hides the add existing button. */
/* NB: If called multiple times, the settings of the previous calls are overwritten by the final one! */
/* A menu element on the "More actions" drop-down menu can be hidden
* by adding a string such as 'More Actions::Activate' to the buttonTitles array.
*/
HideAssociatedViewButtons = function(loadAreaId, buttonTitles)
{
var navElement = document.getElementById('nav_' + loadAreaId);
if (navElement != null)
{
navElement.onclick = function LoadAreaOverride()
{
// Call the original CRM method to launch the navigation link and create area iFrame
loadArea(loadAreaId);
HideViewButtons(document.getElementById(loadAreaId + 'Frame'), buttonTitles);
}
}
}

<strong>/* Used internally by the 'HideAssociatedViewButtons' method */</strong>
HideViewButtons = function(Iframe, buttonTitles)
{
if (Iframe != null)
{
Iframe.onreadystatechange = function HideTitledButtons()
{
if (Iframe.readyState == 'complete')
{
var iFrame = frames[window.event.srcElement.id];
var liElements = iFrame.document.getElementsByTagName('li');
for (var j = 0; j < buttonTitles.length; j++)
{
buttonTitleParts = buttonTitles[j].split('::');
if (buttonTitleParts.length > 0)
{
buttonTitle = buttonTitleParts[0];
for (var i = 0; i < liElements.length; i++)
{
liElement = liElements[i];
if (liElement.getAttribute('title') == buttonTitle)
{
if (buttonTitleParts.length == 1)
{
liElement.style.display = 'none';
break;
}
else
{
/* We want to hide a menu item in a drop-down menu.
Find the descendant text element with the specified text.
Then find its parent list item and hide it:
*/
menuText = buttonTitleParts[1];
var spanElements = liElement.getElementsByTagName('span');

for (var k = 0; k < spanElements.length; k++)
{
spanElement = spanElements[k];
if (spanElement.className == 'ms-crm-MenuItem-Text' )
{
textElement = spanElement.firstChild;
if (textElement != null &amp;&amp; textElement.nodeType == 3) /* 3 = Node.TEXT_NODE */
{
if (textElement.data == menuText)
{
liMenuItemElement
= spanElement.parentNode.parentNode.parentNode;
liMenuItemElement.style.display = 'none';
break;
}
}
}
}
}
}
}
}
}
}
}
}
}

<strong>// Load up a CRM entity into an iframe - typically the main view screen</strong>
getCRMFormSource = function(tabSet)
{
if (crmForm.ObjectId != null)
{
var oId = crmForm.ObjectId;
var oType = crmForm.ObjectTypeCode;
var security = crmFormSubmit.crmFormSubmitSecurity.value;

return "/userdefined/areas.aspx?oId=" + oId + "&amp;oType=" + oType + "&amp;security=" + security + "&amp;tabSet=" + tabSet;
}
else
{
return "about:blank";
}
}

setVisibilityOfSectionContainingField = function(crmField, visibility)
{
if (visibility)
{
crmField.parentElement.parentElement.parentElement.style.display = 'block';
}
else
{
crmField.parentElement.parentElement.parentElement.style.display = 'none';
}
}

hideSectionContainingField = function(crmField)
{
setVisibilityOfSectionContainingField(crmField, false);
}

setVisibilityOfSectionWithName = function(tabNumber, sectionName, visibility)
{
var tab = document.getElementById('tab' + tabNumber.toString());
if (tab != null)
{
var tdElements = tab.getElementsByTagName('td');
for (var i = 0; i < tdElements.length; i++)
{
tdElement = tdElements[i];
if (tdElement.className == 'ms-crm-Form-Section ms-crm-Form-SectionBar')
{
textElement = tdElement.firstChild;
if (textElement != null &amp;&amp; textElement.nodeType == 3) /* 3 = Node.TEXT_NODE */
{
if (textElement.data == sectionName)
{
trSectionElement
= tdElement.parentNode.parentNode.parentNode.parentNode.parentNode;

if (visibility)
{
trSectionElement.style.display = 'block';
}
else
{
trSectionElement.style.display = 'none';
}
return true;
}
}
}
}
}
return false;
}

hideSectionWithName = function(tabNumber, sectionName)
{
return setVisibilityOfSectionWithName(tabNumber, sectionName, false);
}

hideSection = function(tabName, sectionName) {
var tabNumber = getTabNumber(tabName);
return setVisibilityOfSectionWithName(tabNumber, sectionName, false);
}

showSection = function(tabName, sectionName) {
var tabNumber = getTabNumber(tabName);
return setVisibilityOfSectionWithName(tabNumber, sectionName, true);
}

showModalWindow = function(url, objectparams, x, y, height, width)
{
return window.showModalDialog(url, objectparams,
(height != null ? "dialogHeight:" + height.toString() + "px;" : "") +
(width != null ? "dialogWidth:" + width.toString() + "px;" : "") +
(y != null ? "dialogTop:" + y.toString() + "px;" : "") +
(x != null ? "dialogLeft:" + x.toString() + "px;" : "") +
"center:Yes;" +
"help:No;" +
"resizable:No;" +
"scroll:No;" +
"status:No;");
}


FetchViewer = function( iframeId )
{
var Instance = this;
var vDynamicForm;
var m_iframeTab;
var m_iframeDoc;

Instance.Entity = "";
Instance.Iframe = null;
Instance.FetchXml = "";
Instance.QueryId = "";
Instance.LayoutXml = "";

Instance.RegisterOnTab = function( tabIndex )
{
Instance.Iframe = document.getElementById( iframeId );

if( !Instance.Iframe )
return alert( "Iframe " + iframeId + " is undefined" );

m_iframeDoc = getIframeDocument();
var loadingGifHTML = "<table height="'100%'" width="'100%'" style="'cursor:wait'">";
loadingGifHTML += "<tr>";
loadingGifHTML += "<td valign="'middle'" align="'center'">";
loadingGifHTML += "<img alt="''" src="'/_imgs/AdvFind/progress.gif'/" />";
loadingGifHTML += "<div/><b>Loading View...</b>";
loadingGifHTML += "</td></tr></table>";
m_iframeDoc.body.innerHTML = loadingGifHTML;

if( parseInt( "0" + tabIndex ) == 0 ) Instance.Refresh();
else Instance.Iframe.attachEvent( "onreadystatechange" , RefreshOnReadyStateChange );
}

function RefreshOnReadyStateChange()
{
if( Instance.Iframe.readyState != 'complete' )
return;

Instance.Refresh();
}

Instance.Refresh = function()
{
if( !Instance.Iframe )
return alert( "Iframe " + iframeId + " is undefined" );

m_iframeDoc = getIframeDocument();

Instance.Iframe.detachEvent( "onreadystatechange" , RefreshOnReadyStateChange );

var create = m_iframeDoc.createElement;
var append1 = m_iframeDoc.appendChild;
vDynamicForm = create("<form name="'vDynamicForm'" method="'post'">");

var append2 = vDynamicForm.appendChild;
append2(create("<input type="'hidden'" name="'FetchXml'">"));
append2(create("<input type="'hidden'" name="'LayoutXml'">"));
append2(create("<input type="'hidden'" name="'EntityName'">"));
append2(create("<input type="'hidden'" name="'DefaultAdvFindViewId'">"));
append2(create("<input type="'hidden'" name="'ViewType'">"));
append1( vDynamicForm );

vDynamicForm.action = prependOrgName("/AdvancedFind/fetchData.aspx");
vDynamicForm.FetchXml.value = Instance.FetchXml;
vDynamicForm.LayoutXml.value = Instance.LayoutXml;
vDynamicForm.EntityName.value = Instance.Entity;
vDynamicForm.DefaultAdvFindViewId.value = Instance.QueryId;
vDynamicForm.ViewType.value = 1039;
vDynamicForm.submit();

Instance.Iframe.attachEvent( "onreadystatechange" , OnViewReady );
}

function OnViewReady()
{
if( Instance.Iframe.readyState != 'complete' ) return;

Instance.Iframe.style.border = 0;
Instance.Iframe.detachEvent( "onreadystatechange" , OnViewReady );
m_iframeDoc = getIframeDocument();
m_iframeDoc.body.scroll = "no";
m_iframeDoc.body.style.padding = "0px";
}

getIframeDocument = function()
{
return Instance.Iframe.contentWindow.document;
}
}

<strong>// Set custom form title</strong>
setFormTitle = function(title)
{
document.all.crmMenuBar.nextSibling.rows[0].cells[1].childNodes[0].innerText = title;
}


setLookupEnabled = function(control, enabled)
{
control.Disabled = !enabled;
}



<strong>/****************** BUTTONS *************************/</strong>
// Get an element in a document by it's class name
// Parameters:
// oElm = starting element
// strTagName = tags to filter on, e.g. TR or * for all
// oClassNames = arraylist of class names to find
// Returns:
// array of elements found
function getElementsByClassName(oElm, strTagName, oClassNames){
var arrElements = (strTagName == "*" &amp;&amp; oElm.all)? oElm.all : oElm.getElementsByTagName(strTagName);
var arrReturnElements = new Array();
var arrRegExpClassNames = new Array();
if(typeof oClassNames == "object"){
for(var i=0; i<oClassNames.length; i++){
arrRegExpClassNames.push(new RegExp("(^s)" + oClassNames[i].replace(/-/g, "-") + "(s$)"));
}
}
else{
arrRegExpClassNames.push(new RegExp("(^s)" + oClassNames.replace(/-/g, "-") + "(s$)"));
}
var oElement;
var bMatchesAll;
for(var j=0; j<arrElements.length; j++){
oElement = arrElements[j];
bMatchesAll = true;
for(var k=0; k<arrRegExpClassNames.length; k++){
if(!arrRegExpClassNames[k].test(oElement.className)){
bMatchesAll = false;
break;
}
}
if(bMatchesAll){
arrReturnElements.push(oElement);
}
}
return (arrReturnElements)
}

<strong>// hide the entire grid menu bar of normal CRM grid view</strong>
hideGridViewMenuBar = function(document)
{
if (document != null)
{
var menuBar = document.getElementById('gridMenuBar');

if (menuBar != null)
{
menuBar.style.display = "none";
}
}
}

<strong>// hide the entire grid view bar of normal CRM grid view</strong>
hideGridViewGridBar = function(document)
{
if (document != null)
{
var gridBar = document.getElementById('gridBar');

if (gridBar != null)
{
gridBar.style.display = "none";
}
}
}

<strong>// Hide all the menu items/buttons on a menu bar of normal CRM grid view.
// The menu bar will still be visible when done</strong>
hideAllGridViewMenuBarButtons = function(document)
{
if (document != null)
{
var menuBar = getElementsByClassName(document, "ul", "ms-crm-MenuBar-Left");

if (menuBar != null &amp;&amp; menuBar.length > 0)
{
menuBar[0].style.display = "none";
}
}
}

<strong>// hide the status bar of normal CRM grid view.</strong>
hideGridViewStatusBar = function(document)
{
if (document != null)
{
var menuBar = getElementsByClassName(document, "tr", "ms-crm-List-StatusBar");

if (menuBar != null &amp;&amp; menuBar.length > 0)
{
menuBar[0].style.display = "none";
}
}
}

<strong>// add a button to the grid menu bar</strong>
addGridViewMenuButton = function(document, text, toolTipText, image, javaScriptString)
{
var buttonScript = "<li class="ms-crm-Menu" tabindex="-1" title="'" action="" onclick="'window.execScript(action)'">";
buttonScript += " <span class="ms-crm-Menu-Label">";
buttonScript += " <a class="ms-crm-Menu-Label" tabindex="-1" onclick="'return" href="'javascript:onclick();'" target="_self">";

if (image != null)
{
buttonScript += " <img class="ms-crm-Menu-ButtonFirst" tabindex="-1" alt="'" src="'/_imgs/vieweditor/" />";
}

buttonScript += " <span class="ms-crm-MenuItem-TextRTL" tabindex="0">" + text + "</span>";
buttonScript += " </a>";
buttonScript += " </span>";

2009/08/31

Hiding Navigational Items based on drop down value

We had a request were based on a drop down value the navigational structure must show certain options based on the drop down value on the record.
Shawn Redmond

hideNavBarItemByName("Details:", "Divisions");

If (crmForm.all.fieldname != 3)
{
hideNavBarByItemName(‘Details’, ‘Value1');
hideNavBarByItemName(‘Details’, ‘Value2');

}

hideNavBarItemByName = function( sectionName, itemName )
{
setNavBarItemVisibilityByName(sectionName, itemName, false);
}

setNavBarItemVisibilityByName = function( sectionName, itemName, visible )
{
var groups = document.getElementById("crmNavBar").childNodes;

if( groups != null )
{
for( var i = 0; i < groupname =" groups[i].childNodes[0];" items =" groups[i].childNodes[1].childNodes;" n =" 0;" item =" items[n];" display =" visible">

2009/08/29

Update Rollup 6 for Microsoft Dynamics CRM 4.0


The Microsoft Dynamics CRM Sustained Engineering team released
Microsoft Dynamics CRM 4.0 Update Rollup 6 on Thursday, August 27, 2009.
Below are the links to the release and related information about the Rollup. Please see the Knowledge Base (KB) article for more details about the Update Rollup 6 content and instructions.
Microsoft Download Center:
http://www.microsoft.com/downloads/details.aspx?displaylang=en&FamilyID=79f90982-c039-41c2-af8e-3119ecf27790
Microsoft Knowledge Base Article:
http://support.microsoft.com/?kbid=970148
Install Details about Update Rollup 6
Update Rollup 6 is cumulative. You do not need to install any previous Update Rollups prior to Update Rollup 6
The Update Rollup 6 client can be deployed before the server is upgraded to Update Rollup 6
Update Rollup 6 can be uninstalled
Steps to make Update Rollup 6 available via AutoUpdate can be found in the
Update Rollup 4 blog posting. The Link and Patch IDs can be found in the kb article at http://support.microsoft.com/?kbid=970148.
Information about how to avoid reboots when installing the CRM Outlook Client can also be found in the
Update Rollup 4 blog posting.
Update Rollup 6 and all future Update Rollups will contain Mobile Express
The CRM team released the English version of Mobile Express on July 8, 2009 as an update to the CRM Server. Since Mobile Express is now part of the Server product it will be installed and updated as part of all Update Rollups going forward. There is a
Getting Started: CRM Mobile Express blog that has some pointers on how to get started. The localized versions of Mobile Express will be delivered in a future update rollup.

2009/08/21

CRM integration into Skydrive

Hi

Last week I was asked to assist a user in Russia to integrate Skrydrive into CRM.
Skydrive is a online document mangement system provided by Microsoft using your windows live id.

This is fairly simple to do:
Download the CRM demonstration Toolkit and run it on the CRM server.
Connect to your CRM installation.
Open the SiteMap editor
Select the "Open from CRM" option.

You will notice that your sitemap is loaded in a easy to use UI editor.Having grouped your areas and subareas respectively.

Add a Area called Documents
Add Under (Documents)
On Documents select "Add Under" this will give a window with a drop down to CRM entities and a URL.
Use the URL Option. (You should have created a online skydrive account.Login into skydrive and copy the url for your document library.)
Paste the Url in the URL field
Description"Documents"
Icon URL (Your choice of icon)
Select "Publish to CRM"
Open CRM /Refresh CRM


You should have a Area called "Documents " in the navigational tree.
When opening, this will open your document library on skydrive.

Easy as falling out of a tree,just remember to let go of the branch.....:)

2009/08/20

Microsoft CRM Information Documentation

Microsoft CRM Information PDF's
Top 10 Compelling Reasons to Use CRM
Download
Customer Case Studies
Download
What’s New in MS CRM 4.0
Download
Sales Force Automation Overview
Download
Marketing Automation Overview
Download
Customer Service Overview
Download
MS CRM 4.0 What’s New Top 60 Datasheet
Download

Microsoft CRM Additional Information

Implementing MS CRM 4.0
Download
Microsoft Dynamics CRM 4.0 Users Guide
Download
Optimizing & Maintaining CRM 4.0 whitepaper Download

Preparing for your CRM Certication made easy with -Richard Knudson’s Dynamics CRM Trick Bag

Demo practice test for Dynamics CRM Applications exam MB 632 (20 questions)
Demo practice test for Dynamics CRM Installation exam MB 633 (15 questions)
Demo practice test for Dynamics CRM Customization exam MB 631 (20 questions)

2009/08/18

Microsoft CRM 4.0 Update Rollup Best Practices

Found a great right-up on Rollup's

Updates: Microsoft CRM 4.0 Update Rollup Best Practices

Frank Lee
http://microsoft-crm.spaces.live.com/?_c11_BlogPart_BlogPart=blogview&_c=BlogPart&partqs=cat%3dMicrosoft%2520CRM%2520Update


You may have noticed that the Microsoft CRM Update Rollups are being released on a regular basis like every 2 months since Update Rollup 2. This is much more frequent then the previous update release schedule (6 to 9 months). So how do Small Medium Businesses (SMB) manage this given the more frequent updates?
Here are three approaches and my notes on each one:
1. Only apply Update Rollup as needed to solve bugs/issues
- requires the least amount of administration resource, but could result in the highest reactive situation when encountering CRM issues/bugs that are solved by an Update Rollup
2. Apply every Update Rollup upon being released
- requires the most amount of administration effort to update the CRM Server and all of the CRM Outlook Clients upon each release of an Update Rollup. However, this offers the highest avoidance of CRM issues/bugs that are solved by Update Rollups
3. Apply Update Rollup on every 4, 5, or 6 months cycle
- a good balance of administration resource and risk avoidance due to CRM issues/bugs that are solved by an Update Rollup. As for 4, 5, or 6 - it would be your preference.
Guess which approach I'd recommend for most SMBs? Yup, number 3. I'd personally select the every 4 months cycle.
Some good practices on deploying Update Rollups:
1. Always backup your CRM environment per the Update Rollup instructions prior to applying the Update Rollup. If you have a test environment (I highly recommended having one), apply the Update Rollup there first.
2. Wait two weeks after the release of an Update Rollup before applying it - just like any software, Update Rollup may contain some bugs itself. There were some Update Rollups in the past that were "re-released" due to issues/bugs arised from the Update Rollup. If this does happen, contact Microsoft CRM Support immediately for resolution. And if you had waited after two weeks, you would mostly enjoy the benefit that a work-around/resolution is available due to Support already encountered the issue already. No need to be the very first to apply an Update Rollup in production unless it fixes a specific issue/bug
3. It is not necessary to apply both the CRM Server Update and CRM Outlook Client Update at the same time. I do highly recommend they are both applied the same time to get the latest fixes to all your CRM enviornments (Server and Outlook Clients). However, it is OK to apply the CRM Server Update first, and then apply the CRM Outlook Client Update the next few days/weeks. Or the other way around - apply the CRM Outlook Client Update first and then apply the CRM Server Update afterwards
4. Most SMB doesn't have a large CRM Users count, but if yours do, then I would look into auto deployment of the CRM Outlook Client Update to save time. Reference the Microsoft CRM 4.0 Implementation Guide - Microsoft_Dynamics_CRM_IG_Operating.doc, section "Automatically update Microsoft Dynamics CRM for Outlook" for details
5. If you had encountered a bug/issue and have not apply the latest Update Rollup yet. What should you do? I would open a CRM Support Incident via CustomerSource - if the bug is a bug and "not a feature" then there is no cost to the Support Incident and you would get a resolution from the CRM Support engineer to either apply the latest Update Rollup, a Hot Fix, or other work-around.



Configuring Microsoft Dynamics CRM 4.0 for Internet-facing deployment

Configuring Microsoft Dynamics CRM 4.0 for Internet-facing deployment
Published: February 13, 2009 Updated: May 15, 2009


This document describes configuring Microsoft Dynamics CRM (On-Premise Edition) for Internet-facing deployment (IFD), and a few of the common issues and resolutions associated with Microsoft Dynamics CRM IFD.
You can deploy Microsoft Dynamics CRM (On-Premise Edition) using one of the following deployment types:
· Microsoft Dynamics CRM for internal users only
· Microsoft Dynamics CRM for internal users and IFD access
· Microsoft Dynamics CRM for IFD-only access
For more information about configuring Microsoft Dynamics CRM for Internet access only, see Internal Network Address under the "IFD configuration properties details" section in this article.
Microsoft Dynamics CRM uses Integrated Windows authentication to authenticate internal users. Integrated Windows authentication implements pass-through authentication functionality so that Microsoft Dynamics CRM users are not prompted a second time to log in to Microsoft Dynamics CRM after their initial sign on to the Active Directory network.
Configuring IFD for Microsoft Dynamics CRM enables access to Microsoft Dynamics CRM from the Internet, outside of the company firewall, without using a VPN solution. Microsoft Dynamics CRM configured for Internet access uses forms authentication to verify credentials of external users. When configuring Microsoft Dynamics CRM for Internet access, Integrated Windows Authentication must remain for internal users.
Configuring IFD sets the Microsoft Dynamics CRM Web site to use anonymous authentication for external users, and provides a sign on page to capture users' credentials and obtain an authentication ticket cookie. Microsoft Dynamics CRM IFD checks for a valid CRM ticket cookie before processing the page request. When a page request does not contain a valid CRM ticket, the page request is redirected to the sign-on page. A page request with an expired CRM ticket is also redirected to the sign-on page. Users access the Microsoft Dynamics CRM Web site by typing the IFD URL in Internet Explorer. Because this type of authentication sends user credentials and passwords using clear text, you should always configure Microsoft Dynamics CRM using a Secure Sockets Layer (SSL). For more information about SSL, see
Make Microsoft Dynamics CRM 4.0 client-to-server network communications more secure. For more information about forms authentication and IFD, see Web Form (IFD) Authentication. For more information about forms authentication with active directory, see Forms Authentication in ASP.NET.
On This Page

Common Issues
Methods available to configure IFD
You can deploy Microsoft Dynamics CRM for IFD by using one of the following methods:
· During Microsoft Dynamics CRM Server installation or upgrade.
o Install a new deployment of Microsoft Dynamics CRM (On-Premise Edition) using command-line options and an XML configuration file that contains IFD configuration information (specified in the following topic).
o Upgrade from Microsoft Dynamics CRM 3.0 to Microsoft Dynamics CRM (On-Premise Edition) using command-line options and an XML configuration file that contains IFD configuration information (described in the following topic).
· Configure an existing deployment using the Microsoft Dynamics CRM Internet Facing Deployment Configuration tool. Configure an existing deployment of Microsoft Dynamics CRM that did not use an XML configuration file that contained IFD configuration information (described in the following topic). To configure the existing deployment, download and run the
Microsoft Dynamics CRM Internet Facing Deployment Configuration Tool (described in the topic below).

Configure during Microsoft Dynamics CRM Server installation or upgrade

When using the command-line option to deploy a new installation of Microsoft Dynamics CRM or upgrade from Microsoft Dynamics CRM 3.0, you can enable IFD by adding the element to a Microsoft Dynamics CRM Server Setup XML configuration file. The element must be defined under the elements. When the enabled element is set to true (), Microsoft Dynamics CRM Server Setup configures the deployment for access from the Internet. Additional information is required to make the Web site accessible from the Internet. For more information see, "Use the Command Line to Install Microsoft Dynamics CRM" in the Installing Guide in the Microsoft Dynamics CRM 4.0 Implementation Guide. The Microsoft Dynamics CRM Server Setup XML configuration file makes the same changes as the Microsoft Dynamics CRM Internet Facing Deployment Configuration tool, see the table below for the list of properties that are added or updated. The configuration file should look similar to the following example:


157.55.160.202-255.255.255.255
https
mysubDomain.myDomain.com:443
mysubDomain.myDomain.com:443


For more information about the IFD deployment properties in the element see, the IFD Configuration Properties on this post by clicking on the post link.

Configure an existing deployment using Microsoft Dynamics CRM Internet Facing Deployment Configuration tool
The Microsoft Dynamics CRM Internet Facing Deployment Configuration tool adds a node to the web.config file for IFD settings, creates deployment properties in the MSCRM_config database, and adds a registry key to Microsoft Dynamics CRM Server enabling Internet-facing access. You can use the Internet Facing Deployment Configuration tool after installing or upgrading to Microsoft Dynamics CRM. You can also use this tool any time you want to change the IFD configuration properties.
Read the
Microsoft Dynamics CRM 4.0 Internet Facing Deployment Scenarios document for specific configuration scenarios and instructions to help you successfully implement Microsoft Dynamics CRM IFD.
You can also get detailed instructions for using the Microsoft Dynamics CRM Internet Facing Deployment Configuration tool in
How to use the Microsoft Dynamics CRM Internet Facing Deployment Configuration tool.
Note
To update other configuration fields, download and run the Microsoft Dynamics CRM Internet Facing Deployment Configuration tool from
Microsoft Dynamics CRM 4.0: Planning and Deployment Guidance for Service Providers.

IFD configuration properties details

Internal Network Address

When you configure Microsoft Dynamics CRM for IFD using the Internet Facing Deployment Configuration tool or using an XML configuration file, on initial Microsoft Dynamics CRM installations only, you are adding a new Windows registry key. The IfdInternalNetworkAddress registry key contains the IP addresses and subnet masks for internal computers using Microsoft Dynamics CRM. The registry key location is

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSCRM

When a user submits a page request, the Microsoft Dynamics CRM Server compares the user's IP address and subnet mask with the values in the registry key to determine which authentication type to use, anonymous access authentication for Internet access or Integrated Windows authentication for internal users. For example, the IP addresses and subnet masks of your Microsoft Dynamics CRM users are as follows:

10.10.1.1-255.255.255.0,157.55.164.93-255.255.255.0

When the subnet is 255.255.255.0 and the IP address are 10.10.1.1 or 157.55.164.93 then any IP address that starts with 10.10.1 or 157.55.164 is considered internal.
When a user requests a Microsoft Dynamics CRM page and the user's IP address and subnet masks is 157.55.165.22-255.255.254.0 and the IP address and subnet mask is not found, Microsoft Dynamics CRM uses forms authentication to display a sign on page. Any IP addresses and subnet masks not in the Internal Network Address registry key cause the Microsoft Dynamics CRM Server to respond with the IFD sign on page to request the user's credentials.
If users are accessing Microsoft Dynamics CRM from multiple subnets, you must update the IfdInternalNetworkAddress registry value to reflect the different subnets. When you have more than 1 subnet, you can add multiple values to the IfdInternalNetworkAddress registry key. Separate the values using a comma but do not add a space after the comma.
To configure Microsoft Dynamics CRM for IFD only access, enter the IP address to the Microsoft Dynamics CRM Server and a subnet mask of 255.255.255.255. Then only those page requests from the Microsoft Dynamics CRM Server are considered internal, and all other page requests prompt the sign on page.

IFD Root Domain Scheme

In the Root Domain Scheme or IFD Root Domain when using the Internet Facing Deployment Configuration tool, enter https as the value of this MSCRM_config database property when you have SSL set for the Web site.
Important
SSL is strongly recommended fo Internet-facing deployment of Microsoft Dynamics CRM.

SDK Root Domain

In the SDK Root Domain or the IFD SDK Domain when using the Internet Facing Deployment Configuration tool , enter the domain name where the SDK Server role is installed. This is used for applications that use the methods from the Microsoft Dynamics CRM Software Development Kit(SDK) as the value for this MSCRM_config database property. Add the domain name and the root domain (.com), for example mycompany.com rather than mycompany. If using a port that is not the default, then you need to include the port number in the SDK Root Domain, for example, domain.com:5555.

Web Application Root Domain

In the Web Application Root Domain or the IfdWebApplicationRootDomain when using the Internet Facing Deployment Configuration tool , enter the domain name only for the Microsoft Dynamics CRM Web application as the value for this MSCRM_config database property. Add the domain name and the root domain (.com), for example mycompany.com rather than mycompany. If using a port that is not the default, then you need to include the port number in the Web Application Root Domain, for example, domain.com:5555.
Important
When using server roles divided out to different computers, you must use different domain name values for IfdWebApplicationRootDomain and IfdSdkRootDomain. For more information, see the topic below Using Server Roles.
Service Provide License Agreement
ServiceProviderLicenseAgreement replaces OnPremise as the authentication strategy in the node of the Web.config file.

IFD URL
You must define a URL for the Microsoft Dynamics CRM IFD deployment using the following format:
https://.
For information about changing Microsoft Dynamics CRM port assignment, see
How to update the Microsoft Dynamics CRM Web site port after you install Microsoft Dynamics CRM 4.0.

Common Issues
Use DNS host or alias record with IFD
Create a host or alias record for each organization that plans to access Microsoft Dynamics CRM externally from the Internet. If you use host headers to uniquely identify the Microsoft Dynamics CRM Web site, you should remove the host headers and set up a Domain Name Service (DNS) alias record. This is particularly important because SSL does not work with host headers. The DNS alias record ensures that the URL address for the external and internal organization resolves correctly. The alias record is a name for your Web application that is composed of a subdomain name to identify the organization, second-level domain name to identify your company, and root domain name such as .gov, .tv. or .com. For Microsoft Dynamics CRM IFD, your DNS alias record should resemble the following:
crm_organization_name.domain.com
The Internet Facing Deployment Configuration tool includes a Check DNS option on the Tools menu to test DNS resolution. If you have not defined domain names in DNS, the Internet Facing Deployment Configuration tool displays a message indicating that the domain name cannot be resolved. For specific instructions, see Setup test DNS record in
How to configure an Internet-Facing Deployment for Microsoft Dynamics CRM 4.0.

Firewall exceptions

If one or more firewalls are running between the clients and the Microsoft Dynamics CRM Server, an exception for the port used by the Microsoft Dynamics CRM Web site must be established to allow clients to connect.

Running reports

To enable complete reporting functionality for a Microsoft Dynamics CRM deployment configured for IFD, the deployment must be running the Microsoft Dynamics CRM Connector for SQL Server Reporting Services.
When a Microsoft Dynamics CRM user runs a report from Microsoft Dynamics CRM, Microsoft SQL Server Reporting Services Viewer requests the report and data from the remote Microsoft SQL Server Reporting Services computer. To access the report, the Microsoft Dynamics CRM user enters the Microsoft Dynamics CRM server URL. Microsoft Dynamics CRM Connector for SQL Server Reporting Services runs as a Microsoft SQL Server Reporting Services data processing extension and handles the authentication in the delegated mode used for reports.
However, the Microsoft Dynamics CRM Connector for SQL Server Reporting Services does not work with the Microsoft SQL Server 2005 Workgroup Edition because it does not support custom data extensions used in the Microsoft Dynamics CRM Connector for SQL Server Reporting Services. To resolve this issue, upgrade Microsoft SQL Server 2005 Workgroup Edition to one of the following editions:
· SQL Server 2005 Standard Edition
· SQL Server 2005 Enterprise Edition
· SQL Server 2008 Enterprise Edition
· SQL Server 2008 Standard Edition
For specific SQL Server 2008 upgrade version information, see
SQL Server 2008 Books Online Version and Edition Upgrades.

Using Dynamic worksheets or Dynamic PivotTables

To export data to Dynamic worksheets or Dynamic PivotTables for Microsoft Dynamics CRM users connecting to a Microsoft Dynamics CRM IFD deployment, install and configure the Microsoft Dynamics CRM for Microsoft Office Outlook client on the computer of the Microsoft Dynamics CRM user trying to open the Dynamic worksheet. When Microsoft Dynamics CRM is not in the same domain as the client computer, Microsoft Dynamics CRM for Microsoft Office Outlook client handles the Microsoft Dynamics CRM user login credentials for the Microsoft Dynamics CRM database used in the worksheet.
For information about securing data exported to Microsoft Office Excel, see Microsoft Dynamics CRM Team blog article
Dynamic Export to Excel feature – How to protect data over the wire.

Using server roles

In a Microsoft Dynamics CRM deployment you can split the configuration into two separate server role groups or separate each individual server role across multiple computers. If you configure IFD for a Microsoft Dynamics CRM deployment using server role groups or separate server roles, you must obtain different SSL certificates if the Application server role and the SDK server role are on different computers. You cannot use the same certificate for both server roles. If you did not obtain different SSL certificates defined with root domain names specific to the Application server role and SDK server role, then the DNS server detects duplicate mappings and cannot resolve the domain names. To resolve this duplicate mapping issue, assign different values in the deployment properties for the IFD App Root Domain and IFD SDK Root Domain. The value that you enter in the Internet Facing Deployment Configuration tool for the App Root Domain is the domain associated with the Application server role. The value that you enter in the Internet Facing Deployment Configuration tool for the SDK Root Domain is the domain associated with the SDK server role.
For more information about server roles, see
Making Sense of Server Roles.

Configure IFD with an ISA server

After you configure Microsoft Dynamics CRM for IFD and you are using an Internet Security and Acceleration (ISA) server, any user attempts to login from the Internet are challenged for a Windows login instead of the Microsoft Dynamics CRM sign on page. This causes the user authentication to fail. You can resolve this issue by changing the configuration setting on the ISA server to Request Appear to come from Original Client. This setting causes the ISA server to interpret the request as coming from the original client IP. For this configuration setting to work, the web server must point to ISA Server's internal IP address as the Default Gateway.
Configure IFD for a multi-forest with a perimeter network model
When you use a perimeter network to isolate Internet-facing resources from your internal corporate network, you have to open the ports to the local area network to successfully deploy Internet-facing Microsoft Dynamics CRM. You can see an example of a perimeter network model in the Planning Guide in the
Microsoft Dynamics CRM 4.0 Implementation Guide under the heading, "Multi-forest with client Internet access."
The following information on how to configure Microsoft Dynamics CRM for IFD with a perimeter network model is from Joel Lindstrom's
CustomerEffective blog. You need to do the following when using a perimeter network model:
1. Install and configure Microsoft Dynamics CRM.
On an initial installation, you can install and configure Microsoft Dynamics CRM for Internet-facing access using the command-line installation options or you can wait until after you have Microsoft Dynamics CRM running and tested before configuring it for IFD.
2. Enable the perimeter network solution.
3. Open the required ports to the local area network:
o Microsoft SQL Server
o Microsoft SQL Server Reporting Services
o Microsoft Exchange Server 2003 or Microsoft Exchange Server 2007
o Domain Controllers
For more information about Microsoft Dynamics CRM ports, see "Network ports used for Microsoft Dynamics CRM 4.0" in the Planning Guide in the
Microsoft Dynamics CRM 4.0 Implementation Guide.
4. Test the Microsoft Dynamics CRM server to ensure that it is working as expected.
5. Obtain and install a wildcard SSL certificate for your Microsoft Dynamics CRM deployment.
6. Use the Internet Facing Deployment Configuration tool to set up the IFD deployment. While using the IFD tool, verify that the DNS values resolve.