<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://advenet.com/utility/FeedStylesheets/atom.xsl" media="screen"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en"><title type="html">.NET Diary</title><subtitle type="html">Research Projects, Code Snippets, Links</subtitle><id>http://advenet.com/aleph/blog/atom.aspx</id><link rel="alternate" type="text/html" href="http://advenet.com/aleph/blog/default.aspx" /><link rel="self" type="application/atom+xml" href="http://advenet.com/aleph/blog/atom.aspx" /><generator uri="http://communityserver.org" version="2.1.61025.2">Community Server</generator><updated>2006-05-29T21:43:00Z</updated><entry><title>Send mail via SMTP with System.Web.Mail</title><link rel="alternate" type="text/html" href="http://advenet.com/aleph/blog/archive/2006/07/17/90.aspx" /><id>http://advenet.com/aleph/blog/archive/2006/07/17/90.aspx</id><published>2006-07-17T20:06:00Z</published><updated>2006-07-17T20:06:00Z</updated><content type="html">I was looking for a way to send reports from an web application and I found a lot of code on the net, but the new System.Net.Mail from .NET 2.0 doesn't work with Gmail... so I've searched more and found a lot of good stuff on CodeProject. So here it is the class that I write based on those articles, simple and easy. The only problem is that it can’t send attachments. If anywone knows a way to send attachments using Gmail please let me know.

&lt;pre class='coloredcode'&gt;&lt;font size=2&gt;&lt;span class='kwd'&gt;public sealed class&lt;/span&gt; SmtpMailer
{
    &lt;span class='kwd'&gt;private string&lt;/span&gt; senderAddress;
    &lt;span class='kwd'&gt;private string&lt;/span&gt; senderName;
    &lt;span class='kwd'&gt;private string&lt;/span&gt; server;
    &lt;span class='kwd'&gt;private string&lt;/span&gt; userName;
    &lt;span class='kwd'&gt;private string&lt;/span&gt; password;
    &lt;span class='kwd'&gt;private bool&lt;/span&gt; enableAuth;
    &lt;span class='kwd'&gt;private bool&lt;/span&gt; enableSsl;
    &lt;span class='kwd'&gt;private int&lt;/span&gt; port;

    &lt;span class='kwd'&gt;private string&lt;/span&gt; errorMsg;
    &lt;span class='kwd'&gt;public string&lt;/span&gt; ErrorMsg
    {
        &lt;span class='kwd'&gt;get&lt;/span&gt; { &lt;span class='kwd'&gt;return this&lt;/span&gt;.errorMsg; }
    }

    &lt;span class='cmt'&gt;/// &amp;lt;summary&amp;gt;
    /// For public SMTP servers with no authentication
    /// &amp;lt;/summary&amp;gt;&lt;/span&gt;
    &lt;span class='kwd'&gt;public&lt;/span&gt; SmtpMailer(&lt;span class='kwd'&gt;string&lt;/span&gt; senderAddress, &lt;span class='kwd'&gt;string&lt;/span&gt; senderName, &lt;span class='kwd'&gt;string&lt;/span&gt; server)
        : &lt;span class='kwd'&gt;this&lt;/span&gt;(senderAddress, senderName, server, &lt;span class='kwd'&gt;null&lt;/span&gt;, &lt;span class='kwd'&gt;null&lt;/span&gt;, &lt;span class='kwd'&gt;false&lt;/span&gt;, &lt;span class='kwd'&gt;false&lt;/span&gt;, 25)
    { }

    &lt;span class='cmt'&gt;/// &amp;lt;summary&amp;gt;
    /// For secure SMTP servers with authentication and SSL
    /// &amp;lt;/summary&amp;gt;&lt;/span&gt;
    &lt;span class='kwd'&gt;public&lt;/span&gt; SmtpMailer(&lt;span class='kwd'&gt;string&lt;/span&gt; senderAddress, &lt;span class='kwd'&gt;string&lt;/span&gt; senderName, &lt;span class='kwd'&gt;string&lt;/span&gt; server, 
        &lt;span class='kwd'&gt;string&lt;/span&gt; userName, &lt;span class='kwd'&gt;string&lt;/span&gt; password, &lt;span class='kwd'&gt;bool&lt;/span&gt; enableAuth, &lt;span class='kwd'&gt;bool&lt;/span&gt; enableSsl, &lt;span class='kwd'&gt;int&lt;/span&gt; port)
    {
        &lt;span class='kwd'&gt;this&lt;/span&gt;.senderAddress = senderAddress;
        &lt;span class='kwd'&gt;this&lt;/span&gt;.senderName = senderName;
        &lt;span class='kwd'&gt;this&lt;/span&gt;.server = server;
        &lt;span class='kwd'&gt;this&lt;/span&gt;.userName = userName;
        &lt;span class='kwd'&gt;this&lt;/span&gt;.password = password;
        &lt;span class='kwd'&gt;this&lt;/span&gt;.enableAuth = enableAuth;
        &lt;span class='kwd'&gt;this&lt;/span&gt;.enableSsl = enableSsl;
        &lt;span class='kwd'&gt;this&lt;/span&gt;.port = port;
    }

    &lt;span class='kwd'&gt;public bool&lt;/span&gt; Send(&lt;span class='kwd'&gt;string&lt;/span&gt; toAddress, &lt;span class='kwd'&gt;string&lt;/span&gt; subject, &lt;span class='kwd'&gt;string&lt;/span&gt; body, &lt;span class='kwd'&gt;bool&lt;/span&gt; isHtml)
    {
        &lt;span class='kwd'&gt;try&lt;/span&gt;

        {
            MailMessage mailMsg = &lt;span class='kwd'&gt;new&lt;/span&gt; MailMessage();

            mailMsg.To = toAddress;
            mailMsg.Headers.Add(&lt;span class='st'&gt;"From"&lt;/span&gt;, &lt;span class='kwd'&gt;string&lt;/span&gt;.Format(&lt;span class='st'&gt;"{0} &amp;lt;{1}&amp;gt;"&lt;/span&gt;, senderName, senderAddress));
            mailMsg.Fields[&lt;span class='st'&gt;"http://schemas.microsoft.com/cdo/configuration/smtpserver"&lt;/span&gt;] = server;
            mailMsg.Fields[&lt;span class='st'&gt;"http://schemas.microsoft.com/cdo/configuration/smtpserverport"&lt;/span&gt;] = port;
            mailMsg.Fields[&lt;span class='st'&gt;"http://schemas.microsoft.com/cdo/configuration/sendusing"&lt;/span&gt;] = 2;

            &lt;span class='kwd'&gt;if&lt;/span&gt; (enableAuth)
            {
                mailMsg.Fields[&lt;span class='st'&gt;"http://schemas.microsoft.com/cdo/configuration/smtpauthenticate"&lt;/span&gt;] = 1;
                mailMsg.Fields[&lt;span class='st'&gt;"http://schemas.microsoft.com/cdo/configuration/sendusername"&lt;/span&gt;] = userName;
                mailMsg.Fields[&lt;span class='st'&gt;"http://schemas.microsoft.com/cdo/configuration/sendpassword"&lt;/span&gt;] = password;
            }

            &lt;span class='kwd'&gt;if&lt;/span&gt; (enableSsl)
            {
                mailMsg.Fields.Add(&lt;span class='st'&gt;"http://schemas.microsoft.com/cdo/configuration/smtpusessl"&lt;/span&gt;, &lt;span class='st'&gt;"true"&lt;/span&gt;);
            }

            &lt;span class='kwd'&gt;if&lt;/span&gt; (isHtml)
            {
                mailMsg.BodyFormat = MailFormat.Html;
            }

            mailMsg.BodyEncoding = Encoding.UTF8;
            mailMsg.Subject = subject;
            mailMsg.Body = body;

            SmtpMail.SmtpServer = server;
            SmtpMail.Send(mailMsg);

            &lt;span class='kwd'&gt;return true&lt;/span&gt;;
        }
        &lt;span class='kwd'&gt;catch&lt;/span&gt; (Exception ex)
        {
            &lt;span class='kwd'&gt;this&lt;/span&gt;.errorMsg = ex.Message;
            &lt;span class='kwd'&gt;return false&lt;/span&gt;;
        }
    }
}&lt;/font&gt;&lt;/pre&gt;&lt;img src="http://advenet.com/aggbug.aspx?PostID=90" width="1" height="1"&gt;</content><author><name>Aleph</name><uri>http://advenet.com/Aleph/Default.aspx</uri></author><category term="C#.NET 2.0" scheme="http://advenet.com/aleph/blog/archive/tags/C_23002E00_NET+2.0/default.aspx" /><category term="ASP.NET 2.0" scheme="http://advenet.com/aleph/blog/archive/tags/ASP.NET+2.0/default.aspx" /></entry><entry><title>Code access protection using Evidence</title><link rel="alternate" type="text/html" href="http://advenet.com/aleph/blog/archive/2006/06/21/84.aspx" /><id>http://advenet.com/aleph/blog/archive/2006/06/21/84.aspx</id><published>2006-06-21T16:18:00Z</published><updated>2006-06-21T16:18:00Z</updated><content type="html">If you work with multiple assemblies and you want to make sure no one uses your code by calling methods from other applications you can use strong names, first you have to sign with your private key all your components and application that you deploy to the client. If you want your code to be safe obfuscation is required too. So lets suppose I have an assembly that is validating the product serial number at installation time and I want only my application to able to instantiate it. This is the piece of code I must put in the constructor:

&lt;pre class='coloredcode'&gt;&lt;font size=3&gt;&lt;span class='kwd'&gt;public class&lt;/span&gt; Activator
{
    &lt;span class='kwd'&gt;public&lt;/span&gt; Activator()
    {
        Assembly callerAsm = Assembly.GetCallingAssembly();
        StrongName callerSn = GetStrongName(callerAsm.Evidence);

        Assembly thisAsm = Assembly.GetExecutingAssembly();
        StrongName thisSn = GetStrongName(thisAsm.Evidence);

        &lt;span class='kwd'&gt;if&lt;/span&gt; (callerSn == &lt;span class='kwd'&gt;null&lt;/span&gt; || thisSn == &lt;span class='kwd'&gt;null&lt;/span&gt; || callerSn.PublicKey.ToString() != thisSn.PublicKey.ToString())
        {
            &lt;span class='kwd'&gt;throw new&lt;/span&gt; SecurityException(&lt;span class='st'&gt;"Unauthorized execution detected, caller assemby unknown."&lt;/span&gt;);
        }
    }

    &lt;span class='kwd'&gt;private static&lt;/span&gt; StrongName GetStrongName(Evidence evidence)
    {
        &lt;span class='kwd'&gt;foreach&lt;/span&gt; (&lt;span class='kwd'&gt;object&lt;/span&gt; o &lt;span class='kwd'&gt;in&lt;/span&gt; evidence)
        {
            &lt;span class='kwd'&gt;if&lt;/span&gt; (o &lt;span class='kwd'&gt;is&lt;/span&gt; StrongName)
            {
                &lt;span class='kwd'&gt;return&lt;/span&gt; o &lt;span class='kwd'&gt;as&lt;/span&gt; StrongName;
            }
        }
        &lt;span class='kwd'&gt;return null&lt;/span&gt;;
    }

    &lt;span class='cmt'&gt;//protected methods &lt;/span&gt;

}&lt;/font&gt;&lt;/pre&gt;

So when I call Activator a = new Activator(); if my app is not signed with the same strong name as the Activator.dll the security exception will pop up.&lt;img src="http://advenet.com/aggbug.aspx?PostID=84" width="1" height="1"&gt;</content><author><name>Aleph</name><uri>http://advenet.com/Aleph/Default.aspx</uri></author><category term="C#.NET 2.0" scheme="http://advenet.com/aleph/blog/archive/tags/C_23002E00_NET+2.0/default.aspx" /></entry><entry><title>[AlephFS] File checksum using Adler32</title><link rel="alternate" type="text/html" href="http://advenet.com/aleph/blog/archive/2006/06/05/81.aspx" /><id>http://advenet.com/aleph/blog/archive/2006/06/05/81.aspx</id><published>2006-06-05T19:29:00Z</published><updated>2006-06-05T19:29:00Z</updated><content type="html">Like the &lt;a href="http://www.dotnetmonster.com/CS/blogs/aleph/archive/2006/05/30/71.aspx"&gt;hash provider&lt;/a&gt; I need a function that will check for the integrity of the files managed by the web service. But CRC, MD5 and other checksum algorithms eat up a lot of CPU time and memory. &lt;br /&gt;For my checksum function I've decided to use the &lt;a href="http://www.dotnetmonster.com/CS/blogs/aleph/articles/79.aspx"&gt;Adler32 algorithm&lt;/a&gt;.The method that I am posting here works with any file size, as a remark, if you have a lot of memory on the server where you are doing checksums, make the buffer as big as you can, it will move faster but will eat more resources.

    &lt;pre class='coloredcode'&gt;&lt;font size=3&gt;&lt;span class='kwd'&gt;public static long&lt;/span&gt; Adler32Checksum(&lt;span class='kwd'&gt;string&lt;/span&gt; filePath, &lt;span class='kwd'&gt;int&lt;/span&gt; bufferLenght)
{
    &lt;span class='kwd'&gt;long&lt;/span&gt; output = 0;
    &lt;span class='kwd'&gt;int&lt;/span&gt; read = 0;

    Adler32 alder = &lt;span class='kwd'&gt;new&lt;/span&gt; Adler32();

    &lt;span class='kwd'&gt;byte&lt;/span&gt;[] buffer = &lt;span class='kwd'&gt;new byte&lt;/span&gt;[bufferLenght];
    &lt;span class='kwd'&gt;if&lt;/span&gt; (File.Exists(filePath))
    {
        &lt;span class='kwd'&gt;using&lt;/span&gt; (FileStream fs = File.Open(filePath, FileMode.Open, FileAccess.Read, FileShare.Read))
        {
            &lt;span class='kwd'&gt;while&lt;/span&gt; ((read = fs.Read(buffer, 0, bufferLenght)) &gt; 0)
            {
                alder.Update(buffer, 0, read);
            }
        }
    }
    output = alder.Value;
    &lt;span class='kwd'&gt;return&lt;/span&gt; output;
}&lt;/font&gt;&lt;/pre&gt;&lt;img src="http://advenet.com/aggbug.aspx?PostID=81" width="1" height="1"&gt;</content><author><name>Aleph</name><uri>http://advenet.com/Aleph/Default.aspx</uri></author><category term="C#.NET 2.0" scheme="http://advenet.com/aleph/blog/archive/tags/C_23002E00_NET+2.0/default.aspx" /><category term="ASP.NET 2.0" scheme="http://advenet.com/aleph/blog/archive/tags/ASP.NET+2.0/default.aspx" /></entry><entry><title>[AlephFS] Custom Soap Header Authentication</title><link rel="alternate" type="text/html" href="http://advenet.com/aleph/blog/archive/2006/05/31/76.aspx" /><id>http://advenet.com/aleph/blog/archive/2006/05/31/76.aspx</id><published>2006-05-31T10:03:00Z</published><updated>2006-05-31T10:03:00Z</updated><content type="html">&lt;p&gt;If you are looking at &lt;a href="http://www.dotnetmonster.com/CS/blogs/aleph/archive/2006/05/30/72.aspx"&gt;IFileServer&lt;/a&gt; interface you will notice that I use two types of security in AlephFS web service. The custom authentication is used when you don’t want to relay on the windows security like active directory. This scenario will need a user database or an XML file that the service can use to make decision based on the user role or group. 
For this scenario I created a &lt;a href="http://msdn2.microsoft.com/en-us/library/system.web.services.protocols.soapheader_members.aspx" target="_blank"&gt;SoapHeader&lt;/a&gt; that looks like this:&lt;/p&gt;
&lt;pre class='coloredcode'&gt;&lt;font size=3&gt;&lt;span class='kwd'&gt;using&lt;/span&gt; System.Web.Services.Protocols;

