提供 DirectoryEntry(節點入口)與 DirectoryEntries(子節點集合),支援操作 IIS Metabase、LDAP、WinNT 等目錄服務。
路徑格式:IIS://ComputerName/Service/WebSite/Directory
Schema(結構描述) 區分節點類型:IIsWebVirtualDir(虛擬目錄)、IIsWebDir(實體目錄)、IIsWebFile(檔案)。
DirectoryEntry root = new DirectoryEntry("IIS://localhost/W3SVC/1/ROOT");
DirectoryEntry vdir = root.Children.Add("MyApp", "IIsWebVirtualDir");
vdir.Invoke("AppCreate", true); // 轉為應用程式
vdir.CommitChanges();
root.CommitChanges();
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();
// 方式一: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();
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");
Microsoft.Web.Administration (ServerManager) 管理應用程式池、站點、虛擬目錄,API 更現代化。System.DirectoryServices 提供底層、強大的 IIS Metabase 程式化存取能力。封裝為 IISManager 類別後,可輕鬆整合至部署工具、自動化腳本或管理介面。對於 IIS 7 以上環境,建議優先評估 Microsoft.Web.Administration 組件。