.net - API de IIS: ¿crear directorios virtuales?
asp.net virtual-directory (4)
Es más fácil hacerlo con vbscript también ...
'' This code creates a virtual directory in the default Web Site
'' ---------------------------------------------------------------
'' From the book "Windows Server Cookbook" by Robbie Allen
'' ISBN: 0-596-00633-0
'' ---------------------------------------------------------------
'' ------ SCRIPT CONFIGURATION ------
strComputer = "rallen-w2k3"
strVdirName = "<VdirName>" ''e.g. employees
strVdirPath = "<Path>" ''e.g. D:/resumes
'' ------ END CONFIGURATION ---------
set objIIS = GetObject("IIS://" & strComputer & "/W3SVC/1")
set objWebSite = objIIS.GetObject("IISWebVirtualDir","Root")
set objVdir = objWebSite.Create("IISWebVirtualDir",strVdirName)
objVdir.AccessRead = True
objVdir.Path = strVdirPath
objVdir.SetInfo
WScript.Echo "Successfully created virtual directory: " & objVdir.Name
Solo buscando la documentación relevante. Un ejemplo no es necesario, pero sería apreciado.
Tenemos una situación en la que tenemos que crear cientos de directorios virtuales de forma manual, y parece que automatizar esta sería una buena manera de hacer que el proceso sea más eficiente por ahora.
Quizás el próximo año podamos modificar el entorno del servidor para permitir algo más sensato, como la reescritura de URL (desafortunadamente, esto no parece factible en el ciclo actual de la aplicación web). ¿No es genial heredar el código de mierda?
~ William Riley-Land
Evidentemente, también puede hacerlo a través de la creación de scripts de PowerShell:
$objIIS = new-object System.DirectoryServices.DirectoryEntry("IIS://localhost/W3SVC/1/Root")
$children = $objIIS.psbase.children
$vDir = $children.add("NewFolder",$objIIS.psbase.SchemaClassName)
$vDir.psbase.CommitChanges()
$vDir.Path = "C:/Documents and Settings/blah/Desktop/new"
$vDir.defaultdoc = "Default.htm"
$vDir.psbase.CommitChanges()
Aquí está la documentación: MSDN - Uso de la Administración Programática de IIS
La herramienta de instalación de WIX crea una forma de gestionar esto; los definirías como parte de las instrucciones de compilación de la instalación. Hace un poco de trabajo para configurar todo el proyecto, pero después de ese mantenimiento debería ser una brisa ... Aquí hay un extracto del Tutorial sobre cómo crear las entradas del Directorio Virtual ...
6.3 Directorio web
El conjunto de herramientas WiX tiene bibliotecas adicionales que le permiten al instalador realizar tareas adicionales, como crear un directorio web en IIS. Para usar estas extensiones, todo lo que tiene que hacer es enlazar con la biblioteca WiX apropiada. El enlazador incluirá las DLL auxiliares necesarias en el paquete de instalación de forma automática.
Primero, tenemos que crear el sitio web con los archivos que le pertenecen:
<ID del directorio = ''TARGETDIR'' Nombre = ''SourceDir''>
<Id del directorio = ''ProgramFilesFolder'' Name = ''PFiles''>
<Id del directorio = ''InstallDir'' Name = ''Acme''>
<Id del componente = ''default.phpComponent'' Guid = ''YOURGUID-5314-4689-83CA-9DB5C04D5742''>
<Id. De archivo = ''default.htmFile'' Name = ''default.htm'' LongName = ''default.htm'' KeyPath = ''yes'' DiskId = ''1'' Fuente = ''default.htm'' />
</ Componente>
</ Directorio>
</ Directorio>El siguiente paso es crear el directorio virtual:
<Id del componente = ''TestWebVirtualDirComponent'' Guid = ''YOURGUID-6304-410E-A808-E3585379EADB''>
<WebVirtualDir Id = ''TestWebVirtualDir'' Alias = ''Test'' Directory = ''InstallDir'' WebSite = ''DefaultWebSite''>
<WebApplication Id = ''TestWebApplication'' Name = ''Test'' />
</ WebVirtualDir>
</ Componente>
</ Directorio>Finalmente, crea una entrada para hacer referencia al sitio web:
<WebSite Id = ''DefaultWebSite'' Descripción = ''Sitio web predeterminado''>
<WebAddress Id = ''AllUnassigned'' Port = ''80 ''/>
</ Sitio web>
NO PROBADO (a partir de un código base antiguo y escrito por un antiguo contratista mío)
using System;
using System.Collections.Generic;
using System.Text;
using System.DirectoryServices;
using System.IO;
namespace Common.DirectoryServices
{
public class IISManager
{
private string _webSiteID;
public string WebSiteID
{
get { return _webSiteID; }
set { _webSiteID = value; }
}
private string _strServerName;
public string ServerName
{
get
{
return _strServerName;
}
set
{
_strServerName = value;
}
}
private string _strVDirName;
public string VDirName
{
get
{
return _strVDirName;
}
set
{
_strVDirName = value;
}
}
private string _strPhysicalPath;
public string PhysicalPath
{
get
{
return _strPhysicalPath;
}
set
{
_strPhysicalPath = value;
}
}
private VDirectoryType _directoryType;
public VDirectoryType DirectoryType
{
get
{
return _directoryType;
}
set
{
_directoryType = value;
}
}
public enum VDirectoryType
{
FTP_DIR, WEB_IIS_DIR
};
public string CreateVDir()
{
System.DirectoryServices.DirectoryEntry oDE;
System.DirectoryServices.DirectoryEntries oDC;
System.DirectoryServices.DirectoryEntry oVirDir;
//try
// {
//check whether to create FTP or Web IIS Virtual Directory
if (this.DirectoryType == VDirectoryType.WEB_IIS_DIR)
{
oDE = new DirectoryEntry("IIS://" +
this._strServerName + "/W3SVC/" + _webSiteID + "/Root");
}
else
{
oDE = new DirectoryEntry("IIS://" +
this._strServerName + "/MSFTPSVC/1/Root");
}
//Get Default Web Site
oDC = oDE.Children;
//Add row
oVirDir = oDC.Add(this._strVDirName,
oDE.SchemaClassName.ToString());
//Commit changes for Schema class File
oVirDir.CommitChanges();
//Create physical path if it does not exists
if (!Directory.Exists(this._strPhysicalPath))
{
Directory.CreateDirectory(this._strPhysicalPath);
}
//Set virtual directory to physical path
oVirDir.Properties["Path"].Value = this._strPhysicalPath;
//Set read access
oVirDir.Properties["AccessRead"][0] = true;
//Create Application for IIS Application (as for ASP.NET)
if (this.DirectoryType == VDirectoryType.WEB_IIS_DIR)
{
oVirDir.Invoke("AppCreate", true);
oVirDir.Properties["AppFriendlyName"][0] = this._strVDirName;
}
//Save all the changes
oVirDir.CommitChanges();
return null;
// }
//catch (Exception exc)
//{
// return exc.Message.ToString();
//}
}
}
}