&lt;span class='cmt'&gt;/// &amp;lt;summary&amp;gt;
/// Authentication Custom Soap Header
/// &amp;lt;/summary&amp;gt;&lt;/span&gt;
&lt;span class='kwd'&gt;public class&lt;/span&gt; AuthHeader : SoapHeader
{
    &lt;span class='kwd'&gt;public string&lt;/span&gt; UserName;
    &lt;span class='kwd'&gt;public string&lt;/span&gt; Password;
}&lt;/font&gt;&lt;/pre&gt;
&lt;p&gt;
The clients that access the web service must use the custom header for authentication every time a method is called. In the web service the methods that use custom security must use the soap header. Here is an example: 
&lt;/p&gt;
&lt;pre class='coloredcode'&gt;&lt;font size=3&gt;&lt;span class='kwd'&gt;public class&lt;/span&gt; Service : WebService, IFileServer
{
    &lt;span class='kwd'&gt;public&lt;/span&gt; AuthHeader Credentials;
	
[WebMethod, SoapHeader(&lt;span class='st'&gt;"Credentials"&lt;/span&gt;, Direction=SoapHeaderDirection.In)]
    &lt;span class='kwd'&gt;public void&lt;/span&gt; CreateDir(&lt;span class='kwd'&gt;string&lt;/span&gt; dirName)
    {
        ValidateUser(Credentials);
        &lt;span class='kwd'&gt;try&lt;/span&gt;
        {
            Directory.CreateDirectory(dirName);
        }
        &lt;span class='kwd'&gt;catch&lt;/span&gt; (IOException iox)
        {
		&lt;span class='cmt'&gt;//log error&lt;/span&gt;
        }
    }
}&lt;/font&gt;&lt;/pre&gt;
&lt;p&gt;Every time a method is called we must make sure that the client is authorized. To validate the client credential before executing the body of the method we must call ValidateUser.Inside ValidateUser method we can connect to the database for user name and password validation, maybe get the rolls of the user and so on.
&lt;/p&gt;
&lt;pre class='coloredcode'&gt;&lt;font size=3&gt;&lt;span class='kwd'&gt;private void&lt;/span&gt; ValidateUser(AuthHeader Credentials)
{
	&lt;span class='kwd'&gt;if&lt;/span&gt; (Credentials.UserName.Length &amp;lt; 1 ||
		Credentials.Password.Length &amp;lt; 1)
	{
		&lt;span class='kwd'&gt;throw new&lt;/span&gt; SoapException(&lt;span class='st'&gt;"Unauthorized"&lt;/span&gt;, SoapException.ClientFaultCode);
	}
	&lt;span class='kwd'&gt;try&lt;/span&gt;
	{
		&lt;span class='cmt'&gt;//TODO: Validate user &amp;amp; pass using database or xml&lt;/span&gt;
		&lt;span class='kwd'&gt;if&lt;/span&gt; (Credentials.Password != &lt;span class='st'&gt;"password"&lt;/span&gt;)
		{
			&lt;span class='kwd'&gt;throw new&lt;/span&gt; SoapException(&lt;span class='st'&gt;"Unauthorized"&lt;/span&gt;, SoapException.ClientFaultCode);
		}
	}
	&lt;span class='kwd'&gt;catch&lt;/span&gt;
	{
		&lt;span class='kwd'&gt;throw new&lt;/span&gt; SoapException(&lt;span class='st'&gt;"Unauthorized"&lt;/span&gt;, SoapException.ClientFaultCode);
	}
}&lt;/font&gt;&lt;/pre&gt;
&lt;p&gt;
Now that we have implemented the custom authentication on the web server side let’s see how the client can communicate with AlephFS. I am using for testing a windows application. Here comes the client code:
&lt;/p&gt;
&lt;pre class='coloredcode'&gt;&lt;font size=3&gt;&lt;span class='kwd'&gt;private void&lt;/span&gt; CallWs()
{
	&lt;span class='cmt'&gt;//proxy&lt;/span&gt;
	AlephFS.AlephFileServerWse ws;
	ws = &lt;span class='kwd'&gt;new&lt;/span&gt; Client.AlephFS.AlephFileServerWse();

	&lt;span class='cmt'&gt;//custom header&lt;/span&gt;
	AlephFS.AuthHeader authHeader = &lt;span class='kwd'&gt;new&lt;/span&gt; Client.AlephFS.AuthHeader();
	authHeader.UserName = &lt;span class='st'&gt;"user_name"&lt;/span&gt;;
	authHeader.Password = &lt;span class='st'&gt;"password"&lt;/span&gt;;
	ws.AuthHeaderValue = authHeader;

	&lt;span class='cmt'&gt;//call method&lt;/span&gt;
	&lt;span class='kwd'&gt;try&lt;/span&gt;
	{
		ws.CreateDir(&lt;span class='st'&gt;"MyDocs"&lt;/span&gt;);
	}
	&lt;span class='kwd'&gt;catch&lt;/span&gt; (SoapException ex)
	{
		&lt;span class='cmt'&gt;//log error&lt;/span&gt;
	}
}&lt;/font&gt;&lt;/pre&gt;&lt;img src="http://advenet.com/aggbug.aspx?PostID=76" width="1" height="1"&gt;</content><author><name>Aleph</name><uri>http://advenet.com/Aleph/Default.aspx</uri></author><category term="ASP.NET 2.0" scheme="http://advenet.com/aleph/blog/archive/tags/ASP.NET+2.0/default.aspx" /></entry><entry><title>[AlephFS] Research Project</title><link rel="alternate" type="text/html" href="http://advenet.com/aleph/blog/archive/2006/05/30/72.aspx" /><id>http://advenet.com/aleph/blog/archive/2006/05/30/72.aspx</id><published>2006-05-30T13:43:00Z</published><updated>2006-05-30T13:43:00Z</updated><content type="html">&lt;p&gt;&lt;strong&gt;Project Name&lt;/strong&gt;: AlephFS&lt;br /&gt;
  &lt;strong&gt;Start Date:&lt;/strong&gt; 08 May 2006&lt;br /&gt;
  &lt;strong&gt;Technologies used:&lt;/strong&gt; ASP.NET 2.0 &amp; WSE 3.0 &amp; MTOM&lt;/p&gt;
