The property value is invalid. The value can’t contain leading or trailing whitespace.

I have encountered this problem while setting up Microsoft exchange 2010. After jumping through all of the appropriate hoops, the installation process stops with an area that looks something like this:

Organization Preparation
Failed

Error:
The following error was generated when “$error.Clear(); $acceptedDomains = @{}; Get-AcceptedDomain | foreach { $domainName = $_.DomainName.ToString(); if ($acceptedDomains.Contains($domainName)) { Write-ExchangeSetupLog -Warning “Duplicate AcceptedDomain found. ‘$($acceptedDomains[$domainName])’ and ‘$($_.Name)’ both reference domain ‘$domainName'”; } else { $acceptedDomains.Add($domainName, $_.Name); }; }; function getSmtpTemplates ([string]$property) { $input | Select-Object -ExpandProperty $property | Where-Object {$_.PrefixString -eq “SMTP”} | Foreach-Object {$_.AddressTemplateString -replace “.*@”, “”}; } function addDomains ([Microsoft.Exchange.Data.Directory.SystemConfiguration.AcceptedDomainType]$domainType) { $domain = $null; $input | Where-Object {-not $acceptedDomains.ContainsKey($_)} | Where-Object {[Microsoft.Exchange.Data.SmtpDomainWithSubdomains]::TryParse($_, [ref] $domain)} | Foreach-Object { $name = $domain.ToString(); if ($name.Length -gt 64) { $name = $name.Substring(0, 64) }; if ($acceptedDomains.ContainsValue($name) ) {$name = [System.Guid]::NewGuid().ToString()}; new-AcceptedDomain -Name:$name -DomainName:$domain -DomainType:$domainType; $acceptedDomains[$domain.ToString()] = $name; }; } $emailAddressPolicies = Get-EmailAddressPolicy; $emailAddressPolicies | getSmtpTemplates “NonAuthoritativeDomains” | addDomains “InternalRelay”; $emailAddressPolicies | getSmtpTemplates “EnabledEmailAddressTemplates” | addDomains “Authoritative”;” was run: “The property value is invalid. The value can’t contain leading or trailing whitespace. Property Name: Name”.

The property value is invalid. The value can’t contain leading or trailing whitespace. Property Name: Name

Now the interesting thing is that the error was repeated the exact number of recipient policies that existed in the exchange server 2003 running on the same domain. This indicated to me (now in correctly I understand) that each of the recipient policies had an invalid whitespace either before or after the policy name.

I really scratched my head a lot trying to resolve this, as I found there was not so much in the way of assistance available to the error that is given by exchange 2010.

That being: “The property value is invalid. The value can’t contain leading or trailing whitespace.”

So after exhausting all of my resources I installing exchange server 2007 service Pack 1. This area and with a slightly different error: “The Name property contains leading or trailing whitespace, which must be removed”

research on this led me fairly quickly to the following article: http://technet.microsoft.com/en-us/library/dd233089.aspx

  • Start the ADSI Edit tool, and then connect to the Configuration container. To do this, follow these steps:
    1. On a server, click Start, click Run, type adsiedit.msc, and then click OK.
    2. In the navigation pane, click ADSI Edit.
    3. On the Action menu, click Connect to.
    4. Click Select a well known Naming Context if this entry is not already selected.
    5. In the Select a well known Naming Context list, click Configuration, and then click OK.
  • Expand the following nodes:
    • Configuration [<domainController>.contoso.com]
    • CN=Configuration,DC=contoso,DC=com
    • CN=Services
    • CN=Microsoft Exchange
    • CN=<OrganizationName>
  • Under CN=<OrganizationName>, click CN=Recipient Policies.
  • In the details pane, examine the recipient policy DNs to locate any entries that resemble the following:
    CN=<policy name>\,CN=Recipient Policies,CN=<OrganizationName>,CN=Microsoft Exchange,CN=Services,CN=Configuration,DC=contoso,DC=com
  • Note whether any DNs appear together with a backslash character (\) or if any leading or trailing white spaces appear in the DN. A backslash character is used to “escape” the white-space character.
  • Use the Exchange Management Console to remove any white spaces from the recipient policy name. To do this, follow these steps:
    1. In the Exchange Management Console, expand Organization Configuration, and then click Hub Transport.
    2. Click the E-mail Address Policies tab, right-click the appropriate policy, and then click Edit.
    3. Delete any leading or trailing white spaces from the policy name, and then finish modifying the policy.

    What all of this is saying is that if you drill down to: configuration, CN services, first organisation, recipient policies. You will see a list of all of the recipient policies were the server. In the list on the far right is a column called a distinguished names. Hunt very carefully within all of the darter under the distinguished names column and look very closely for a backslash “\”

    Note the recipient policy that the backslash is found on, and go to the exchange system manager and in the recipient policies edit the associated recipient policy to remove the space which the backslash represents that she found in the step above.

    Once you have edited or all of the recipient policies that have a backslash in them to remove the associated whitespace or blank space you will find the exchange server 2010 will install successfully. And for that matter I expect that exchange server 2007 would install just as easily.

    You really do have to love the Microsoft installation process, that can fail with an error that is completely meaningless, but still seven lines deep a completely random useless code that does everything except tell you the associated recipient policy that is in error. Microsoft I wish you could feel our pain!

  • Hope you find this helpful. Please see more at: http://www.interactivewebs.com

    Digg This

    Scheduling a CRM System Job to Delete AsyncOperationBase junk from CRM 4.0 with CRM Automatic AsyncOperationBase Delete Tool

    As you may be aware, there are some issues with CRM 4.0 and performance being inhibited by AsyncOperationBase table growth.

    There are a few blogs on the AsyncOperationBase problem here.

    1. http://www.interactivewebs.com/blog/index.php/crm/slow-performance-or-large-database-file-in-ms-crm-asyncoperationbase/

    2. Performance is slow if the AsyncOperationBase table becomes too large in Microsoft Dynamics CRM 4.0

    3. Deadlocks, Performance issues, MSCRM database growth, AsyncOperationBase table increase

    4. Managing size of AsyncOperationBase table in CRM 4.0

    These great resources lead us down a path of discovery that the is no automated way in CRM to manage this problem. There is however some code examples in the SDK that allow you to place an automated process into the CRM server that can be viewed and managed from within CRM.

    Only problem is that you need to be a coder to make the SDK process call and action the reoccurring job.

    I thought this was a bit “Microsoft”. Not being a coder myself, but being surrounded by a bunch of really very cleaver guys, I asked one of them to whip me up a tool that I could run as an application from my desktop and make the calls into the different CRM system we manage to make the cleanup job.

    What I ended up with was a tool we call CRM Automatic AsyncOperationBase Delete Tool.

    image image

     

    image image

     

    image image

    The program will auto detect if you are running on a 32 or 64 bit system. Unfortunately this is necessary because the SDK code is Bit Dependent.

    Once running the application will let you enter either a local CRM installation or an IFD CRM setup, and activate a deletion job to run on schedule inside CRM.

    We are making this a free application, as I personally know what a challenge it is to be an Administrator of CRM 4.0 without being an asp.net coder. I do hope that it helps others. If you find it a time saver, and want to make a donation, you can do that from within the application. Otherwise if you are financially challenged, we would always love a blog post and a back link to http://www.interactivewebs.com SEO is important to us.

    Download the MS CRM Application here.

    Digg This

    MS CRM Rollup 8 and 9 fail with Invalid length parameter passed to the LEFT or SUBSTRING function.

    While installing MS CRM Rollup 8 or MS CRM rollup 9, we received an error that looked like this:

    —————————
    Microsoft Dynamics CRM 4.0 Update Rollup 9
    —————————
    Action Microsoft.Crm.Setup.Common.Update.DBUpdateAction failed.

    Invalid length parameter passed to the LEFT or SUBSTRING function.

    Cannot insert the value NULL into column ‘InvoiceNumber’, table ‘sdia_MSCRM.dbo.InvoiceBase’; column does not allow nulls. UPDATE fails.

    Invalid length parameter passed to the LEFT or SUBSTRING function.

    Cannot insert the value NULL into column ‘InvoiceNumber’, table ‘sdia_MSCRM.dbo.InvoiceBase’; column does not allow nulls. UPDATE fails.

    Invalid length parameter passed to the LEFT or SUBSTRING function.

    Cannot insert the value NULL into column ‘InvoiceNumber’, table ‘sdia_MSCRM.dbo.InvoiceBase’; column does not allow nulls. UPDATE fails.

    Invalid length parameter passed to the LEFT or SUBSTRING function.

    Cannot insert the value NULL into column ‘InvoiceNumber’, table ‘sdia_MSCRM.dbo.InvoiceBase’; column does not allow nulls. UPDATE fails.

    Invalid length parameter passed to the LEFT or SUBSTRING function.

    Cannot insert the value NULL into column ‘InvoiceNumber’, table ‘sdia_MSCRM.dbo.InvoiceBase’; column does not allow nulls. UPDATE fails.

    Invalid length parameter passed to the LEFT or SUBSTRING function.

    Cannot insert the value NULL into column ‘InvoiceNumber’, table ‘sdia_MSCRM.dbo.InvoiceBase’; column does not allow nulls. UPDATE fails.

    Invalid length parameter passed to the LEFT or SUBSTRING function.

    Cannot insert the value NULL into column ‘InvoiceNumber’, table ‘sdia_MSCRM.dbo.InvoiceBase’; column does not allow nulls. UPDATE fails.

    Invalid length parameter passed to the LEFT or SUBSTRING function.

    Cannot insert the value NULL into column ‘InvoiceNumber’, table ‘sdia_MSCRM.dbo.InvoiceBase’; column does not allow nulls. UPDATE fails.

    Invalid length parameter passed to the LEFT or SUBSTRING function.

    Cannot insert the value NULL into column ‘InvoiceNumber’, table ‘sdia_MSCRM.dbo.InvoiceBase’; column does not allow nulls. UPDATE fails.

    Invalid length parameter passed to the LEFT or SUBSTRING function.

    Cannot insert the value NULL into column ‘InvoiceNumber’, table ‘sdia_MSCRM.dbo.InvoiceBase’; column does not allow nulls. UPDATE fails.

    Invalid length parameter passed to the LEFT or SUBSTRING function.

    Cannot insert the value NULL into column ‘InvoiceNumber’, table ‘sdia_MSCRM.dbo.InvoiceBase’; column does not allow nulls. UPDATE fails.

    The statement has been terminated.

    The statement has been terminated.

    The statement has been terminated.

    The statement has been terminated.

    The statement has been terminated.

    The statement has been terminated.

    The statement has been terminated.

    The statement has been terminated.

    The statement has been terminated.

    The statement has been terminated.

    The statement has been terminated.

    —————————
    Retry   Cancel  
    —————————

    It turns out this error is caused by an invoice having an invalid invoice number. By default, MS CRM gives invoices numbers that look something like this: INV-06881-39HRRD

    In our CRM project, we had some invoice number formats being inserted manually by a remote Events Booking system we have written for the web (cool application actually). This used slightly different format invoice numbers intentionally. The solution to the problem was to either remove or renumber in the same format the invoice records. Once your invoice numbers are all as CRM expects them, then you can install either or both updates.

    This is a SQL script that may help:

    
    
    Execute this SQL script to generate correct invoice number, specifying 
    
    correct length for your invoice number format 
    
    
    
    (verify in your CRM parameters Automatic Numbering for invoice): 
    
    @InvoiceNumberPref = 'INV' 
    
    @invoicePART1Len = 5 
    
    @invoicePART2Len = 6 
    
    In this case : INV-02365-6Y5TRE 
    
    
    
    
    
    
    
    -- Start Script ---------------------------------------- 
    
    DECLARE @InvoiceNumberPref nvarchar(5) 
    
    SET @InvoiceNumberPref = 'INV' 
    
    DECLARE @invoicePART1Len int 
    
    SET @invoicePART1Len = 5 
    
    DECLARE @invoicePART2Len int 
    
    SET @invoicePART2Len = 6 
    
    
    
    DECLARE @i int 
    
    DECLARE @j int 
    
    DECLARE @n int 
    
    DECLARE @strnum nvarchar(10) 
    
    DECLARE @RandomChars nvarchar(10) 
    
    DECLARE @RandomInvoiceNumber nvarchar(20) 
    
    
    
    SET @j = 1 
    
    
    
    DECLARE @invoiceid nvarchar(50) 
    
    DECLARE @invoicenumber nvarchar(20) 
    
    
    
    DECLARE cursor_invoices CURSOR FOR 
    
    SELECT CONVERT(NVARCHAR(50),invoiceid), invoicenumber FROM dbo.invoice 
    
    order by createdon 
    
    
    
    OPEN cursor_invoices 
    
    
    
    FETCH cursor_invoices INTO @invoiceid, @invoicenumber 
    
    
    
    WHILE @@FETCH_STATUS = 0 
    
    BEGIN 
    
    
    
    SET @strnum = CONVERT(nvarchar(10), @j) 
    
    SET @j = @j + 1 
    
    SET @strnum = REPLICATE('0', @invoicePART1Len-LEN(@strnum)) + @strnum 
    
    
    
    
    
    SET @RandomChars = '' 
    
    SET @i = 0 
    
    WHILE @i < @invoicePART2Len 
    
    BEGIN 
    
    SET @n = ASCII(0)+CEILING(RAND()*(ASCII('Z')-ASCII(0))) 
    
    --exclude value range 58-64 
    
    IF @n>ASCII(9) AND @n<ASCII('A') SET 
    
    @n=ASCII(0)+CEILING(RAND()*(ASCII(9)-ASCII(0))) 
    
    SET @i = @i + 1 
    
    SET @RandomChars = @RandomChars + NCHAR(@n) 
    
    END 
    
    
    
    SET @RandomInvoiceNumber = @InvoiceNumberPref + '-'+@strnum+'-'+@RandomChars 
    
    
    
    PRINT @invoiceid + ' ' + @invoicenumber + ' ' + @RandomInvoiceNumber 
    
    
    
    UPDATE invoicebase 
    
    SET invoicenumber = @RandomInvoiceNumber 
    
    WHERE invoiceid = @invoiceid 
    
    
    
    FETCH cursor_invoices INTO @invoiceid, @invoicenumber 
    
    END 
    
    
    
    CLOSE cursor_invoices 
    
    DEALLOCATE cursor_invoices 
    
    
    

    Check out our website for more CRM integration into DotNetNuke.

    Digg This

    Slow Performance or Large Database File in MS CRM AsyncOperationBase

     

    There is a lot of information online about the MS CRM performance issues and very large database file sizes. Without going into MS CRM (you can Google that) it is by design. Can you believe that!

    CRM is set to record everything that is going on, and for most people, most of the transaction logging in the AsyncOperationBase table is just junk. Now you would expect that there is a little in application sort of… clean up your junk… feature in CRM, but alas we are dreaming of some Apple product. For this reason, the database has to be manually cleared, or an auto process set to do this manually.

    So the situation before me now is a massive database of 20GB with almost 17 million transactions listed.

    This server I am looking at is Windows 2008, and the SQL server is also Windows 2008.

    These are the steps to fix this problem in this case.

    1. Log in to SQL Management Studio with an administrator account that has full access to the database in question.

    2. The database will loos like ORGNAME_MSCRM and you right click and select New Query

    image

    3. Copy and paste the script below into the SQL Query window and select the Execute Button (that does not look like a button till you hover)

    
    
    Select Count(*) from AsyncOperationBase

    image

    You will end up with a query result that show the number of records that will need to be addressed, this will give you a good indication of the time it will take. 17 million = a long time!

    Because of this big number, I am going to take some steps to improve the performance that this query will run.

    4. Backup the database to ensure you have a safe starting point.

    5. Shrink the Database by right clicking and selecting tasks, shrink, database:

    image

    Then OK on the default settings.

    6 Then improve performance by creating some indexes for the cleanup query. Paste this code over the Query Code in step 3, and execute.

    
    
    CREATE NONCLUSTERED INDEX CRM_AsyncOperation_CleanupCompleted
    
    ON [dbo].[AsyncOperationBase] ([StatusCode],[StateCode],[OperationType])
    
    GO
    
    
    
    CREATE NONCLUSTERED INDEX CRM_WorkflowLog_AsyncOperationID ON [dbo].[WorkflowLogBase] ([AsyncOperationID])
    
    GO 
    
    
    
    CREATE NONCLUSTERED INDEX CRM_DuplicateRecord_AsyncOperationID ON [dbo].[DuplicateRecordBase] ([AsyncOperationID])
    
    GO
    
    
    
    CREATE NONCLUSTERED INDEX CRM_BulkDeleteOperation_AsyncOperationID ON [dbo].[BulkDeleteOperationBase]
    
    (AsyncOperationID)
    
    GO

     

    image

    This little baby may spin for some time: image

    7. Stop the Microsoft CRM Asynchronous Processing Service in the Server Services, found under the Administrator tools / Services

    image

    8. Set Simple Database Recovery. Right click the database and select Properties / Options / Recovery Model to simple

    image

    9. Run this command in the SQL Query, like in step 3

    
    
    -- Rebuild Indexes & Update Statistics on AsyncOperationBase Table 
    
    ALTER INDEX ALL ON AsyncOperationBase REBUILD WITH (FILLFACTOR = 80, ONLINE = OFF,SORT_IN_TEMPDB = ON, STATISTICS_NORECOMPUTE = OFF)
    
    GO 
    
    -- Rebuild Indexes & Update Statistics on WorkflowLogBase Table 
    
    ALTER INDEX ALL ON WorkflowLogBase REBUILD WITH (FILLFACTOR = 80, ONLINE = OFF,SORT_IN_TEMPDB = ON, STATISTICS_NORECOMPUTE = OFF)
    
    
    
    GO

    You will probably see your database almost double in size with this one.

    10. Then finally run the command that will clean up the database

    
    
    declare @DeleteRowCount int
    
    Select @DeleteRowCount = 2000
    
    declare @DeletedAsyncRowsTable table (AsyncOperationId uniqueidentifier not null)
    
    declare @continue int, @rowCount int
    
    select @continue = 1
    
    while (@continue = 1)
    
    begin
    
          begin tran
    
          insert into @DeletedAsyncRowsTable(AsyncOperationId)
    
          Select top (@DeleteRowCount) AsyncOperationId
    
          from AsyncOperationBase
    
          where OperationType in (1, 9, 12, 25, 27, 10) AND StateCode = 3 AND StatusCode in (30, 32)     
    
    
    
          Select @rowCount = 0
    
          Select @rowCount = count(*) from @DeletedAsyncRowsTable
    
          select @continue = case when @rowCount <= 0 then 0 else 1 end     
    
    
    
            if (@continue = 1)
    
            begin
    
                delete WorkflowLogBase from WorkflowLogBase W, @DeletedAsyncRowsTable d
    
                where W.AsyncOperationId = d.AsyncOperationId
    
    
    
    delete BulkDeleteFailureBase From BulkDeleteFailureBase B, @DeletedAsyncRowsTable d
    
                where B.AsyncOperationId = d.AsyncOperationId
    
    
    
                delete AsyncOperationBase From AsyncOperationBase A, @DeletedAsyncRowsTable d
    
                where A.AsyncOperationId = d.AsyncOperationId            
    
    
    
                delete @DeletedAsyncRowsTable
    
          end
    
    
    
          commit
    
    end

    Executing just as we did in step 3.

    11. Reset the database to Full Recovery Mode, reversing the step we took in step 8.

    12. Shrink the database again exactly as we did in step 5.

    13. Start the Service again, reversing step 7.

    And you should be good to go. More information on this and DotNetNuke Modules.

    Printer Fail due to a Mouse Problem

    Call to IT Department
    Caller
    :                      Hi, our printer is not working.
    Customer Service
    :    What is wrong with it?
    Caller
    :                      Mouse is jammed.
    Customer Service
    :    Mouse? Printers don’t have a mouse.
    Caller
    :                      Mmmmm…….. oh really?… I will send a picture.

    clip_image001

    Digg This

    How to use button images in place of text send and receive in DNN Feedback Module

    Feedback DesignerThe Feedback Designer Module for DotNetNuke can easily have the text buttons replaced with images. These images can simulate buttons.

     

    To make the change you simply:

    1. Login as Host or Admin to your dnn site

    2. Configure the module

    3. from the menu, select “Modify Look and Feel”

    image

     

    4. From the Send / Reset Settings select “Image” from the Text of Button options

    image

    5. Select your images from your site directory

    image

    6 Save your changes

    image

    Digg This

    DotNetNuke.Services.Exceptions.PageLoadException: Failed to load viewstate Problem Solved / Fixed

    Error
    An error has occurred.
    DotNetNuke.Services.Exceptions.PageLoadException: Failed to load viewstate. The control tree into which viewstate is being loaded must match the control tree that was used to save viewstate during the previous request. For example, when adding controls dynamically, the controls added during a post-back must match the type and position of the controls added during the initial request. —> System.Web.HttpException: Failed to load viewstate. The control tree into which viewstate is being loaded must match the control tree that was used to save viewstate during the previous request. For example, when adding controls dynamically, the controls added during a post-back must match the type and position of the controls added during the initial request. at System.Web.UI.Control.LoadViewStateRecursive(Object savedState) at System.Web.UI.Control.LoadChildViewStateByIndex(ArrayList childState) at System.Web.UI.Control.LoadViewStateRecursive(Object savedState) at System.Web.UI.Control.LoadChildViewStateByIndex(ArrayList childState) at System.Web.UI.Control.LoadViewStateRecursive(Object savedState) at System.Web.UI.Control.LoadChildViewStateByIndex(ArrayList childState) at System.Web.UI.Control.LoadViewStateRecursive(Object savedState) at System.Web.UI.Control.LoadChildViewStateByIndex(ArrayList childState) at System.Web.UI.Control.LoadViewStateRecursive(Object savedState) at System.Web.UI.Control.LoadChildViewStateByIndex(ArrayList childState) at System.Web.UI.Control.LoadViewStateRecursive(Object savedState) at System.Web.UI.Control.LoadChildViewStateByIndex(ArrayList childState) at System.Web.UI.Control.LoadViewStateRecursive(Object savedState) at System.Web.UI.Page.LoadAllState() at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) — End of inner exception stack trace —

    How we got this error.

    Today while playing with a new clients site, I received this error while uploading a module. Now under normal circumstances I would run around looking at the DNN install, or the module developer to challenge them as to what is wrong, and can they fix it.

    However as I was the Server Admin, and the person who setup the database and website, I had enough confidence to know that all that side of things was correct. And in this case the dnn module developer was InteractiveWebs (us). So no need to go hunting there.

    So I started looking closely at the error and thinking outside the box.

    Knowing all the other “ducks were in a row” I concluded that the user session state must no longer be valid. Even though I could move around in the DNN Host Account and all appeared to work fine.

    Solution / Fix

    • Log our of the site
    • Log back into the site 

    All was resolved! So I cannot explain exactly why the session state had expired, but I do know that if an Airbus A380 can require 20 computer resets to flying, then a DNN website can require one every now and again. Hope it helps.

    Digg This

    Understanding the Bin directory in DotNetNuke

    There are a bunch of folders that are setup in a new DotNetNuke folder.

    An Introduction to the DNN Folder Structure

    1. Admin
    2. App_Code
    3. App_Data
    4. App_GlobalResources
    5. Bin
    6. Controls
    7. DesktopModules
    8. Portals
    9. Providers

    to name a few.

    The \bin or folder is a special folder in asp.net websites. It is a shared code folder that is set to have special security permissions.

    Putting compiled assemblies into the Bin folder can represent a security risk. If you wrote the code yourself and compiled it, then you know what the code does. However, you should treat compiled code in the Bin folder as you would treat any executable code. Be wary of compiled code until you have tested it and are confident that you understand what it does.

    Note these security aspects of putting compiled code into the Bin folder:

    • Assemblies in Bin folder are scoped to the current application. Therefore, they cannot access resources or invoke code outside the current Web application.

    • At run time, the access levels of an assembly are established by the trust level specified on the local computer. For more information, see ASP.NET Trust Levels and Policy Files.

    • If you are working in a designer such as Visual Studio, code in the Bin folder runs in a different context than at run time. For example, the code might be running with full trust.

    The code in these folders is not publically accessible to download, but can be accesses by the website to run.

    If you are writing code that you care a lot about and want to make impossible to copy, you can obfuscate the code. This is what we do for example with all our DotNetNuke Modules, and prevents our code being reverse engineered and used illegally.

    Digg This

    Windows Live Messenger on Multiple Monitors System Windows 7

    I have a system that has multiple monitors and we use a great little application called ultramon that allows you to have a desktop tray on all monitors. The idea being that the monitor with the application running on it will have a desktop try icon to control the application.

    This is good to allow you to control applications from the system try on the appropriate monitor.

    It has bugged me that the Windows Live Messenger is the only program I run that kept a system try icon on the primary monitor and duplicated another icon on the second monitor where the program was running.

    But there is a solution.

    1. Close Windows Live Messenger

    2. Search for Live Messenger in the start menu, and right click and select Properties.

    3. Select Compatibility Tab

     image

    4. Select run this program in compatibility mode for: Windows Vista

    image

    This will put the main monitor desktop icon back into the mini icon format.

    image

    And as they say… Bob is your fathers brother!

    Digg This

    Data capture in DotNetNuke Tell My Friend Module

    Today we have released a new version of Tell My Friends, the dotnetnuke module that allows you to send a message from a website to a friend advising them that you like the site. This new feature works like this:

    In the settings are of the module you simply enable the “Enable Data Capture” feature:

    image

    Then from the menu inside the module configuration, you will find a new menu item called “Messages”

    image

    This is the area that displays the data capture area of the messages sent.

    image

    You can search of an email address:

    image

    Or export the data to an excel spreadsheet:

    image

    This will allow the data to be used with the Bulk Emailer module for DotNetNuke, using the excel sheet to import a custom list and email people who have been sent a message from your site.

    Digg This