Wednesday, March 13, 2013

SharePoint 2010 / PowerShell - How to get ALL of the site collection information into CSV

Hi Everyone, long time no speak...

After Googling and Googling more I still did not find a script that would do what I wanted. So I wrote mine from bits and pieces I gathered from various places that I cannot remember :)

Sorry for anyone who recognises their code and not been mentioned, I thank you warmly anyway.

The following script will loop through ALL the site collections of a SharePoint 2010 Farm and output some key fields to a CSV file


001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
018
019
020
021
022
023
024
025
026
027
028
029
030
031
032
033
034
035
036
037
038
039
040
041
042
043
044
045
046
047
048
049
050
051
052
053
054
055
056
057
058
059
060
061
062
063
064
065
066
067
068
069
070
071
072
073
074
075
076
077
078
079
080
081
082
083
084
085
086
087
088
089
090
091
092
093
094
095
096
097
098
099
100
101
102
103
104
105
106
107
#Add SharePoint PowerShell SnapIn if not already added
 if ((Get-PSSnapin "Microsoft.SharePoint.PowerShell" -ErrorAction SilentlyContinue-eq $null) {
    Add-PSSnapin "Microsoft.SharePoint.PowerShell"
}

cls;

# SET THE EXPORT FILEPATH
$today = (Get-Date -Format yyyy-MM-dd-hh-mm)
$exportFilePath = "C:\Temp\SP2010FarmQuotaOutput_" + $today + ".csv";

$t = [Microsoft.SharePoint.Administration.SPWebService]::ContentService.QuotaTemplates

$tFound = $false

# Get a handle on ALL site collection...
$allSiteCols = Get-SPWebApplication | %{$_.Sites} | Get-SPSite -Limit ALL

$myData = @()

foreach ($site in $allSiteCols) {

try {

# Find what Quota is used for this site col...
foreach($qt in $t){
if($qt.QuotaId -eq [int](($site.Quota).QuotaID)){
$siteQuota = $qt.Name;
$tFound = $true
}
}

if($tFound -eq $false){
$siteQuota = "No Template Applied"
}

# Get a handle on the Root Web...
$web = $site.Rootweb;

# Get the owner if possible
$siteOwner = "";
$siteDBName = "";
$rootWebLastModifiedDate = "";
$siteUrl = "";
$siteOwnerName = "";
$siteOwnerEmail = "";

$siteOwner = $site.Owner;
$siteDBName = $site.ContentDatabase.Name;
$rootWebLastModifiedDate = $web.LastItemModifiedDate.ToShortDateString();
$siteUrl = $site.Url.ToString();

if ($siteOwner -ne $null) {
$siteOwnerName = $Site.Owner.Name;
$siteOwnerEmail = $Site.Owner.Email;
}

# Do some calculations around storage...
if ($site.Quota.StorageMaximumLevel -gt 0) {[int]$maxStorage = $site.Quota.StorageMaximumLevel / 1MBelse {$maxStorage = "0"};
if ($site.Quota.StorageWarningLevel -gt 0) {[int]$warningStorage = $site.Quota.StorageWarningLevel / 1MBelse {$warningStorage = "0"};
if ($site.Usage.Storage -gt 0) {[int]$storageUsed = $site.Usage.Storage / 1MB};
if ($storageUsed -gt 0 -and $maxStorage -gt 0) {[int]$siteQuotaUsed = $storageUsed / $maxStorage * 100else {$SiteQuotaUsed = "0"};

# Compile each line...
$myData += New-Object -TypeName PSObject -Property @{
Url = $siteUrl
SiteCollectionOwner = $siteOwnerName
SiteCollectionOwnerEmail = $siteOwnerEmail
RootWebLastModifiedDate = $rootWebLastModifiedDate.ToString()
ContentDBName = $siteDBName
StorageUsedMB = $storageUsed
StorageUsedPercent = $siteQuotaUsed
StorageAvailableWarningMB = $warningStorage
StorageAvailableMaximumMB = $maxStorage
SandboxedResourcePointsWarning = ($site.Quota).UserCodeWarningLevel
SandboxedResourcePointsMaximum = ($site.Quota).UserCodeMaximumLevel
QuotaName = $siteQuota
                } | Select-Object Url,
SiteCollectionOwner,
SiteCollectionOwnerEmail,
RootWebLastModifiedDate,
ContentDBName,
StorageUsedMB,
StorageUsedPercent,
StorageAvailableWarningMB,
StorageAvailableMaximumMB,
SandboxedResourcePointsWarning,
SandboxedResourcePointsMaximum,
QuotaName

# Reset the "found flag"
$tFound = $false;
}

catch [System.Exception] {
write-host 'EXCEPTION: ' + $error[0];
}

finally {
if ($site -ne $null) {$site.Dispose()};
}
}

# Export the data to CSV format
$myData | Export-Csv $exportFilePath -Delimiter "," -NoTypeInformation

Sunday, April 29, 2012

How was the London International SharePoint Conference 2012 for me... (ISC London 2012)

Long time no speak...

I have to say "Blogger" has quite drastically changed since I last logged in and clicked on "Create a new post..."! Anyone else is thinking the same? Have Twitter/Facebook completely overtaken the good old fashioned "Blog" for good?

Today I would like to talk about the start of this week and the ISC London 2012 (International SharePoint Conference) I attended in the heart of London this Monday/Tuesday/Wednesday (23/24/25 April 2012).

If you want to skip to the end, I would give it a 5 out of 10 (10 being best).

If you want more details, please keep reading.

Let me start with the good things (aka "pros"):

- Very good turn out of SharePoint 2010 3rd party suppliers & consultancies. Some with very impressive products/services
- Good & original idea with the "Building of a real-world solution" during the 3 days of the conference (shame it was a very limited "real world solution" and very far from the "real world" in my opinion - but that should be in the "cons" sorry)
- Great to be in London for once. Great to be out of the office as it allowed me to take a step back and think about the way we are doing things right now in my team...
- Some "great tip" moments (but not as many as I was hoping for...)

Now the "cons":

- £650 for the pleasure of attending was far too expensive in my opinion.
- No need for a "Cafe de Paris" night that felt a bit like it was the only "exciting" thing the organisers could think of for the 3 days? What? to get p*ssed in a "French Cancan" type bar paying over the roof for a simple glass of house red? Oh... and massive bad mark for the fact that it was the most inaccessible venue in the Leicester Square area for a wheelchair user like me? I had to be carried on the back of one of the bouncers to be able to attend... nice when you're 37, brings back some memories (thanks to the bouncers though, guys you were amazing). Is being able to walk a pre-requisite to become a .NET/SharePoint developer?
- I personally thought that the quality of the presenters was very poor, especially outside of the 2 main "rooms" or "tracks" (developer/it pro tracks). I did not learn anything technical that changed my life as a tech solution builder. InfoPath was ok but nothing new, Branding was very poor, Visio services looked really clunky. The Business Intelligence sessions only barely "skimmed the surface" of the BI SharePoint stack. Even the "devguru" Microsoft MVPs and Masters were totally buried into Visual Studio 2010 and would not take the "almighty" step back to try and understand the big "business" picture and give us some real & helpful advice to make our developer's life easier?
- The allegedly "real life" scenario to build a real app hosted on SharePoint 2010 (on prem or online) had nothing to do with what I would call a "real life" scenario. It was mainly leveraging the new Enterprise metadata feature of SP2010, showing how to upgrade WSP, how to search related content based on taxonomy and how to export to Word and PDF. Nothing challenging if someone tells me they need that in their 2007 SharePoint site...

The "dev" track:

This is the one I mainly followed and although I started filled with hope that these guys were going to solve all of my problems, I was very disappointed in the end by the lack of "realism" and maybe even "professionalism" from some of the MVPs during these sessions...

Of course, there was also some great speakers there, such as Mirjiam van Olst who distributed a free copy of her excellent magazine DIWUG, which actually taught me more about SharePoint 2010 techniques & trends than the actual track itself. I will definitely try and subscribe as soon as poss... who knows maybe even provide some tips & tricks to the community if she allows me.

Balancing that, I saw a LOT of arrogance and a LOT of "let's-solve-every-single-problem-with-visual-studio" attitude. Not what I was expecting from experts in the field of (Microsoft) software development.

Although Visual Studio 2010 is awesome (we all know that), it doesn't mean it is always the best tool to tackle a SharePoint challenge!

The "dev tech" pecking order as far as I am concerned is always:
  1. Try to solve your problem with out-of-the-box web parts, site templates, free CodePlex tools that the community has kindly shared with us (Access Checker, Events Manager...)
  2. If "1" fails, give SharePoint Designer a go! You'll be surprised how far you can take it...
  3. If "1" and "2" both give up, then start thinking about Visual Studio and tell your project manager that you're going to have to SCRUM it, TEST it, VALIDATE it, UPGRADE the existing solution, deploy out of office hours and basically add a huge amount of dev time to an already stretched project and a worryingly understaffed team (architect, tester and business analyst all missing)
Well I was told by one of the MVPs that

"SharePoint Designer is not used here cause you're on the developer track..."

This was the answer to my question:

"Why did you code these web parts in Visual Studio? You could have saved about 2 dev months in your 8 for the prep of the conference if you had done the same in SharePoint Designer using a Data View?"

So...

HTML, CSS, XSLT, XML are not dev languages?
DataView Web Parts are not a good dev technique to show underlying SharePoint list/doc lib data?
BCS definitions always have to be written by hand in XML in VS 2010?
...

This dude is wrong.

Very wrong.

I hate SharePoint Designer 2007 (see one of my previous posts...).
Heard 2010 is better but it's still not Visual Studio.
Either way, it's still a tool that will allow any good SharePoint dev to achieve 80% of the project in 20% of the time, and to me, this is not something to miss in a conference where you're showing off techniques that (should) save the IT devs some time!

Anyway...

In response to this I am planning to write a new post soon including a brand new YouTube-like SharePoint 2010 site template (obviously simpler than YouTube - don't have as many devs as they do...) but only developed using SharePoint Designer 2010 & out of the box site template.

I promise I will time myself and I reckon I will be done in less than a day.

Watch this space!

PS: ...Going to give the ISC London a miss next year... for sure.

Friday, April 27, 2012

My take on why businesses should upgrade to SharePoint 2010 or 10 Reasons to upgrade

  1. User friendliness across the board on SharePoint Sites UI. Good video going through most of the most important changes. 
  2. Wiki have been improved tremendously (also support all browsers, not just Internet Explorer). SharePoint is effectively turning into a Wiki. if you want more details this video covers most of it. 
  3. Ability to have multiple people co-author documents (like Google docs but in the Office client). Working for DOC, PPT, OneNote but not Excel client (only web client). More info here
  4. Performance has greatly improved across the board 
  5. Much better integration with other Microsoft systems/apps such as Exchange 2010, Lync 2010, Office 2010. Video & excellent blog article
  6. Much better “My Sites” and social networking for the enterprise. Video
  7. Better Business Intelligence features 
  8. Better Search 
  9. Better Development tools (only for IT Development & Power Users around the business) 
  10. Better Enterprise Taxonomy & Metadata management

Thursday, December 10, 2009

SharePoint A process serving application pool terminated unexpectedly. The process id was ''. The process exit code was '0xffffff

Oh joys of working in IT...

Some days are really bl**dy awful.

This morning my MOSS 2007 staging farm (thank god it was not the live one) was down, not able to go to ANY of the SharePoint sites.

Symptoms:

1. Getting the cryptic "Service Unavailable" in IE when browsing to the SharePoint site (including the Central Admin)
2. Checking out in IIS the SP App Pools have crashed, tried to start them again, IIS reset but whenever I browse to the Central Admin again, the app pool crashes again.
3. The following events are in the System Logs

A process serving application pool terminated unexpectedly. The process id was ''. The process exit code was '0xffffff'

What's that? Never seen it before!?

And it only appeared at 3am this morning... hang on a minute... 3am?
WINDOWS AUTOMATIC "KILLER" UPDATES!!!

Nightmare...

After checking the almighty logs I worked out what KB was installed:

Restart Required: To complete the installation of the following updates, the computer will be restarted within 15 minutes:
- Security Update for Windows Server 2003 (KB974318)
- Windows Malicious Software Removal Tool - December 2009 (KB890830)
- Security Update for Windows Server 2003 (KB973904)
- Update for Windows Server 2003 (KB971737)
- Update for Windows Server 2003 (KB973917)
- Security Update for Windows Server 2003 (KB974392)
- Cumulative Security Update for Internet Explorer 8 for Windows Server 2003 (KB976325)

Doing a quick search in Google harvested the following:

http://gavin.mclelland.ca/2009/12/09/iis-service-unavailable-aka-windows-security-update-kills-application-pool/
and
http://thecrmgrid.wordpress.com/2009/12/09/windows-update-killed-my-app-pool/
and
http://blogs.msdn.com/jaskis/archive/2009/12/09/after-installing-kb-973917-the-iis-6-0-application-pools-cannot-start-up.aspx

(THANK YOU GOOGLE, THANK YOU GOOGLE, THANK YOU GOOGLE...)

Anyway, tried what was said there and installed Windows Server 2003 SP2 again.
That solved the crashing app pool problems but created a new one:

1. Now getting an error HTTP 403 when browsing any SharePoint site (including Central Admin)
2. In the IIS logs I get

2009-12-10 12:27:31 W3SVC1611466368 10.4.4.39 GET / - 1000 DOMAIN\username 10.4.4.39 Mozilla/4.0+(compatible;+MSIE+7.0;+Windows+NT+5.2;+Trident/4.0;+.NET+CLR+1.1.4322;+.NET+CLR+2.0.50727;+.NET+CLR+3.0.4506.2152;+.NET+CLR+3.5.30729) 403 14 5

Did some research and that came up
(THANK YOU GOOGLE, THANK YOU GOOGLE, THANK YOU GOOGLE...)

https://www.hensongroup.com/blogs/archive/2009/05/11/moss-2007-403-forbidden-error-after-net-framework-updates-fail-to-install.aspx

UPDATE (06/09/2012): Someone mentioned that the link above does not work anymore so let's go straight to the horse's mouth: http://support.microsoft.com/Default.aspx?kbid=2009746

Extract from that page (i.e. solution):

To resolve this problem, reinstall Service Pack 2 for Windows Server 2003 on the web server.  This will bring all IIS 6.0 components up to the correct file versions, and will maintain the installation of the KB973917 update.  Reinstalling the KB98266 and/or KB973917 update should not be necessary.
NOTE: Re-installing SP2 will enable Scalable Networking Pack (SNP) Feature that is on by default with Windows 2003 Service Pack 2. When service pack 2 was originally released this caused the issues documented in the following KB: http://support.microsoft.com/kb/948496

It may be necessary to disable the Scalable Networking Pack after re-applying Service Pack 2 to address the issues described in KB 948496

That was my problem...

Central Admin is back.

Will try later to re-install the faulty KB973917 just for fun and because I really have time to waste in my day like Microsoft seems to think!!!.... NOT

Thank you very much Microsoft Automatic Updates for wrecking my day once more!

Monday, September 14, 2009

SharePoint Designer is POO!!! or sh*t, awful, crap, pants, annoying, badly-designed... basically a developer's nightmare!

Hi All,

It's been a while and I really feel like I have to shout about something today!

Hello my name is Etienne, I'm a hardcore SharePoint developer and have been for now 8 years. Just to say that I am starting to know my way around MOSS...

One thing that hasn't changed though is SharePoint Designer (aka SPD), the "tool" that is supposed to help you do stuff in MOSS 2007 (it was also called SharePoint Designer in 2003 and it's ancestor was FrontPage... have you ever seen/used FrontPage to do web development? If yes you will definitely know what I mean by "POO")

SharePoint Designer is an absolute pile of sh*t in terms of interface and SOOOOO annoying to use because it:
  1. Has very poor interface goodies unlike his big brother Visual Studio (which is awesome BTW as every .NET/SilverLight/SQL developer knows)
  2. Times out all the time (when it works)
  3. Tries to mess with your code and really "uglyfies" it
  4. Gives you errors constently for no reason
  5. Can REALLY break your SharePoint Site if you haven't been properly trained
  6. Extremely unintuitive whether you're a Monkey or a Genius
  7. ... and so much more I'm afraid!
The real problem is that without SharePoint Designer you are pretty much stuffed because this is the only app that will allow you to perform certain things in SharePoint such as creating DataViews or customising the look & feel of your site...

Emile summarises it perfectly (I love his article):
http://agiledirect.wordpress.com/2007/11/10/developer-awareness-and-the-bad-reputation-of-sharepoint-designer-a-post-to-all-developers/

However, let me just say this to Microsoft, please please PLEASE! Drop this product and integrate ALL SharePoint development to the Visual Studio Interface!
Is that the plan for SharePoint 2010?
I really hope so cause I can't imagine myself having to deal with this "pile-of-smelly-stuff" ever again:

Thanks for listening & please leave comments if you agree with this post!

I feel alone today...

Etienne

Wednesday, March 18, 2009

One for the SharePoint 2007 community... Please welcome the "SharePoint Farm Browser" (Source Code available)!!!


Dear fellow SharePoint developers and administrators!

I am pleased to announce the "SharePoint Farm Browser for MOSS 2007" (you're going to love it) :)

I have been working with SharePoint for nearly 10 years, I actually started with the 2001 version back in the days...

Since then all my jobs have been around SharePoint and there is a tool that is SOOOOO needed in the MOSS world: an easy, quick and efficient way to view the ENTIRE SharePoint farm structure and some high level usage data.

Until today, only certain 3rd party tools could do that such as AvePoint Discovery tool and also credits to a few SharePoint bloggers for some code snippets that loop through Web Applications, Site Collections, Webs and SubWebs... but nothing was really doing the job properly FOR FREE!

The SharePoint Farm Browser is trying to tie everything together in one very simple "one form" win app.

The beauty of it is that it is a multi-threaded application and allows a SharePoint farm admin to view where the UI is at as it is traversing the SharePoint structure.

When the tool is finished you can produce 2 types of reports.

1. An XML file easily opened in IE and showing the farm structure
2. A CSV file showing the complete structure along with some high level usage data

Here is the code and I will put it on CodePlex when their servers are back up!



Hope this helps and saves some of you SharePoint workers some time and money!

Maybe that will help me become an MVP too... ;)

Cheers,
Etienne

Friday, November 07, 2008

How to view the raw XML spat out by SharePoint Designer datasources

Hi SharePoint Guys & Girls!

Just a quickie, cause I'm always struggling to find that information.

Here is a very simple XSLT to view the raw XML spat out by SharePoint Designer's various SPDatasource objects:

I always forget it and spend hours looking for it on the web...

The link from the Microsoft website is here:
http://msdn.microsoft.com/en-us/library/ms546985.aspx


<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:template match="/">
<xsl:copy-of select="*"/>
</xsl:template>
</xsl:stylesheet>


Cheers,
Etienne

Thursday, October 16, 2008

Organise & Manage Multiple Remote Desktop Connections Easily with Windows Out-Of-The-Box!

Today is one of these days where I feel proud of myself!
I know there is not much to be proud of but I've saved myself so much time in the long run with this...

Look at that screenshot mister server man :)
I only need to double click on any of there entries to connect to the server(s) I like.
No need for a crappy 3rd party product, just simple out of the box Windows stuff!




You know when you have been in need of a life/time saving tool for ages without really finding exactly what you wanted and one day you come up with this brilliant, easy to implement and shining-by-its-simplicity idea all by yourself... well today is one of these days for me.

And I'm so excited about it I need to tell you all about it and finally end this very long period of non activity on this "dusty" blog.

How many of you have to manage more than let's say 5 servers from your Windows client?
If you're a network admin or a SharePoint guy just like me, you may even have around 20 servers to potentially connect to on a daily basis.

Also I bet quite a few admins out there are using Windows Remote Destop Connections (RDP) to connect to these servers?

Now, within that group of people how many of you have saved the RDP connection settings along with connection credentials and created a shortcut on their desktop to be able to instantly connect to the relevant machine by simply double clicking on the icon? (surely I'm not the only one here...)

If you're like me and you are really lazy that's exactly what you've done so far cause if you're like me and you've got 20 servers that you need to connect to on a daily basis, you don't want to have to type in your password and login details every single time.

Now, 20 desktop shortcuts can take a lot of room on your desktop:



I have been looking for a neat way to organise all these shorcuts for ages and came across a few badly implemented solutions until I re-discovered this fantastic Windows out-of-the-box function that "New Folder" is :)

For all the admins out there, please try this out:

1. Create a new folder on your desktop called "RDP"
2. Open Windows Remote Desktop Connection


3. Type in the name of the server you wish to connect to and select all your favourite RDP options
4. Don't forget to click the "Allow me to save credentials" box if you're a lazy b**** like me.
5. Hit "Save As..." and save these RDP connection settings to the folder created in step 1
6. Hit "Connect"
7. You may get this warning, tick the "Don't ask me again..." box


8. Then you will get this box if you've completed step 4 successfully


9. I can hear you already saying "I thought this article was going to save me some time, but in fact there is more popups I need to click on than on my favourite naughty sites !?" don't worry these popups will only appear once... and no more!
10. You will now get this window and hopefully be able to enter your password correctly (don't forget the old "CAPS LOCK ON"...)
11. Have a cup of tea cause steps 1 to 10 were quite daunting and complex

Now comes the fun.

Repeat step 2 to 11 till you have all your servers saved in your newly created folder.
Then follow this:

1. In the "View" menu > Toolbars, untick "Standard Buttons", "Link" and "Address" bars
2. Still in the "View" menu, untick "Status Bar"
3. Still in the "View" menu select "List"

4. And the final touch, resize the window to look a little thinner

If you are a purist you can even do like me and associate a custom icon to this folder so it looks a bit more like an app an meaningful (notice the RDP icon on this desktop).
And you can just drag & drop it to the "Startup" folder so it comes up everytime you restart the computer!
Beautifully simple and efficient, the final result is stunning and is definitely worth this epic blog article ;p

Have fun people and take care!

Microsoft SkyDrive Rocks!

Well, what can I say, 5 GB of free storage offered by Microsoft for free with a very funky web interface and upload tool (even if it is an ActiveX) ?

http://skydrive.live.com/

It would be silly not to make the most of it really...

Thursday, July 05, 2007

Personal review of Visual Studio Orcas beta 1

Hi all,

I know it's been a while, usual stuff really, swamped in a project up to my neck!
Blogging then becomes less of a priority ;)

However let me tell you a few things about the new Microsoft Visual Studio "Orcas" beta 1 release, which I am currently testing on my huge dual core AMD 64 bit, 4 Gb RAM, 500 Gb hard drive, Vista 64 business monster of a development machine.

I have to say, this release looks amazing and is packed with functionality that I have really been looking forward to.

However first impression is : very slow compared to VS 2005 (even on the PC described above). Maybe it's due to all this fancy new intellisense that ships with it, but big pages/controls take longer to be loaded/compiled. Don't even try the design view for complex pages, it's a nightmare... I've just disabled it.

Still, it's very usable and my general view on this new product is very positive indeed.

The good bits:
  • Much better intellisense
  • Great client side script step-by-step debugging!!! (F10 works on client side scripts!!!)
  • LINQ (fantastic)
  • Support for WPF and SilverLight (still have to be convinced by SilverLight I have to say...)
The bad bits:
  • Quite a bit slower than VS 2005 although usable
  • Had a few nasty crashes when "alt-tabbing" between a resource file (as in localization resource file) and a text editor called EditPadLight that I really like.
  • Other miscellaneous crashes, but nothing too bad for a beta release ;)
  • The "Copy website" function is still very bad and could have been improved...
So basically, my initial mark for Visual Studio Orcas beta 1 is: 85%

Will definitely make the move when it's released. Thanks for reading!

Cheers people and take it easy.

PS: You can find the Visual Studio "Orcas" files here:
http://msdn2.microsoft.com/en-gb/vstudio/aa700831.aspx

If you need tips to download the huge image files from the Microsoft website, read Jon Galloway's blog otherwise you can use the MSDN Subscriber downloader as explained on the link above:
http://weblogs.asp.net/jgalloway/archive/2006/09/30/Orcas-VPC-Download-info.aspx

Monday, May 14, 2007

How to get the ASP.NET Commerce Starter Kit 2.0 to run in medium trust !

Hi guys,

I am sure many of you will loooove this article.

IT IS POSSIBLE TO GET THE COMMERCE STARTER KIT TO WORK IN MEDIUM TRUST!!!

You can follow the instructions below, alternatively you can download the C# code from my SkyDrive:



I have been now fighting for a while to get the wonderful ASP.NET Commerce Starter
Kit 2.0 to work on my ISP Shared hosting server.

At first I thought it was a lost battle and started coding the CSK without SubSonic, Entreprise Library or any of this fancy stuff that requires full trust to run properly.

But after battling harder, I noticed a few things that changed my life yesterday and let me share my findings with you all!

Here is how I got there :

1. I added this line in the CSK web.config so it would simulate my hosting service environment on my dev machine :

<trust level="Medium" />


I also prevented SubSonic from using the Entreprise Library data access and to use the more supported SqlDataProvider (not sure this made a difference but I would like to mention it) :

<SubSonicService defaultProvider="ELib2DataProvider">
<providers>
<!--<add name="ELib2DataProvider" type="SubSonic.ELib2DataProvider, SubSonic" connectionStringName="CommerceTemplate"/>-->
<add name="ELib2DataProvider" type="SubSonic.SqlDataProvider, SubSonic" connectionStringName="CommerceTemplate" />
</providers>
</SubSonicService>


2. I updated the ATLAS stuff with the latest from Microsoft (optional):
http://ajax.asp.net/

Notes :

  • With that step more changes to the web.config are required (cf the web.config of the ajax web extensions).
  • Also I moved the ScriptManagers to the master pages (admin and site) and removed them from other pages, that way you always have ajax enabled pages :)
  • There is also an attribute that you need to remove from the ScriptManager or it won't compile.
  • One last thing you also have to replace the "Mode" attribute of all your UpdatePanels and change it to "UpdateMode".
3. In the App_Code\Configuration\SiteConfig.cs change the lines that say:
config.GetSection... to ConfigurationManager.GetSection
And rem out the line that says :

Dim config As System.Configuration.Configuration = WebConfigurationManager.OpenWebConfiguration(HttpContext.Current.Request.ApplicationPath)


This will try to access your web.config file and save it, which is NOT allowed in partial trust.
The only pages that use this to write to the file are the Payment, Shipping and Tax configuration pages in the admin. I have simply disabled the "config.save" (i.e. rem'd it out) in those pages and you just need to go and configure those values manually in the web.config before you publish the code.

4. Next thing is to get rid of the eWorld.UI assembly all together cause it needs full trust to run and to replace the controls used in the CSK by nice new shiny AjaxControlToolkit controls (NumericBox to TextBox and Calendar are the only ones that I found in the project). Best to delete the eWorld.UI.dll from the bin folder and compile to see where we have to make the changes :o)

In order to use the AjaxControlToolkit you must put the AjaxControlToolKit dll in your bin folder and register it in the page :

<%@ Register Assembly="AjaxControlToolkit" Namespace="AjaxControlToolkit" TagPrefix="ajaxToolkit" %>


Then you can replace everywhere it says "ew:NumericBox" by "asp:TextBox" and get rid of the :

<%@ Register Assembly="eWorld.UI" Namespace="eWorld.UI" TagPrefix="ew" %>


Finally for the calendar, replace :

<ew:calendarpopup id="txtExpirationDate" runat="server"></ew:calendarpopup>


By:

<asp:TextBox ID="txtExpirationDate" runat="server"></asp:TextBox>
<ajaxToolkit:CalendarExtender ID="CalendarExtender1" runat="server" TargetControlID="txtExpirationDate" Format="dd/MM/yyyy" />


Another thing, once you have done that some of your code behind files will stop working and you will have to replace the old "PostedDate" or "SelectedDate" of the old calendar controls by the "Text" property of your textbox.

Also everytime you need to set a datetime datafield just do DateTime.Parse(textbox.Text) instead of the old eWorldUIOldTextBox.SelectedDate.

There will also be occurrences of this sort of thing which will not pass the compilation:

calEnd.SelectedDate = DateTime.Today


Just replace it with:

calEnd.Text = String.Format("{0:dd/MM/yyyy}", DateTime.Today)


Or this sort of thing :

calEnd.SelectedDate


Replace it with :

DateTime.Parse(calEnd.Text)


There might be more small code changes that I forgot to document here but I will let you find out by yourself, you've got the general idea!

Once the project compiles locally with those changes and in medium trust (cf step 1) then you can publish it (Build > Publish Website) and compile it to a location on your hard drive. Copy the files to your ISP with the correct DB connection strings and that's it! (I agree it's actually quite a lot!)

