首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> ASP.NET 基礎 >> 關於ASP.NET

ASP.NET 操作 IIS 虛擬目錄:DirectoryServices 完整程式碼範例

     編輯:關於ASP.NET

前置準備

  • 參考 `System.DirectoryServices.dll`。
  • 執行身分需具備 IIS Metabase 寫入權限 (通常需 Administrator 或特定 COM+ 角色)。
  • IIS 6: `IIsWebVirtualDir`、`IIsWebDirectory`。
    IIS 7+: 建議改用 `Microsoft.Web.Administration` (ServerManager)。

核心程式碼 (IIS 6 / DirectoryServices)

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();
 }
}

現代做法:Microsoft.Web.Administration (IIS 7+)

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`。

權限與安全性注意事項

  • Web 應用程式操作 IIS 屬高風險,**嚴禁**直接對外暴露此功能。
  • 僅限內部管理後台、具備 Windows 驗證 + 角色授權 (Administrators/IIS Admins) 的使用者存取。
  • 記錄完整稽核日誌:操作者、時間、動作、目標虛擬目錄、變更前後值。
  • 考慮將操作佇列化,由獨立 Windows Service (高權限) 執行,Web 端僅寫入佇列。

常見錯誤排查

錯誤原因解決
UnauthorizedAccessException執行身分無 Metabase/Configuration 寫入權限應用程式池身分加入 IIS_IUSRS / 管理員組,或使用委派身分
DirectoryNotFoundException (IIS://...)站點 ID 錯誤、路徑不存在確認 `W3SVC/{id}/ROOT` 路徑,用 `adsutil.vbs enum` 查看
COMException: 0x80005000SchemaClassName 不匹配 (IIsWebVirtualDir vs IIsWebDirectory)用 `Children.Find(name, schemaClass)` 精確查找
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved