You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#如何获取IIS中网站内托管应用程序的Alias?

获取IIS托管应用Alias的C#实现方案

嗨,Dan-J!针对你给非技术人员开发C#工具时,需要获取IIS托管应用Alias用于日志的需求,我整理了两种实用且稳定的实现方案,刚好能和你工具里的其他功能(修改配置、复制文件)无缝结合:

方案一:使用Microsoft.Web.Administration官方库(推荐)

这是微软官方提供的IIS管理API,完全原生C#支持,操作直观且可靠,非常适合嵌入你的工具中。

步骤1:安装NuGet包

在你的项目中安装Microsoft.Web.Administration包:

Install-Package Microsoft.Web.Administration

步骤2:编写代码获取Alias并结合业务逻辑

下面的代码会遍历IIS中所有站点,再遍历每个站点下的托管应用,获取Alias,同时可以嵌入你需要的配置修改、文件复制逻辑:

using Microsoft.Web.Administration;
using System;
using System.IO;

class IISManagerHelper
{
    public static void ProcessAllSites()
    {
        // 确保工具以管理员身份运行,否则无法访问IIS配置
        if (!IsRunningAsAdmin())
        {
            Console.WriteLine("请以管理员身份运行此工具!");
            return;
        }

        using (ServerManager serverManager = new ServerManager())
        {
            foreach (Site site in serverManager.Sites)
            {
                Console.WriteLine($"正在处理站点: {site.Name}");
                
                // 遍历站点下的所有托管应用
                foreach (Application app in site.Applications)
                {
                    // 获取应用的Alias(就是URL路径部分,比如"/api")
                    string appAlias = app.Path;
                    string appPhysicalPath = app.VirtualDirectories[0].PhysicalPath;

                    // 记录日志:这里可以替换成你自己的日志写入逻辑
                    WriteLog($"处理应用[{appAlias}],物理路径: {appPhysicalPath}");

                    // --- 在这里插入你的业务逻辑 ---
                    // 1. 修改自定义配置文件
                    ModifyCustomConfig(appPhysicalPath);
                    // 2. 复制/替换特定文件/文件夹
                    CopyOrReplaceFiles(appPhysicalPath);
                }
            }
        }
    }

    private static void WriteLog(string message)
    {
        // 示例日志写入逻辑,你可以替换成文件日志或其他日志框架
        string logPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "IISTool.log");
        File.AppendAllText(logPath, $"[{DateTime.Now:yyyy-MM-dd HH:mm:ss}] {message}{Environment.NewLine}");
    }

    private static void ModifyCustomConfig(string physicalPath)
    {
        // 你的配置文件修改逻辑,比如找到physicalPath下的自定义config文件进行编辑
        string configPath = Path.Combine(physicalPath, "custom.config");
        if (File.Exists(configPath))
        {
            // 执行修改操作...
            WriteLog($"已修改配置文件: {configPath}");
        }
    }

    private static void CopyOrReplaceFiles(string physicalPath)
    {
        // 你的文件复制/替换逻辑,比如从指定路径复制文件到应用目录
        string sourceFile = @"C:\Templates\common.js";
        string destFile = Path.Combine(physicalPath, "scripts", "common.js");
        Directory.CreateDirectory(Path.GetDirectoryName(destFile));
        File.Copy(sourceFile, destFile, overwrite: true);
        WriteLog($"已复制文件到: {destFile}");
    }

    private static bool IsRunningAsAdmin()
    {
        using (var identity = System.Security.Principal.WindowsIdentity.GetCurrent())
        {
            var principal = new System.Security.Principal.WindowsPrincipal(identity);
            return principal.IsInRole(System.Security.Principal.WindowsBuiltInRole.Administrator);
        }
    }
}

方案二:使用WMI(适合受限环境)

如果你的工具运行环境无法安装NuGet包,可以用WMI来查询IIS的应用信息,这是Windows原生支持的方式:

using System.Management;
using System;
using System.IO;

class IISWmiHelper
{
    public static void GetAppAliasesViaWmi()
    {
        try
        {
            // 连接到IIS的WMI命名空间
            ManagementObjectSearcher searcher = new ManagementObjectSearcher(
                "root\\WebAdministration",
                "SELECT * FROM Application");

            foreach (ManagementObject queryObj in searcher.Get())
            {
                string siteName = queryObj["SiteName"].ToString();
                string appAlias = queryObj["Path"].ToString();
                string physicalPath = queryObj["PhysicalPath"].ToString();

                WriteLog($"站点[{siteName}]下的应用Alias: {appAlias},物理路径: {physicalPath}");

                // 同样在这里插入你的业务逻辑...
            }
        }
        catch (ManagementException e)
        {
            WriteLog($"WMI查询出错: {e.Message}");
        }
    }

    private static void WriteLog(string message)
    {
        // 同方案一的日志逻辑
        string logPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "IISTool_WMI.log");
        File.AppendAllText(logPath, $"[{DateTime.Now:yyyy-MM-dd HH:mm:ss}] {message}{Environment.NewLine}");
    }
}

关键注意事项

  • 管理员权限:不管用哪种方案,工具必须以管理员身份运行,否则会被拒绝访问IIS配置。你可以在代码里加入权限检测,像方案一那样提示用户。
  • Alias的含义:这里获取的Path就是应用的Alias,比如站点根应用的Alias是/,子应用可能是/admin或/api,完全符合你日志记录的需求。

内容的提问来源于stack exchange,提问作者Dan-J

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 07:45:45