If you need the code, drop me a line with your email address and I will send it to you.

I have tried to look at contributing in CodePlex for the CSK but the lack of documentation on how to do that made me loose motivation...

On the other hand, the changes that I have made so far may have other impacts on other functions of the CSK so following my advice is at your own risk, you are responsible for any change you make to the code :o)

From what I have seen so far though, everything works like a charm on a shared hosting server!!!

Good luck and let me know your feedback.

Cheers!

UPDATE 07/01/2008: WHAT TO DO WHEN YOU ARE GETTING THE INFAMOUS
"The SqlParameterCollection only accepts non-null SqlParameter type objects, not QueryParameter objects" ERROR

I received quite a few emails about this as it is a problem when using the CSK code and the solution is here:

You need to edit the OrderController.vb (or .cs) to include this function:


Public Shared Function GetDBCommand(ByVal objSubCom As SubSonic.QueryCommand) As DbCommand

Dim objDbCom As DbCommand
Dim objSqlCon As New SqlConnection(ConfigurationManager.ConnectionStrings("LocalSqlServer").ToString)

objDbCom = objSqlCon.CreateCommand()
objDbCom.CommandText = objSubCom.CommandSql
objDbCom.CommandType = objSubCom.CommandType

Dim par As QueryParameter
Dim objSqlParam As SqlParameter

