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

.NET 程式化控制 IIS:虛擬目錄增刪改查完整實作

     編輯:關於.NET

核心命名空間:System.DirectoryServices

提供 DirectoryEntry(節點入口)與 DirectoryEntries(子節點集合),支援操作 IIS Metabase、LDAP、WinNT 等目錄服務。

IIS Metabase 階層結構

路徑格式:IIS://ComputerName/Service/WebSite/Directory

  • ComputerName:localhost 或 IP
  • Service:W3SVC (Web)、MSFTPSVC (FTP)、SMTPSVC
  • WebSite:站點識別碼,預設 1
  • Directory:ROOT 為根目錄,子目錄為虛擬/實體目錄

Schema(結構描述) 區分節點類型:IIsWebVirtualDir(虛擬目錄)、IIsWebDir(實體目錄)、IIsWebFile(檔案)。

核心操作代碼

1. 連接根目錄

DirectoryEntry root = new DirectoryEntry("IIS://localhost/W3SVC/1/ROOT");

2. 建立虛擬目錄

DirectoryEntry vdir = root.Children.Add("MyApp", "IIsWebVirtualDir");
vdir.Invoke("AppCreate", true); // 轉為應用程式
vdir.CommitChanges();
root.CommitChanges();

3. 更新屬性(讀/寫/執行/腳本/SSL/預設文檔/實體路徑等)

DirectoryEntry vdir = root.Children.Find("MyApp", "IIsWebVirtualDir");
vdir.Properties["AccessRead"][0] = true;
vdir.Properties["AccessWrite"][0] = false;
vdir.Properties["AccessExecute"][0] = true;
vdir.Properties["AccessScript"][0] = true;
vdir.Properties["AccessSSL"][0] = false;
vdir.Properties["DefaultDoc"][0] = "default.aspx,default.htm,index.htm";
vdir.Properties["Path"][0] = @"C:\Inetpub\MyApp"; // 實體路徑
vdir.CommitChanges();

4. 刪除虛擬目錄(兩種方式)

// 方式一:Invoke AppDelete
DirectoryEntry vdir = root.Children.Find("MyApp", "IIsWebVirtualDir");
vdir.Invoke("AppDelete", true);
root.CommitChanges();

// 方式二:根目錄 Delete 方法
object[] args = { "IIsWebVirtualDir", "MyApp" };
root.Invoke("Delete", args);
root.CommitChanges();

完整封裝類別:IISManager

using System;
using System.DirectoryServices;
using System.Collections;

namespace Aspcn.Management
{
    public class IISManager
    {
        private string _server = "localhost", _site = "1";
        private DirectoryEntry _root;
        private VirtualDirectoryCollection _vdirs;

        public string Server { get => _server; set => _server = value; }
        public string WebSite { get => _site; set => _site = value; }

        public void Connect()
        {
            string path = $"IIS://{_server}/W3SVC/{_site}/ROOT";
            _root = new DirectoryEntry(path);
            _vdirs = LoadVirtualDirectories(_root.Children);
        }

        public bool Exists(string name) => _vdirs.Contains(name);

        public void Create(VirtualDirectory vd)
        {
            if (Exists(vd.Name) && !_batchMode) throw new Exception("已存在");
            DirectoryEntry de = _root.Children.Add(vd.Name, "IIsWebVirtualDir");
            de.Invoke("AppCreate", true);
            de.CommitChanges();
            _root.CommitChanges();
            UpdateProperties(de, vd);
        }

        public void Update(VirtualDirectory vd)
        {
            DirectoryEntry de = _root.Children.Find(vd.Name, "IIsWebVirtualDir");
            UpdateProperties(de, vd);
        }

        public void Delete(string name)
        {
            object[] args = { "IIsWebVirtualDir", name };
            _root.Invoke("Delete", args);
            _root.CommitChanges();
        }

        // 批次更新支援
        private bool _batchMode;
        public void BeginBatch() => _batchMode = true;
        public void CommitBatch() { _batchMode = false; /* 批次處理邏輯 */ }

        private void UpdateProperties(DirectoryEntry de, VirtualDirectory vd)
        {
            de.Properties["AccessRead"][0] = vd.AccessRead;
            de.Properties["AccessWrite"][0] = vd.AccessWrite;
            de.Properties["AccessExecute"][0] = vd.AccessExecute;
            de.Properties["AccessScript"][0] = vd.AccessScript;
            de.Properties["AccessSSL"][0] = vd.AccessSSL;
            de.Properties["DefaultDoc"][0] = vd.DefaultDoc;
            de.Properties["Path"][0] = vd.Path;
            de.Properties["EnableDefaultDoc"][0] = vd.EnableDefaultDoc;
            de.Properties["EnableDirBrowsing"][0] = vd.EnableDirBrowsing;
            de.Properties["AuthBasic"][0] = vd.AuthBasic;
            de.Properties["AuthNTLM"][0] = vd.AuthNTLM;
            de.Properties["AnonymousUserName"][0] = vd.AnonymousUserName;
            de.Properties["AnonymousUserPass"][0] = vd.AnonymousUserPass;
            de.CommitChanges();
        }

        private VirtualDirectoryCollection LoadVirtualDirectories(DirectoryEntries children)
        {
            var col = new VirtualDirectoryCollection();
            foreach (DirectoryEntry de in children)
            {
                if (de.SchemaClassName == "IIsWebVirtualDir")
                {
                    var vd = new VirtualDirectory
                    {
                        Name = de.Name,
                        AccessRead = (bool)de.Properties["AccessRead"][0],
                        // ... 其他屬性映射
                        Path = (string)de.Properties["Path"][0]
                    };
                    col.Add(vd.Name, vd);
                }
            }
            return col;
        }
    }

    public class VirtualDirectory
    {
        public string Name { get; set; }
        public bool AccessRead { get; set; } = true;
        public bool AccessWrite { get; set; }
        public bool AccessExecute { get; set; }
        public bool AccessScript { get; set; }
        public bool AccessSSL { get; set; }
        public string DefaultDoc { get; set; } = "default.aspx,default.htm";
        public string Path { get; set; } = @"C:\Inetpub\wwwroot";
        // ... 其他屬性
    }

    public class VirtualDirectoryCollection : Hashtable
    {
        public VirtualDirectory Find(string name) => this[name] as VirtualDirectory;
    }
}

使用範例

var mgr = new IISManager { Server = "localhost", WebSite = "1" };
mgr.Connect();

// 建立
mgr.Create(new VirtualDirectory 
{ 
    Name = "MyApp", 
    Path = @"D:\Projects\MyApp",
    AccessRead = true,
    AccessScript = true
});

// 修改
var vd = mgr.GetVirtualDirectory("MyApp");
vd.AccessWrite = true;
mgr.Update(vd);

// 刪除
mgr.Delete("MyApp");

權限與部署注意事項

  • 執行身分需具備 IIS Metabase 寫入權限(通常需 Administrator 或透過 COM+ 角色授權)。
  • IIS 7+ 建議改用 Microsoft.Web.Administration (ServerManager) 管理應用程式池、站點、虛擬目錄,API 更現代化。
  • 遠端操作需開啟 RPC/WMI 防火牆規則,並確保目標機器啟用「IIS 管理服務」。

總結

System.DirectoryServices 提供底層、強大的 IIS Metabase 程式化存取能力。封裝為 IISManager 類別後,可輕鬆整合至部署工具、自動化腳本或管理介面。對於 IIS 7 以上環境,建議優先評估 Microsoft.Web.Administration 組件。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved