using System.DirectoryServices;
public class IisVirtualDirManager
{
private readonly DirectoryEntry _root;
public IisVirtualDirManager(string serverName = "localhost", string siteId = "1")
{
_root = new DirectoryEntry($"IIS://{serverName}/W3SVC/{siteId}/ROOT");
}
// 1. 建立虛擬目錄並轉為應用程式
public void CreateVirtualDir(string virDirName, string physicalPath)
{
DirectoryEntry vdir = _root.Children.Add(virDirName, "IIsWebVirtualDir");
vdir.Properties["Path"][0] = physicalPath;
vdir.Properties["AccessRead"][0] = true;
vdir.Properties["AccessScript"][0] = true; // 執行腳本 (ASP.NET)
vdir.Properties["AppFriendlyName"][0] = virDirName;
vdir.CommitChanges();
// 建立應用程式 (關鍵步驟)
vdir.Invoke("AppCreate", true);
vdir.CommitChanges();
_root.CommitChanges();
}
// 2. 修改虛擬目錄屬性
public void SetProperty(string virDirName, string propertyName, object value)
{
DirectoryEntry vdir = _root.Children.Find(virDirName, "IIsWebVirtualDir");
vdir.Properties[propertyName][0] = value;
vdir.CommitChanges();
}
// 常用屬性: AccessRead, AccessWrite, AccessExecute, AccessScript,
// DefaultDoc, EnableDefaultDoc, Path, AppIsolated, AppPoolId
// 3. 刪除虛擬目錄
public void DeleteVirtualDir(string virDirName)
{
// 方法一: 移除應用程式再刪除目錄
DirectoryEntry vdir = _root.Children.Find(virDirName, "IIsWebVirtualDir");
vdir.Invoke("AppDelete", true);
vdir.CommitChanges();
_root.Children.Remove(vdir);
_root.CommitChanges();
// 方法二: 直接 Invoke Delete (較不穩定)
// object[] args = { "IIsWebVirtualDir", virDirName };
// _root.Invoke("Delete", args);
// _root.CommitChanges();
}
// 4. 列舉所有虛擬目錄
public string[] ListVirtualDirs()
{
return _root.Children
.Cast()
.Where(e => e.SchemaClassName == "IIsWebVirtualDir")
.Select(e => e.Name)
.ToArray();
}
}
using Microsoft.Web.Administration;
public class Iis7Manager
{
private readonly ServerManager _server = new ServerManager();
public void CreateVirtualDir(string siteName, string virPath, string physicalPath)
{
Site site = _server.Sites[siteName];
site.Applications["/"].VirtualDirectories.Add(virPath, physicalPath);
_server.CommitChanges();
}
public void SetVdirProperty(string siteName, string virPath, string attr, object value)
{
Site site = _server.Sites[siteName];
var vdir = site.Applications["/"].VirtualDirectories[virPath];
typeof(VirtualDirectory).GetProperty(attr)?.SetValue(vdir, value);
_server.CommitChanges();
}
public void DeleteVirtualDir(string siteName, string virPath)
{
Site site = _server.Sites[siteName];
var vdir = site.Applications["/"].VirtualDirectories[virPath];
site.Applications["/"].VirtualDirectories.Remove(vdir);
_server.CommitChanges();
}
}
需參考 `%windir%\system32\inetsrv\Microsoft.Web.Administration.dll`,專案設定 `Copy Local = True`。
| 錯誤 | 原因 | 解決 |
|---|---|---|
| UnauthorizedAccessException | 執行身分無 Metabase/Configuration 寫入權限 | 應用程式池身分加入 IIS_IUSRS / 管理員組,或使用委派身分 |
| DirectoryNotFoundException (IIS://...) | 站點 ID 錯誤、路徑不存在 | 確認 `W3SVC/{id}/ROOT` 路徑,用 `adsutil.vbs enum` 查看 |
| COMException: 0x80005000 | SchemaClassName 不匹配 (IIsWebVirtualDir vs IIsWebDirectory) | 用 `Children.Find(name, schemaClass)` 精確查找 |