For Each par In objSubCom.Parameters

objSqlParam = New SqlParameter

objSqlParam.DbType = par.DataType
objSqlParam.ParameterName = par.ParameterName
objSqlParam.Value = par.ParameterValue

objDbCom.Parameters.Add(objSqlParam)
Next

Return objDbCom

End Function


Then replace all the lines that say:


order.GetUpdateCommand(Utility.GetUserName()).ToDbCommand


With this line calling the new function bypassing the subsonic call:


GetDBCommand(order.GetUpdateCommand(Utility.GetUserName()))


The ToDbCommand is the one causing the error and it's a Subsonic function. It is only throwing the error when using the SqlProvider to connect to the DB (from the SubSonic dll). So the new GetDBCommand that I wrote is a workaround that bypasses that function...

Add columns programmatically to a GridView and style the rows

A friend of mine asked me how to programmatically add columns to a GridView and I found this great article which I hope will help some of you too :

http://www.gridviewguy.com/ArticleDetails.aspx?articleID=29

He also asked me how to style the Grids the best possible way and to modify the style of some control in it, maybe just one cell.

As far as the general style is concerned I advise you to use a .skin file in the "Themes" folder of your ASP.NET 2.0 app. In this file the following declaration will map the GridView items to CSS classes :



<asp:GridView SkinID="" runat="server" CellPadding="4" GridLines="Both" CssClass="GridView" Width="100%" BorderColor="#ECECEC" BorderStyle="Solid">
<HeaderStyle CssClass="GridHeader" />
<FooterStyle CssClass="GridFooter" />
<SelectedRowStyle CssClass="GridSelectedRow" />
<AlternatingRowStyle CssClass="GridAlternatingRow" />
<EditRowStyle CssClass="GridEditRow" />
<RowStyle CssClass="GridRow" />
<PagerStyle CssClass="GridPager" />
<EmptyDataRowStyle CssClass="GridEmptyRow" />
</asp:GridView>


In a css file, you can then create the relevant classes like GridHeader, etc.

If you need to modify a row or some element of it when the Grid is being "written" you should do it in the RowDataBound event as follows:



Protected Sub myGridView_RowDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewRowEventArgs) Handles myGridView.RowDataBound()
If e.Row.RowType = DataControlRowType.DataRow Then
Dim objButton As Button
objButton = CType(e.Row.FindControl("cmdButtonInTheRow"), Button)
If IsDBNull(e.Row.DataItem("MyDataFieldValue")) Then
objButton.Enabled = False
ElseIf e.Row.DataItem("MyDataFieldValue") = "SOME_VALUE" Then
objButton.BackColor = System.Drawing.Color.FromName("White")
Else
objButton.BackColor = System.Drawing.Color.FromName("Green")
e.Row.BackColor = System.Drawing.Color.FromName("Red")
e.Row.Cells(3).BackColor = System.Drawing.Color.FromName("Yellow")
e.Row.Cells(4).ForeColor = System.Drawing.Color.FromName("Pink")
End
End If
End If
End Sub


Hope this helps!

Cheers,

Tuesday, April 10, 2007

The coolest shortcut of them all !...

Hi people,

In the shortcut series, I have found the coolest of them all!
The new ALT+TAB in Vista :

Try the "Windows Key" + TAB and tell me what you think...

If you want more here it is

I am really starting to love Vista, the only thing I don't like about it is that I'm going to have to buy 2 more Gb of RAM...

Oh well... progress hey?

Thanks to Microsoft for a cool OS!

Wednesday, March 28, 2007

NetSpell checker works in medium trust environment using AllowPartiallyTrustedCallersAttribute

Hi all,

just a quickie, I have been using this fantastic open source free spell checker and I am very happy with it as it is completely integrated to the FreeTextBox.

It is called NetSpell and in order to download it you must go to this site :
http://www.loresoft.com/Applications/NetSpell/default.aspx

The problem is when you try to make netspell work in a shared hosting environment that will be more secure than your dev webserver and will more than likely run in medium trust.

The only problem is that NetSpell does not by default allow the assembly to run in partial trust and therefore the only way to get it to work is to add :

[assembly: AllowPartiallyTrustedCallersAttribute()]

line to the AssemblyInfo.cs file of the NetSpell.SpellChecker project

Soooooo....

1. I downloaded the code locally to my C: drive,
The full source is available here using the mighty SVN source code manager :
http://sourceforge.net/projects/netspell/

2. Went to the ..\NetSpell\trunk\NetSpell\src\NetSpell.SpellChecker folder,
3. Edited the AssemblyInfo.cs file to include [assembly: AllowPartiallyTrustedCallersAttribute()]
4. Added a reference at the top of the file to using System.Security;
(required for the AllowPartiallyTrustedCallersAttribute element to work)
5. Recompiled the project
6. Copied the new NetSpell.SpellChecker.dll to my web project and...
7. BINGO! everything worked like a charm on my medium trust environment!!!

Hope those who struggled with this will manage to find my post and solve their problem!

Cheers,
Etienne

Friday, March 09, 2007

New tool!

I just had a look at Wengo Visio and it seems to be amazing...
I will try it a bit more and let you know how it works but it looks amazing!

It's like Skype but Flash based and does not require any client install!!!

Let's try it:




Wednesday, February 21, 2007

Subsonic or ActionPack the zero code DAL

Hi all,

something all the lazy programmers out there have been waiting for :

http://www.codeplex.com/actionpack

This is the heaven of dal coding, the only down side is that you need full trust on your web to use its full features (i.e. custom build providers to automatically generate vb or c# classes to access your database structure).

In other words, the people on shared hosting environments, forget it. However if you have a dedicated server, then the world is your oyster and man this tool is great!

No more boring data access code to write, one class per table is generated and allows you to query your data in a very efficient way!

Thanks guys for this... wonder how it's going to compete with LINQ though?

Cheers!

AJAX 1.0 is here and will tranform the web

I am now working closely with Microsoft AJAX extensions v1.0 and I have to say congratulations to them for developing such a cool programming concept.

I am using it everywhere I can and have been able to design things that I have dreamt of years ago without any hassle.

.NET web developers, go there now and watch all the videos, you won't regret it:

http://ajax.asp.net

Happy programming!

Friday, June 09, 2006

www.netploy.com is here!!!

That's it!!!

My last ASP.NET 2.0 project is finally completed. After 6 months of hard work we finally have something up and running and it works like a breeze.

For those of you you can speak French, here is the future of employment:
http://www.netploy.com

For those who can't, an English version is probably going to be out soon. Otherwise, it's always good to learn a new language, especially one as beautiful as French! :)

