tags:

views:

483

answers:

1

We have a web application that is installed on Windows 2003 and Windows 2008 systems. In the past, our install code used ADSI to create a couple of application directories in IIS, but this requires the IIS 6 management components to be installed in Windows 2008. I have been trying to use WMI to create the application directories so we can support both operating systems.

I have been trying this code

   public static void AddVirtualFolder(string serverName, string websiteId, string name, string path)
    {
        ManagementScope scope = new ManagementScope(string.Format(@"\\{0}\root\MicrosoftIISV2", serverName));
        scope.Connect();

        string siteName = string.Format("W3SVC/{0}/Root/{1}", websiteId, name);

        ManagementClass mc = new ManagementClass(scope, new ManagementPath("IIsWebVirtualDirSetting"), null);
        ManagementObject oWebVirtDir = mc.CreateInstance();

        oWebVirtDir.Properties["Name"].Value = siteName;
        oWebVirtDir.Properties["Path"].Value = path;
        oWebVirtDir.Properties["AuthFlags"].Value = 5; // Integrated Windows Auth.
        oWebVirtDir.Properties["EnableDefaultDoc"].Value = true;
        // date, time, size, extension, longdate ;
        oWebVirtDir.Properties["DirBrowseFlags"].Value = 0x4000003E;
        oWebVirtDir.Properties["AccessFlags"].Value = 513; // read script 
        oWebVirtDir.Put();

        ManagementObject mo = new ManagementObject(scope, new System.Management.ManagementPath("IIsWebVirtualDir='" + siteName + "'"), null);
        ManagementBaseObject inputParameters = mo.GetMethodParameters("AppCreate2");
        inputParameters["AppMode"] = 2;
        mo.InvokeMethod("AppCreate2", inputParameters, null);
        mo = new ManagementObject(scope, new System.Management.ManagementPath("IIsWebVirtualDirSetting='" + siteName + "'"), null);
        mo.Properties["AppFriendlyName"].Value = name;
        mo.Put();
    }
}

However, I get path not found errors on known directories. If anybody has some references I can use, I would greatly appreciate it. Any other suggestions on how to go about this are also welcome.

+1  A: 

Using the code above, you will still need the IIS6 compatibility bits on Windows 2008/IIS7. The reason for this is that the calls to set properties such as DirBrowseFlags, AccessFlags and so on are IIS 6 metabase properties that are not supported in IIS7 without the IIS6 management components.

I'd recommend programming directly against the Microsoft.Web.Administration namespace, but if you really need to use WMI then see this article:

Managing Sites with IIS 7.0's WMI Provider (IIS.NET)

Kev
I had hoped to be able to use a single code path for either IIS6 or IIS7, so I had avoided using the IIS7 specific Microsoft.Web.Administration classes. However, I guess that I will just have to detect the IIS version and continue using ADSI for IIS6 and use the new stuff in another code path for IIS7.Thanks,
Shane Rimmer
@Shane - another good reason is that the IIS6 compat shim also bodges the `HandlerMappings` (analogous to IIS6 scriptmaps) with `AboCustomMapper` objects which can't take advantage of features such as launch pre-conditions. Trust me, the effort is worth it to maintain good `applicationHost.config` file hygiene.
Kev
thanks, exactly what I was after
Ralph Willgoss