&lt;p&gt;
  I've stated a new research project based on &lt;a href="http://msdn.microsoft.com/webservices/webservices/building/wse/default.aspx?pull=/library/en-us/dnwse/html/newwse3.asp" title="WSE 3.0" target="_blank"&gt;Web Services Enhancements Version 3.0&lt;/a&gt;. The goal is to make a FTP server like application but on Soap. I have tried this before on the Net Framework 1.1 using DIME Attachments.&lt;br /&gt;
  The problem was that Dime could not be used with WS-* because the binary content of the message was sent outside the SoapEnvelope of the XML message. Even if the message is secure the binary attachment is not.WSE 3.0 comes with MTOM (&lt;a href="http://www.w3.org/TR/soap12-mtom/" title="MTOM" target="_blank"&gt;Message Transmission Optimization Mechanism&lt;/a&gt;), MTOM fully complies with WS-Security so the entire message is secure.&lt;br /&gt;As long as the project will go on I will post here code that maybe you'll find useful.&lt;br /&gt;The web service is based on the IFileServer interface but this is just the start point.
&lt;/p&gt;
    &lt;pre class='coloredcode'&gt;&lt;font size=3&gt;&lt;span class='cmt'&gt;/// &amp;lt;summary&amp;gt;
/// File Server Interface
/// &amp;lt;/summary&amp;gt;&lt;/span&gt;
&lt;span class='kwd'&gt;public interface&lt;/span&gt; IFileServer
{
    &lt;span class='cmt'&gt;//
    //CUSTOM SECURITY
    //

    /// &amp;lt;summary&amp;gt;
    /// Create a new directory
    /// &amp;lt;/summary&amp;gt;
    /// &amp;lt;param name=&amp;quot;dirName&amp;quot;&amp;gt;Folder name&amp;lt;/param&amp;gt;&lt;/span&gt;
    &lt;span class='kwd'&gt;void&lt;/span&gt; CreateDir(&lt;span class='kwd'&gt;string&lt;/span&gt; dirName);
    &lt;span class='cmt'&gt;/// &amp;lt;summary&amp;gt;
    /// Returns the folders within the directory(first level not recursive)
    /// &amp;lt;/summary&amp;gt;
    /// &amp;lt;param name=&amp;quot;dirName&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;
    /// &amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;
    StringCollection ListDirs(&lt;span class='kwd'&gt;string&lt;/span&gt; dirName);
    &lt;span class='cmt'&gt;/// &amp;lt;summary&amp;gt;
    /// Delete an existing directory and all the content inside it
    /// &amp;lt;/summary&amp;gt;
    /// &amp;lt;param name=&amp;quot;dirName&amp;quot;&amp;gt;Folder name&amp;lt;/param&amp;gt;&lt;/span&gt;
    &lt;span class='kwd'&gt;void&lt;/span&gt; DeleteDir(&lt;span class='kwd'&gt;string&lt;/span&gt; dirName);
    &lt;span class='cmt'&gt;/// &amp;lt;summary&amp;gt;
    /// Returns the files within the directory(first level not recursive)
    /// &amp;lt;/summary&amp;gt;
    /// &amp;lt;param name=&amp;quot;dirName&amp;quot;&amp;gt;Folder name&amp;lt;/param&amp;gt;
    /// &amp;lt;returns&amp;gt;files list&amp;lt;/returns&amp;gt;&lt;/span&gt;
    StringCollection ListFiles(&lt;span class='kwd'&gt;string&lt;/span&gt; dirName);
    &lt;span class='cmt'&gt;/// &amp;lt;summary&amp;gt;
    /// Returns the files within the directory(recursive)
    /// &amp;lt;/summary&amp;gt;
    /// &amp;lt;param name=&amp;quot;dirName&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;
    /// &amp;lt;returns&amp;gt;files list&amp;lt;/returns&amp;gt;&lt;/span&gt;
    StringCollection ListFilesRecursive(&lt;span class='kwd'&gt;string&lt;/span&gt; dirName);
    &lt;span class='cmt'&gt;/// &amp;lt;summary&amp;gt;
    /// Uploads file to specific directory
    /// &amp;lt;/summary&amp;gt;
    /// &amp;lt;param name=&amp;quot;path&amp;quot;&amp;gt;destination folder&amp;lt;/param&amp;gt;
    /// &amp;lt;param name=&amp;quot;fileName&amp;quot;&amp;gt; file name&amp;lt;/param&amp;gt;&lt;/span&gt;
    &lt;span class='kwd'&gt;void&lt;/span&gt; UploadFile(&lt;span class='kwd'&gt;string&lt;/span&gt; path, &lt;span class='kwd'&gt;string&lt;/span&gt; fileName, &lt;span class='kwd'&gt;byte&lt;/span&gt;[] data);
    &lt;span class='cmt'&gt;/// &amp;lt;summary&amp;gt;
    /// Downloads file from server
    /// &amp;lt;/summary&amp;gt;
    /// &amp;lt;param name=&amp;quot;path&amp;quot;&amp;gt;server relative path to file&amp;lt;/param&amp;gt;
    /// &amp;lt;returns&amp;gt;binary data&amp;lt;/returns&amp;gt;&lt;/span&gt;
    &lt;span class='kwd'&gt;byte&lt;/span&gt;[] DownloadFile(&lt;span class='kwd'&gt;string&lt;/span&gt; path);
    &lt;span class='cmt'&gt;/// &amp;lt;summary&amp;gt;
    /// Deletes a specific file from the server
    /// &amp;lt;/summary&amp;gt;
    /// &amp;lt;param name=&amp;quot;path&amp;quot;&amp;gt;server relative path to file&amp;lt;/param&amp;gt;&lt;/span&gt;
    &lt;span class='kwd'&gt;void&lt;/span&gt; DeleteFile(&lt;span class='kwd'&gt;string&lt;/span&gt; path);

    &lt;span class='cmt'&gt;//
    //WINDOWS IMPERSONATION
    //

    /// &amp;lt;summary&amp;gt;
    /// Create a new directory
    /// &amp;lt;/summary&amp;gt;
    /// &amp;lt;param name=&amp;quot;dirName&amp;quot;&amp;gt;Folder name&amp;lt;/param&amp;gt;&lt;/span&gt;
    &lt;span class='kwd'&gt;void&lt;/span&gt; CreateDirImp(&lt;span class='kwd'&gt;string&lt;/span&gt; user, &lt;span class='kwd'&gt;string&lt;/span&gt; domain, &lt;span class='kwd'&gt;string&lt;/span&gt; password, &lt;span class='kwd'&gt;string&lt;/span&gt; dirName);
    &lt;span class='cmt'&gt;/// &amp;lt;summary&amp;gt;
    /// Returns the folders within the directory(first level not recursive)
    /// &amp;lt;/summary&amp;gt;
    /// &amp;lt;param name=&amp;quot;dirName&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;
    /// &amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;
    StringCollection ListDirsImp(&lt;span class='kwd'&gt;string&lt;/span&gt; user, &lt;span class='kwd'&gt;string&lt;/span&gt; domain, &lt;span class='kwd'&gt;string&lt;/span&gt; password, &lt;span class='kwd'&gt;string&lt;/span&gt; dirName);
    &lt;span class='cmt'&gt;/// &amp;lt;summary&amp;gt;
    /// Delete an existing directory and all the content inside it
    /// &amp;lt;/summary&amp;gt;
    /// &amp;lt;param name=&amp;quot;dirName&amp;quot;&amp;gt;Folder name&amp;lt;/param&amp;gt;&lt;/span&gt;
    &lt;span class='kwd'&gt;void&lt;/span&gt; DeleteDirImp(&lt;span class='kwd'&gt;string&lt;/span&gt; user, &lt;span class='kwd'&gt;string&lt;/span&gt; domain, &lt;span class='kwd'&gt;string&lt;/span&gt; password, &lt;span class='kwd'&gt;string&lt;/span&gt; dirName);
    &lt;span class='cmt'&gt;/// &amp;lt;summary&amp;gt;
    /// Returns the files within the directory(first level not recursive)
    /// &amp;lt;/summary&amp;gt;
    /// &amp;lt;param name=&amp;quot;dirName&amp;quot;&amp;gt;Folder name&amp;lt;/param&amp;gt;
    /// &amp;lt;returns&amp;gt;files list&amp;lt;/returns&amp;gt;&lt;/span&gt;
    StringCollection ListFilesImp(&lt;span class='kwd'&gt;string&lt;/span&gt; user, &lt;span class='kwd'&gt;string&lt;/span&gt; domain, &lt;span class='kwd'&gt;string&lt;/span&gt; password, &lt;span class='kwd'&gt;string&lt;/span&gt; dirName);
    &lt;span class='cmt'&gt;/// &amp;lt;summary&amp;gt;
    /// Returns the files within the directory(recursive)
    /// &amp;lt;/summary&amp;gt;
    /// &amp;lt;param name=&amp;quot;dirName&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;
    /// &amp;lt;returns&amp;gt;files list&amp;lt;/returns&amp;gt;&lt;/span&gt;
    StringCollection ListFilesRecursiveImp(&lt;span class='kwd'&gt;string&lt;/span&gt; user, &lt;span class='kwd'&gt;string&lt;/span&gt; domain, &lt;span class='kwd'&gt;string&lt;/span&gt; password, &lt;span class='kwd'&gt;string&lt;/span&gt; dirName);
    &lt;span class='cmt'&gt;/// &amp;lt;summary&amp;gt;
    /// Uploads file to specific directory
    /// &amp;lt;/summary&amp;gt;
    /// &amp;lt;param name=&amp;quot;path&amp;quot;&amp;gt;destination folder&amp;lt;/param&amp;gt;
    /// &amp;lt;param name=&amp;quot;fileName&amp;quot;&amp;gt; file name&amp;lt;/param&amp;gt;&lt;/span&gt;
    &lt;span class='kwd'&gt;void&lt;/span&gt; UploadFileImp(&lt;span class='kwd'&gt;string&lt;/span&gt; user, &lt;span class='kwd'&gt;string&lt;/span&gt; domain, &lt;span class='kwd'&gt;string&lt;/span&gt; password, &lt;span class='kwd'&gt;string&lt;/span&gt; path, &lt;span class='kwd'&gt;string&lt;/span&gt; fileName, &lt;span class='kwd'&gt;byte&lt;/span&gt;[] data);
    &lt;span class='cmt'&gt;/// &amp;lt;summary&amp;gt;
    /// Downloads file from server
    /// &amp;lt;/summary&amp;gt;
    /// &amp;lt;param name=&amp;quot;path&amp;quot;&amp;gt;server relative path to file&amp;lt;/param&amp;gt;
    /// &amp;lt;returns&amp;gt;binary data&amp;lt;/returns&amp;gt;&lt;/span&gt;
    &lt;span class='kwd'&gt;byte&lt;/span&gt;[] DownloadFileImp(&lt;span class='kwd'&gt;string&lt;/span&gt; user, &lt;span class='kwd'&gt;string&lt;/span&gt; domain, &lt;span class='kwd'&gt;string&lt;/span&gt; password, &lt;span class='kwd'&gt;string&lt;/span&gt; path);
    &lt;span class='cmt'&gt;/// &amp;lt;summary&amp;gt;
    /// Deletes a specific file from the server
    /// &amp;lt;/summary&amp;gt;
    /// &amp;lt;param name=&amp;quot;path&amp;quot;&amp;gt;server relative path to file&amp;lt;/param&amp;gt;&lt;/span&gt;
    &lt;span class='kwd'&gt;void&lt;/span&gt; DeleteFileImp(&lt;span class='kwd'&gt;string&lt;/span&gt; user, &lt;span class='kwd'&gt;string&lt;/span&gt; domain, &lt;span class='kwd'&gt;string&lt;/span&gt; password, &lt;span class='kwd'&gt;string&lt;/span&gt; path);
}&lt;/font&gt;&lt;/pre&gt;&lt;img src="http://advenet.com/aggbug.aspx?PostID=72" width="1" height="1"&gt;</content><author><name>Aleph</name><uri>http://advenet.com/Aleph/Default.aspx</uri></author><category term="ASP.NET 2.0" scheme="http://advenet.com/aleph/blog/archive/tags/ASP.NET+2.0/default.aspx" /></entry><entry><title>Hash Provider</title><link rel="alternate" type="text/html" href="http://advenet.com/aleph/blog/archive/2006/05/30/71.aspx" /><id>http://advenet.com/aleph/blog/archive/2006/05/30/71.aspx</id><published>2006-05-30T09:50:00Z</published><updated>2006-05-30T09:50:00Z</updated><content type="html">When dealing with message into an application, and the message that you are receiving or sending is over a not trusted channel you should think about a way to make sure that the message has not been altered. This is why cryptographic hash functions are used.&lt;br /&gt;
More on cryptographic hash function you can find &lt;a href="http://en.wikipedia.org/wiki/Cryptographic_hash_function"&gt;here&lt;/a&gt;.&lt;br /&gt;
Here is a function in C# that can generate for you the hash of a string based on your favorite algorithm.&lt;br /&gt;

&lt;pre class='coloredcode'&gt;&lt;font size=3&gt;
&lt;span class='kwd'&gt;using&lt;/span&gt; System;
&lt;span class='kwd'&gt;using&lt;/span&gt; System.Text;
&lt;span class='kwd'&gt;using&lt;/span&gt; System.Security.Cryptography;

&lt;span class='cmt'&gt;/// &amp;lt;summary&amp;gt;
/// Hash algorithms
/// &amp;lt;/summary&amp;gt;&lt;/span&gt;
&lt;span class='kwd'&gt;public enum&lt;/span&gt; HashType : &lt;span class='kwd'&gt;int&lt;/span&gt;
{
    SHA1,
    SHA256,
    SHA384,
    SHA512,
    MD5,
    RIPEMD160
}

&lt;span class='kwd'&gt;public static class&lt;/span&gt; Hash
{
    &lt;span class='kwd'&gt;public static string&lt;/span&gt; FromString(&lt;span class='kwd'&gt;string&lt;/span&gt; input, HashType hashtype)
    {
        Byte[] clearBytes;
        Byte[] hashedBytes;
        &lt;span class='kwd'&gt;string&lt;/span&gt; output = String.Empty;

        &lt;span class='kwd'&gt;switch&lt;/span&gt; (hashtype)
        {
            &lt;span class='kwd'&gt;case&lt;/span&gt; HashType.RIPEMD160:
                clearBytes = &lt;span class='kwd'&gt;new&lt;/span&gt; UTF8Encoding().GetBytes(input);
                RIPEMD160 myRIPEMD160 = RIPEMD160Managed.Create();
                hashedBytes = myRIPEMD160.ComputeHash(clearBytes);
                output = BitConverter.ToString(hashedBytes).Replace(&lt;span class='st'&gt;"-"&lt;/span&gt;, &lt;span class='st'&gt;""&lt;/span&gt;).ToLower();
                &lt;span class='kwd'&gt;break&lt;/span&gt;;
            &lt;span class='kwd'&gt;case&lt;/span&gt; HashType.MD5:
                clearBytes = &lt;span class='kwd'&gt;new&lt;/span&gt; UTF8Encoding().GetBytes(input);
                hashedBytes = ((HashAlgorithm)CryptoConfig.CreateFromName(&lt;span class='st'&gt;"MD5"&lt;/span&gt;)).ComputeHash(clearBytes);
                output = BitConverter.ToString(hashedBytes).Replace(&lt;span class='st'&gt;"-"&lt;/span&gt;, &lt;span class='st'&gt;""&lt;/span&gt;).ToLower();
                &lt;span class='kwd'&gt;break&lt;/span&gt;;
            &lt;span class='kwd'&gt;case&lt;/span&gt; HashType.SHA1:
                clearBytes = Encoding.UTF8.GetBytes(input);
                SHA1CryptoServiceProvider sha1 = &lt;span class='kwd'&gt;new&lt;/span&gt; SHA1CryptoServiceProvider();
                sha1.ComputeHash(clearBytes);
                hashedBytes = sha1.Hash;
                sha1.Clear();
                output = BitConverter.ToString(hashedBytes).Replace(&lt;span class='st'&gt;"-"&lt;/span&gt;, &lt;span class='st'&gt;""&lt;/span&gt;).ToLower();
                &lt;span class='kwd'&gt;break&lt;/span&gt;;
            &lt;span class='kwd'&gt;case&lt;/span&gt; HashType.SHA256:
                clearBytes = Encoding.UTF8.GetBytes(input);
                SHA256 sha256 = &lt;span class='kwd'&gt;new&lt;/span&gt; SHA256Managed();
                sha256.ComputeHash(clearBytes);
                hashedBytes = sha256.Hash;
                sha256.Clear();
                output = BitConverter.ToString(hashedBytes).Replace(&lt;span class='st'&gt;"-"&lt;/span&gt;, &lt;span class='st'&gt;""&lt;/span&gt;).ToLower();
                &lt;span class='kwd'&gt;break&lt;/span&gt;;
            &lt;span class='kwd'&gt;case&lt;/span&gt; HashType.SHA384:
                clearBytes = Encoding.UTF8.GetBytes(input);
                SHA384 sha384 = &lt;span class='kwd'&gt;new&lt;/span&gt; SHA384Managed();
                sha384.ComputeHash(clearBytes);
                hashedBytes = sha384.Hash;
                sha384.Clear();
                output = BitConverter.ToString(hashedBytes).Replace(&lt;span class='st'&gt;"-"&lt;/span&gt;, &lt;span class='st'&gt;""&lt;/span&gt;).ToLower();
                &lt;span class='kwd'&gt;break&lt;/span&gt;;
            &lt;span class='kwd'&gt;case&lt;/span&gt; HashType.SHA512:
                clearBytes = Encoding.UTF8.GetBytes(input);
                SHA512 sha512 = &lt;span class='kwd'&gt;new&lt;/span&gt; SHA512Managed();
                sha512.ComputeHash(clearBytes);
                hashedBytes = sha512.Hash;
                sha512.Clear();
                output = BitConverter.ToString(hashedBytes).Replace(&lt;span class='st'&gt;"-"&lt;/span&gt;, &lt;span class='st'&gt;""&lt;/span&gt;).ToLower();
                &lt;span class='kwd'&gt;break&lt;/span&gt;;
        }
        &lt;span class='kwd'&gt;return&lt;/span&gt; output;
    }
}&lt;/font&gt;&lt;/pre&gt;&lt;img src="http://advenet.com/aggbug.aspx?PostID=71" width="1" height="1"&gt;</content><author><name>Aleph</name><uri>http://advenet.com/Aleph/Default.aspx</uri></author><category term="C#.NET 2.0" scheme="http://advenet.com/aleph/blog/archive/tags/C_23002E00_NET+2.0/default.aspx" /></entry><entry><title>IIS v6 Manager Class</title><link rel="alternate" type="text/html" href="http://advenet.com/aleph/blog/archive/2006/05/29/69.aspx" /><id>http://advenet.com/aleph/blog/archive/2006/05/29/69.aspx</id><published>2006-05-29T18:43:00Z</published><updated>2006-05-29T18:43:00Z</updated><content type="html">Handy class if you plan to create sites from your .net application. There are xml comments on it, so if you need more details on how to use it let me know, I'll give you an example.&lt;br /&gt;
Here comes the code :)

&lt;pre class='coloredcode'&gt;&lt;font size=3&gt;&lt;span class='kwd'&gt;using&lt;/span&gt; System;
&lt;span class='kwd'&gt;using&lt;/span&gt; System.DirectoryServices;
&lt;span class='kwd'&gt;using&lt;/span&gt; System.ServiceProcess;

&lt;span class='cmt'&gt;/// &amp;lt;summary&amp;gt;
/// IIS Services Schema
/// &amp;lt;/summary&amp;gt;&lt;/span&gt;
&lt;span class='kwd'&gt;public enum&lt;/span&gt; Schema : &lt;span class='kwd'&gt;int&lt;/span&gt;
{
	&lt;span class='cmt'&gt;/// &amp;lt;summary&amp;gt;MSFTPSVC&amp;lt;/summary&amp;gt;&lt;/span&gt;
	FTP = 1,
	&lt;span class='cmt'&gt;/// &amp;lt;summary&amp;gt;W3SVC&amp;lt;/summary&amp;gt;&lt;/span&gt;

	WEB = 2
}
&lt;span class='cmt'&gt;/// &amp;lt;summary&amp;gt;
/// IIS Virtual Directory manager
/// &amp;lt;/summary&amp;gt;&lt;/span&gt;
&lt;span class='kwd'&gt;public class&lt;/span&gt; IISManager
{
    &lt;span class='kwd'&gt;private static string&lt;/span&gt; ftpSchema = &lt;span class='st'&gt;"IIsFtpVirtualDir"&lt;/span&gt;;
    &lt;span class='kwd'&gt;private static string&lt;/span&gt; ftpRoot = &lt;span class='st'&gt;"/MSFTPSVC/"&lt;/span&gt;;
    &lt;span class='kwd'&gt;private static string&lt;/span&gt; webSchema = &lt;span class='st'&gt;"IIsWebVirtualDir"&lt;/span&gt;;
    &lt;span class='kwd'&gt;private static string&lt;/span&gt; webRoot = &lt;span class='st'&gt;"/W3SVC/"&lt;/span&gt;;
    &lt;span class='kwd'&gt;private int&lt;/span&gt; serverId = 1;
    &lt;span class='kwd'&gt;private string&lt;/span&gt; serverName = &lt;span class='st'&gt;"localhost"&lt;/span&gt;;
    &lt;span class='kwd'&gt;private string&lt;/span&gt; root;
    &lt;span class='kwd'&gt;private&lt;/span&gt; Schema schema = Schema.WEB;
    &lt;span class='kwd'&gt;private&lt;/span&gt; DirectoryEntry deRoot;
    &lt;span class='kwd'&gt;private string&lt;/span&gt; errorMessage = &lt;span class='kwd'&gt;string&lt;/span&gt;.Empty;

    &lt;span class='cmt'&gt;/// &amp;lt;summary&amp;gt;
    /// Returns last error
    /// &amp;lt;/summary&amp;gt;&lt;/span&gt;
    &lt;span class='kwd'&gt;public string&lt;/span&gt; ErrorMessage
    {
        &lt;span class='kwd'&gt;get&lt;/span&gt; { &lt;span class='kwd'&gt;return this&lt;/span&gt;.errorMessage; }
    }

    &lt;span class='cmt'&gt;/// &amp;lt;summary&amp;gt;
    /// Default constructor, 
    /// IIS://localhost/W3SVC/1/Root
    /// &amp;lt;/summary&amp;gt;&lt;/span&gt;
    &lt;span class='kwd'&gt;public&lt;/span&gt; IISManager()
    {
        root = &lt;span class='st'&gt;"IIS://"&lt;/span&gt; + &lt;span class='kwd'&gt;this&lt;/span&gt;.serverName + webRoot + &lt;span class='kwd'&gt;this&lt;/span&gt;.serverId + &lt;span class='st'&gt;"/Root"&lt;/span&gt;;
        &lt;span class='kwd'&gt;this&lt;/span&gt;.deRoot = &lt;span class='kwd'&gt;new&lt;/span&gt; DirectoryEntry(&lt;span class='kwd'&gt;this&lt;/span&gt;.root);
    }

    &lt;span class='cmt'&gt;/// &amp;lt;summary&amp;gt;
    /// Custom Constructor
    /// &amp;lt;/summary&amp;gt;
    /// &amp;lt;param name=&amp;quot;serverName&amp;quot;&amp;gt;localhost&amp;lt;/param&amp;gt;
    /// &amp;lt;param name=&amp;quot;serverId&amp;quot;&amp;gt;1&amp;lt;/param&amp;gt;
    /// &amp;lt;param name=&amp;quot;schema&amp;quot;&amp;gt;WEB&amp;lt;/param&amp;gt;&lt;/span&gt;
    &lt;span class='kwd'&gt;public&lt;/span&gt; IISManager(&lt;span class='kwd'&gt;string&lt;/span&gt; serverName, &lt;span class='kwd'&gt;int&lt;/span&gt; serverId, Schema schema)
    {
        &lt;span class='kwd'&gt;this&lt;/span&gt;.serverName = serverName;
        &lt;span class='kwd'&gt;this&lt;/span&gt;.serverId = serverId;
        &lt;span class='kwd'&gt;this&lt;/span&gt;.schema = schema;
        &lt;span class='kwd'&gt;if&lt;/span&gt; (&lt;span class='kwd'&gt;this&lt;/span&gt;.schema == Schema.FTP)
        {
            root = &lt;span class='st'&gt;"IIS://"&lt;/span&gt; + &lt;span class='kwd'&gt;this&lt;/span&gt;.serverName + ftpRoot + &lt;span class='kwd'&gt;this&lt;/span&gt;.serverId + &lt;span class='st'&gt;"/Root"&lt;/span&gt;;
        }
        &lt;span class='kwd'&gt;else&lt;/span&gt;

        {
            root = &lt;span class='st'&gt;"IIS://"&lt;/span&gt; + &lt;span class='kwd'&gt;this&lt;/span&gt;.serverName + webRoot + &lt;span class='kwd'&gt;this&lt;/span&gt;.serverId + &lt;span class='st'&gt;"/Root"&lt;/span&gt;;
        }

        &lt;span class='kwd'&gt;this&lt;/span&gt;.deRoot = &lt;span class='kwd'&gt;new&lt;/span&gt; DirectoryEntry(&lt;span class='kwd'&gt;this&lt;/span&gt;.root);
    }

    &lt;span class='cmt'&gt;/// &amp;lt;summary&amp;gt;
    /// Check for existing virtual directory
    /// &amp;lt;/summary&amp;gt;
    /// &amp;lt;param name=&amp;quot;name&amp;quot;&amp;gt;virtual directory name&amp;lt;/param&amp;gt;
    /// &amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;
    &lt;span class='kwd'&gt;public bool&lt;/span&gt; IsDirectory(&lt;span class='kwd'&gt;string&lt;/span&gt; name)
    {
        &lt;span class='kwd'&gt;try&lt;/span&gt;

        {
            &lt;span class='kwd'&gt;return&lt;/span&gt; DirectoryEntry.Exists(root + &lt;span class='st'&gt;"/"&lt;/span&gt; + name);
        }
        &lt;span class='kwd'&gt;catch&lt;/span&gt;
        {
            &lt;span class='kwd'&gt;return false&lt;/span&gt;;
        }
    }

    &lt;span class='cmt'&gt;/// &amp;lt;summary&amp;gt;
    /// Create a virtual directory
    /// &amp;lt;/summary&amp;gt;
    /// &amp;lt;param name=&amp;quot;name&amp;quot;&amp;gt;virtual directory name&amp;lt;/param&amp;gt;
    /// &amp;lt;param name=&amp;quot;folderPath&amp;quot;&amp;gt;local directory path&amp;lt;/param&amp;gt;
    /// &amp;lt;param name=&amp;quot;isApplication&amp;quot;&amp;gt;create application for web virtual directory&amp;lt;/param&amp;gt;
    /// &amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;
    &lt;span class='kwd'&gt;public bool&lt;/span&gt; CreateDirectory(&lt;span class='kwd'&gt;string&lt;/span&gt; name, &lt;span class='kwd'&gt;string&lt;/span&gt; folderPath, &lt;span class='kwd'&gt;bool&lt;/span&gt; isApplication)
    {
        &lt;span class='kwd'&gt;if&lt;/span&gt; (IsDirectory(name))
        {
            &lt;span class='kwd'&gt;this&lt;/span&gt;.errorMessage = &lt;span class='st'&gt;"Directory "&lt;/span&gt; + name + &lt;span class='st'&gt;" exist"&lt;/span&gt;;
            &lt;span class='kwd'&gt;return false&lt;/span&gt;;
        }

        &lt;span class='kwd'&gt;bool&lt;/span&gt; ok = &lt;span class='kwd'&gt;true&lt;/span&gt;;

        DirectoryEntry deNewVDir;

        &lt;span class='kwd'&gt;try&lt;/span&gt;

        {
            deRoot.RefreshCache();

            &lt;span class='kwd'&gt;if&lt;/span&gt; (&lt;span class='kwd'&gt;this&lt;/span&gt;.schema == Schema.FTP)
            {
                deNewVDir = deRoot.Children.Add(name, ftpSchema);
            }
            &lt;span class='kwd'&gt;else&lt;/span&gt;
            {
                deNewVDir = deRoot.Children.Add(name, webSchema);
            }

            deNewVDir.Properties[&lt;span class='st'&gt;"Path"&lt;/span&gt;].Insert(0, folderPath);
            deNewVDir.CommitChanges();
            deRoot.CommitChanges();

            &lt;span class='cmt'&gt;// Create a Web Application&lt;/span&gt;
            &lt;span class='kwd'&gt;if&lt;/span&gt; (schema == Schema.WEB)
            {
                deNewVDir.Invoke(&lt;span class='st'&gt;"AppCreate"&lt;/span&gt;, isApplication);
            }

            &lt;span class='cmt'&gt;// Save Changes&lt;/span&gt;

            deNewVDir.CommitChanges();
            deRoot.CommitChanges();
            deNewVDir.Close();
            deRoot.Close();
        }
        &lt;span class='kwd'&gt;catch&lt;/span&gt; (Exception ex)
        {
            &lt;span class='kwd'&gt;this&lt;/span&gt;.errorMessage = ex.Message;
            ok = &lt;span class='kwd'&gt;false&lt;/span&gt;;
        }
        &lt;span class='kwd'&gt;return&lt;/span&gt; ok;
    }

    &lt;span class='cmt'&gt;/// &amp;lt;summary&amp;gt;
    /// Delete a virtual directory
    /// &amp;lt;/summary&amp;gt;
    /// &amp;lt;param name=&amp;quot;name&amp;quot;&amp;gt;virtual directory name&amp;lt;/param&amp;gt;
    /// &amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;
    &lt;span class='kwd'&gt;public bool&lt;/span&gt; DeleteDirectory(&lt;span class='kwd'&gt;string&lt;/span&gt; name)
    {
        &lt;span class='kwd'&gt;bool&lt;/span&gt; ok = &lt;span class='kwd'&gt;true&lt;/span&gt;;

        &lt;span class='kwd'&gt;if&lt;/span&gt; (!IsDirectory(name))
        {
            &lt;span class='kwd'&gt;this&lt;/span&gt;.errorMessage = &lt;span class='st'&gt;"Directory "&lt;/span&gt; + name + &lt;span class='st'&gt;" does not exist"&lt;/span&gt;;
            &lt;span class='kwd'&gt;return false&lt;/span&gt;;
        }

        Object[] parameters;

        &lt;span class='kwd'&gt;try&lt;/span&gt;

        {
            &lt;span class='kwd'&gt;if&lt;/span&gt; (&lt;span class='kwd'&gt;this&lt;/span&gt;.schema == Schema.FTP)
            {
                parameters = &lt;span class='kwd'&gt;new object&lt;/span&gt;[] { ftpSchema, name };
            }
            &lt;span class='kwd'&gt;else&lt;/span&gt;
            {
                parameters = &lt;span class='kwd'&gt;new object&lt;/span&gt;[] { webSchema, name };
            }
            deRoot.Invoke(&lt;span class='st'&gt;"Delete"&lt;/span&gt;, parameters);
            deRoot.CommitChanges();
            deRoot.Close();
        }
        &lt;span class='kwd'&gt;catch&lt;/span&gt; (Exception ex)
        {
            &lt;span class='kwd'&gt;this&lt;/span&gt;.errorMessage = ex.Message;
            ok = &lt;span class='kwd'&gt;false&lt;/span&gt;;
        }
        &lt;span class='kwd'&gt;return&lt;/span&gt; ok;

    }

    &lt;span class='cmt'&gt;/// &amp;lt;summary&amp;gt;
    /// Stop IIS Services
    /// &amp;lt;/summary&amp;gt;
    /// &amp;lt;param name=&amp;quot;schema&amp;quot;&amp;gt;MSFTPSVC or W3SVC&amp;lt;/param&amp;gt;&lt;/span&gt;
    &lt;span class='kwd'&gt;public static void&lt;/span&gt; StopIIS(Schema schema)
    {
        ServiceController myServiceController;

        &lt;span class='kwd'&gt;if&lt;/span&gt; (schema == Schema.FTP)
        {
            myServiceController = &lt;span class='kwd'&gt;new&lt;/span&gt; ServiceController(&lt;span class='st'&gt;"MSFTPSVC"&lt;/span&gt;);
        }
        &lt;span class='kwd'&gt;else&lt;/span&gt;

        {
            myServiceController = &lt;span class='kwd'&gt;new&lt;/span&gt; ServiceController(&lt;span class='st'&gt;"W3SVC"&lt;/span&gt;);
        }
        &lt;span class='kwd'&gt;if&lt;/span&gt; (&lt;span class='kwd'&gt;null&lt;/span&gt; != myServiceController)
        {
            &lt;span class='kwd'&gt;do&lt;/span&gt;
            {
                myServiceController.Refresh();
            }
            &lt;span class='kwd'&gt;while&lt;/span&gt;

                (myServiceController.Status == ServiceControllerStatus.ContinuePending ||
                myServiceController.Status == ServiceControllerStatus.PausePending ||
                myServiceController.Status == ServiceControllerStatus.StartPending ||
                myServiceController.Status == ServiceControllerStatus.StopPending);

            &lt;span class='kwd'&gt;if&lt;/span&gt; (ServiceControllerStatus.Running == myServiceController.Status ||
                ServiceControllerStatus.Paused == myServiceController.Status)
            {
                myServiceController.Stop();
                myServiceController.WaitForStatus(ServiceControllerStatus.Stopped);
            }
            myServiceController.Close();
        }
    }

    &lt;span class='cmt'&gt;/// &amp;lt;summary&amp;gt;
    /// Start IIS Services
    /// &amp;lt;/summary&amp;gt;
    /// &amp;lt;param name=&amp;quot;schema&amp;quot;&amp;gt;MSFTPSVC or W3SVC&amp;lt;/param&amp;gt;&lt;/span&gt;
    &lt;span class='kwd'&gt;public static void&lt;/span&gt; StartIIS(Schema schema)
    {

        ServiceController myServiceController;

        &lt;span class='kwd'&gt;if&lt;/span&gt; (schema == Schema.FTP)
        {
            myServiceController = &lt;span class='kwd'&gt;new&lt;/span&gt; ServiceController(&lt;span class='st'&gt;"MSFTPSVC"&lt;/span&gt;);
        }
        &lt;span class='kwd'&gt;else&lt;/span&gt;
        {
            myServiceController = &lt;span class='kwd'&gt;new&lt;/span&gt; ServiceController(&lt;span class='st'&gt;"W3SVC"&lt;/span&gt;);
        }

        &lt;span class='kwd'&gt;if&lt;/span&gt; (&lt;span class='kwd'&gt;null&lt;/span&gt; != myServiceController)
        {
            &lt;span class='kwd'&gt;do&lt;/span&gt;

            {
                myServiceController.Refresh();
            }
            &lt;span class='kwd'&gt;while&lt;/span&gt;
                (myServiceController.Status == ServiceControllerStatus.ContinuePending ||
                myServiceController.Status == ServiceControllerStatus.PausePending ||
                myServiceController.Status == ServiceControllerStatus.StartPending ||
                myServiceController.Status == ServiceControllerStatus.StopPending);

            &lt;span class='kwd'&gt;if&lt;/span&gt; (ServiceControllerStatus.Stopped == myServiceController.Status)
            {
                myServiceController.Start();
                myServiceController.WaitForStatus(ServiceControllerStatus.Running);
            }
            &lt;span class='kwd'&gt;else&lt;/span&gt;
            {
                &lt;span class='kwd'&gt;if&lt;/span&gt; (ServiceControllerStatus.Paused == myServiceController.Status)
                {
                    myServiceController.Continue();
                    myServiceController.WaitForStatus(ServiceControllerStatus.Running);
                }
            }
            myServiceController.Close();
        }
    }
}&lt;/font&gt;&lt;/pre&gt;&lt;img src="http://advenet.com/aggbug.aspx?PostID=69" width="1" height="1"&gt;</content><author><name>Aleph</name><uri>http://advenet.com/Aleph/Default.aspx</uri></author><category term="C#.NET 2.0" scheme="http://advenet.com/aleph/blog/archive/tags/C_23002E00_NET+2.0/default.aspx" /></entry></feed>