netploy is a site where you can find work or people who can do a job and make sure that you can work with them remotely with the tools offered :

  • Microsoft SharePoint Services was integrated to the site in Active Directory creation mode as well as host header mode. That basically means that you can create sites with your own URL like "myurl.share.netploy.com"! This provides the freelancer with a "Virtual Desk" accessible from anywhere in the world.
  • On the other hand we also have integrated a fantastic web conferencing tool called GatherPlace and this provides the employer or employee with online meeting facility. Again the url would be the one you have picked (similar to WebOffice) and like "myvirtualconf.meet.netploy.com"
The future is to be able to work from the comfort of your own home!
I have been doing this for the past 6 months and this site is the result, I have never been that productive in my entire life and I am extremely proud of this achievement as I have done it on my own (no development team whatsoever)!

For those of you who are technical, subscribe to www.netploy.com and have a look at the amazing functionalities in place, for those of you who are interested in working from home, enter you CV and wait for the right project!

There is more to come in the near future as we are already looking at improving some functionalities using ATLAS.

Cheers!
Etienne

Wednesday, November 02, 2005

.NET 2.0 Custom Build Providers

Wow this is soooooooo cool I can't believe it!

How would you fancy NOT having to write a DataAccess layer in your apps but instead to get the ASP.NET 2.0 engine to automatically serve the code to you straight from the Database Structure?

If you don't understand the problem, you need to spend a bit more time creating by hand (not allowed to cheat with CodeSmith or other...):

  • Tables
  • Views
  • Stored Procedures
  • .NET Data Access Code that calls everything and performs SELECT, INSERT, UPDATE and DELETE...

Then you will know what I mean especially if your DB has 250 tables, 150 Views and 640 Stored Procedures!!!

I was lucky enough to come across this article from Fritz Onion and I think it is absolutely awesome. Fritz you're a genius man!

http://pluralsight.com/blogs/fritz/archive/2004/09/06/2188.aspx

Using that idea, I have been able to build a code generator that creates my DataAccess layer automatically from the Database, then in my code I only need to reference the relevant object and call methods against them like:

Dim objProfile as Profile

objProfile.ID = "1"

objProfile.Name = "Test Name"

objProfile.Update

How cool is that!!!

Tuesday, August 23, 2005

HtmlInputFile problem uploading large files!

God I have spent nearly 4 days solid trying to work that one out!

Here is the challenge:
Basically there is by a size limit to the file you can upload to a webserver using the good old HtmlInputFile Input. By default this limit is 4Mb and it is set in the machine.config file on the web server:

httpruntime maxrequestlength="8192"

It is of course possible to override this value in your web.config file and make it web app specific.

The problem occurs when you try to upload something bigger than that... you will get a nasty DNS error because the asp.net worker process got its knickers in a twist on the webserver. It basically reached a memory threshold before it could do anything with the file!

A full explanation can be found here:
http://support.microsoft.com/default.aspx?scid=kb;en-us;295626

Anyway the bottom line is that it displays a nasty error to the user and the people I work for don't like that at all.

As a Google group lover I looked for an answer to that one for a lot longer than I originally thought I would have to and finally found this EXCELLENT article by Jesse Chunn:
http://www.standardio.org/article.aspx?id=213

Jesse you're the man! The little code snippet you posted is awesome in simplicity and it works great.

The trick is to use the global.asax file and to test the file contentLength for every single request made to the web server.

I post the code again:

Sub Application_BeginRequest(ByVal sender As Object, ByVal e As EventArgs)

' Fires at the beginning of each request
Dim i As Integer

'this number is in bytes, NOT kilobytes!!
Dim iMaxFileSize As Integer = 8000000
For i = 0 To Request.Files.Count - 1
If Request.Files.Item(i).ContentLength > iMaxFileSize Then
Response.Redirect("FileToBig.aspx?filesize=" & Request.Files.Item(i).ContentLength)
Exit For
End If
Next

End Sub

A massive thank you to you my friend, you're a star in the developer's world!!!