以编程方式将 IIS 应用程序池标识“用户”分配给组

2024-01-06

问题:当创建新的 IIS 应用程序池并将其设置为使用应用程序池标识来获取权限时,我不确定如何将这些标识添加到用户组(例如管理员或性能计数器用户)。

的背景:我目前正在编写一个 C#.NET 库,它使用 Microsoft.Web.Administration 来执行以下操作:

  • 检测是否安装了 IIS 7.x,如果安装了,则检测哪些组件。
  • 将 IIS 7.x 安装或升级到提供的所需组件列表。
  • 通过 IIS 创建/管理一个或多个网站。
  • 自动为每个网站创建/管理一个应用程序池

上下文是,可执行安装程序将使用此库来在 Windows Server 操作系统上提供 Web 服务器和网站/服务的自动部署,作为大型软件部署的一部分。到目前为止,除了需要在应用程序池/网站创建上执行的一些权限的自动化之外,上述所有内容都已实现、测试并且(大部分)正常运行。

在我安装新网站的方法中,我创建了一个新的应用程序池并强制它使用应用程序池标识:

static public void InstallSite(string name, string path, int port)
{
    Site site;
    var appPoolName = ApplicationPoolBaseName + name;

    using (var iisManager = new ServerManager())
    {
        // Set up a custom application pool for any site we run.
        if (!iisManager.ApplicationPools.Any(pool => pool.Name.Equals(appPoolName)))
        {
            iisManager.ApplicationPools.Add(appPoolName);
            iisManager.ApplicationPools[appPoolName].ManagedRuntimeVersion = "v4.0";
        }
        iisManager.CommitChanges();
    }

    // ... other code here ('site' gets initialized) ...

    using (var iisManager = new ServerManager())
    {
        // Set anonymous auth appropriately
        var config = iisManager.GetWebConfiguration(site.Name);
        var auth = config.GetSection("system.web/authentication");
        auth.SetMetadata("mode", "Windows");
        var authSection = config.GetSection("system.webServer/security/authentication/anonymousAuthentication");
        authSection.SetAttributeValue("enabled", true);
        authSection.SetAttributeValue("userName", string.Empty); // Forces the use of the Pool's Identity.
        authSection = config.GetSection("system.webServer/security/authentication/basicAuthentication");
        authSection.SetAttributeValue("enabled", false);
        authSection = config.GetSection("system.webServer/security/authentication/digestAuthentication");
        authSection.SetAttributeValue("enabled", false);
        authSection = config.GetSection("system.webServer/security/authentication/windowsAuthentication");
        authSection.SetAttributeValue("enabled", false);

        iisManager.CommitChanges();
    }

    // ... other code here ...
}

据我了解,这将是最佳的安全实践,然后我将向特定网站添加除最小系统访问之外的任何权限。此过程的一部分是将这些应用程序池标识添加到用户组,例如管理员或性能监视器用户。这就是出现并发症的地方。

Now, as 记录在别处 http://forums.iis.net/t/1156692.aspx,每个应用程序池标识以以下格式存在IIS AppPool\\<pool_name>但是这个假用户没有通过正常的 GUI 用户管理控件列出,并且似乎无法通过诸如System.DirectoryServices.AccountManagement当跟随这个例子关于SO https://stackoverflow.com/questions/12843469/adding-local-user-to-local-admin-group。此外,有关应用程序池身份的其他问题似乎与从子网站内引用它 https://stackoverflow.com/questions/10101162/get-the-application-pool-identity-programmatically,而不是来自安装上下文。

那么,有谁知道正确的方法是什么

  • a) 以编程方式引用和访问应用程序池标识。
  • b) 通过添加用户组来授予应用程序池身份权限。

感谢您写得很好的问题。这正是我昨晚试图解决的问题,它给了我足够的继续下去的机会,我终于能够拼凑出一个仅使用托管代码的答案。我发现让框架找到并使用虚拟用户需要三个步骤:

  • using new System.Security.Principal.NTAccount(@"IIS APPPOOL\<appPoolName>")获取帐户的句柄。
  • using .Translate(typeof (System.Security.Principal.SecurityIdentifier))将其转换为 SID
  • 了解这一点Principal.FindByIdentity()将该 SID 视为一个组,而不是一个用户

最终的工作程序(我测试的Windows Server 2012)如下:

using System;
using System.DirectoryServices.AccountManagement;

namespace WebAdminTest
{
    internal class Program
    {
        private static void Main(string[] args)
        {
            var user = new System.Security.Principal.NTAccount(@"IIS APPPOOL\10e6c294-9836-44a9-af54-207385846ebf");
            var sid = user.Translate(typeof (System.Security.Principal.SecurityIdentifier));

            var ctx = new PrincipalContext(ContextType.Machine);

            // This is weird - the user SID resolves to a group prinicpal, but it works that way.
            var appPoolIdentityGroupPrincipal = GroupPrincipal.FindByIdentity(ctx, IdentityType.Sid, sid.Value);

            Console.WriteLine(appPoolIdentityGroupPrincipal.Name);
            Console.WriteLine(appPoolIdentityGroupPrincipal.DisplayName);

            GroupPrincipal targetGroupPrincipal = GroupPrincipal.FindByIdentity(ctx, "Performance Monitor Users");

            // Making appPoolIdentity "group" a member of the "Performance Monitor Users Group"
            targetGroupPrincipal.Members.Add(appPoolIdentityGroupPrincipal);
            targetGroupPrincipal.Save();

            Console.WriteLine("DONE!");
            Console.ReadKey();
        }
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

以编程方式将 IIS 应用程序池标识“用户”分配给组 的相关文章

  • fopen_s 怎么会比 fopen 更安全呢?

    我正在处理遗留代码Windows平台 当我编译代码时VS2013 它给出以下警告 错误 C4996 fopen 该函数或变量可能不安全 考虑使用fopen s反而 要禁用弃用 请使用 CRT SECURE NO WARNINGS 详情请参见
  • 为什么我会收到未找到分析器的警告?

    我创建了一个玩具项目来检查最新的 NET 7 预览版 5 和正则表达式代码生成 它效果很好 所以我对现有项目应用了相同的更改 不是为了生产 而是为了个人生产力 由于某种原因 我收到这些警告 CS8032 An instance of ana
  • ASP.NET Web 应用程序中的身份验证遇到问题

    我正在尝试对从登录页面登录我的 Web 应用程序的用户进行身份验证 我正在使用本教程 http support microsoft com kb 301240作为指南 它几乎准确地解释了我希望做什么 但是当我输入用户名和密码时 验证不起作用
  • .crt 部分?这个警告是什么意思?

    我最近收到此警告 VC 2010 warning LNK4210 CRT section exists there may be unhandled static initializers or terminators 我假设这是关键部分
  • web.config 授权是否适用于 aspx 以外的文件?

    我有带有表单身份验证的 ASP NET 应用程序 它运行良好 但我有一个包含 olly txt 文件 无 aspx 文件 的目录 我希望用户不要访问该目录 或仅登录用户 我将 web config 添加到该目录
  • 使用 C# 将多个音频样本混合到单个文件中

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找一个能够创建音频文件 mp3 或 wav 的库 NAudio http www codeple
  • 警告 C4800:“int”:强制值为 bool“true”或“false”(性能警告)

    我的代码中有这个问题 bool CBase isNumber return id MID NUMBER bool CBase isVar return id MID VARIABLE bool CBase isSymbol return i
  • Dapper 在执行时挂起

    我有一个 IDb连接 sql UPDATE 表名 SET json json lastupdate SYSDATE WHERE id id var param new DynamicParameters param Add json jso
  • ContentDialog 未与 UWP 中心对齐

    据我所知 ContentDialog的默认行为应该是使其在 PC 上居中并在移动设备上与顶部对齐 但就我而言 即使在 PC 上我也将其与顶部对齐 但我不明白发生了什么 我正在使用代码隐藏来创建它 这是我正在使用的代码片段 Creates t
  • 组合框下拉位置

    我有一个最大化的表单 其中包含 500px 的组合框控件 停靠在右上角 Width 尝试打开组合框后 列表的一半超出了屏幕 如何强制列表显示在表单中 棘手的问题 我找不到解决这个问题的好办法 只是一个解决方法 添加一个新类并粘贴如下所示的代
  • 如何将 Q 格式整数转换为浮点数(反之亦然)?

    我四处搜寻 找不到一个很好的问题来回答这个问题 给定一个整数 使用Q Format https en wikipedia org wiki Q number format 如何将该数字转换为普通浮点类型 反之亦然 如何将浮点类型转换为Q F
  • 调用异步方法在视图模型的构造函数中加载数据有警告

    我的视图包含一个 ListView 它显示来自互联网的一些数据 我创建一个异步方法来加载数据并在我的视图模型的构造函数中调用该方法 它有一个警告提示我现在使用await关键字 还有其他解决方案可以在构造函数中异步加载数据吗 有几种可以应用的
  • 在 C# 中使用命名空间别名有什么好处? [复制]

    这个问题在这里已经有答案了 使用命名空间别名有什么好处 仅仅是为了简化编码吗 仅当与类发生冲突时我才使用名称空间别名 对我来说 这根本没有简化 我的意见是 如果没有必要 就不要使用
  • 从 DataRow 单元格解析 int [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 如何从 DataRow 单元格解析 int 值 Int32 Parse item QuestionId ToString 这段代码可以工作 但看
  • 选择合适的IDE

    您会推荐使用以下哪种 IDE 语言来在 Windows 下开发涉及识别手势并与操作系统交互的项目 我将使用 OpenCV 库来执行图像处理任务 之后 我将使用 win32 API 或 NET 框架与操作系统交互 具体取决于您建议的工具 性能
  • 如何从 Access 数据库中读取“是/否”值作为布尔值?

    帮我找回YES NO来自 MS Access 的布尔格式数据类型 我尝试解析它 但它总是返回 false 更新 实际上不是问题抱歉 它确实接受 YES NO 作为布尔值 OleDbconnection dbConnect new OleDb
  • 卸载程序

    我正在尝试使用此代码卸载程序 但它似乎不起作用 我尝试过其他答案 但似乎也不起作用 有人可以帮助我吗 我正在尝试按给定名称 displayName 卸载该程序 例如 我给出 displayName Appname 那么此代码应该从我的计算机
  • 具有四个 && 的 LINQ Where 子句

    我正在尝试在Where 子句中创建一个带有4 个参数的LINQ 查询 这是一个 Windows 8 应用程序项目 我正在使用 SQLite 数据库 SQLite 实现 https github com praeclarum sqlite n
  • 从脚本启用/禁用 GameObject 组件 [Unity3D]

    我需要获取一个脚本中设置的布尔值 放入名为 bouclier 的变量 以启用或禁用游戏对象 该变量位于游戏对象 Player 中 此处右下角 我需要启用或禁用这个游戏对象 Bouclier01 为此 我将脚本附加到游戏对象 Bouclier
  • 如何在c#中创建多线程

    我需要监听机器中的所有串行端口 假设我的机器有 4 个串行端口 我必须创建 4 个线程并开始分别使用附加线程监听每个端口 我使用此代码来获取我的机器中的端口数量 private SerialPort comPort new SerialPo

随机推荐

  • close() 没有正确关闭套接字

    我有一台多线程服务器 线程池 它使用 20 个线程处理大量请求 一个节点高达 500 秒 有一个侦听器线程接受传入连接并将它们排队以供处理程序线程处理 一旦响应准备好 线程就会向客户端写入并关闭套接字 一切似乎都很好 直到最近 一个测试客户
  • 如何将两个过程组合在一起来填充一个表,而不是两个过程中的每一个过程填充它自己的表?

    我使用 Sequel Pro 创建了两个表 每个表都在 MySQL 中填充了不同的过程 虽然每个表在运行相应的过程后都包含正确的信息 但我认为如果我更多地合并一些表 我的数据将不再那么分散 因此 我想做的是将两个表中的数据合并为一个 下面是
  • SQLite CURRENT_TIMESTAMP 总是 1970-01-01

    我有以下定义一个表 CREATE TABLE players playerid INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL name VARCHAR 20 NOT NULL UNIQUE added
  • 从chrome发送udp数据包

    网上查资料 如何将udp发送到udp node js服务器 https stackoverflow com questions 7451522 how to send udp to udp node js server JavaScript
  • 如何在 Edmx Designer 中对多对多关系启用级联删除

    我使用 VS2012 和实体设计器来生成数据库和模型 我有一个非常基本的场景 即 Table1 到 Table1 和 2JoinTable 到 Table2 比如学生 班级 学生班级 您可以在多个班级中拥有多个学生 我想要级联删除 因此 如
  • wix - 安装前删除旧程序文件夹

    我需要安装程序在安装程序开始复制新文件之前删除旧的安装目录 如果存在 该文件夹包含程序使用过程中生成的一些文件和子文件夹 它们不包含在安装程序中 因此 我创建了自定义操作来执行此操作 所以 一些代码 首先 自定义操作代码 没什么特别的 Cu
  • Java 运行时环境检测到致命错误:SIGSEGV (0xb) at pc=0x00002b2f7e9b2744, pid=28778, tid=1138739520

    我在执行程序时收到以下错误 而这种情况并不总是发生 代码中包含一些复杂的计算 数据量很大 有人可以帮助识别错误吗 A fatal error has been detected by the Java Runtime Environment
  • fmod 不正确吗? [复制]

    这个问题在这里已经有答案了 给定以下双打 是否fmod返回正确的值 double x 090 double y 003 double r fmod x y r 0 0029999999999999949 为什么r不 0 因为 像大多数十进制
  • 如何在 django 管理站点上授予用户权限

    我正在尝试授予用户对管理站点的有限访问权限 我以超级用户身份登录 并授予用户员工身份和模型权限 可以添加 可以更改 和 可以删除 问题是用户可以登录该网站 但看到以下消息 如果我给他超级用户身份 他可以编辑任何内容 但我想给他有限的访问权限
  • 如何安全地使用 UniqueEntity(在具有多个同时用户的网站上)

    聪明的人可以分享他们用来避免 Doctrine Symfony 中这种基本且常见的并发问题的设计模式吗 设想 每个用户必须有一个唯一的用户名 失败解决方案 Add a 独特的实体 https symfony com doc 3 1 refe
  • 在 Java 中以编程方式设置 Linux 环境变量

    我可以通过以下方式运行 Linux 命令RunTime班级 有没有办法以编程方式从 Java 设置 Linux 全局环境 我想通过 Java 模拟以下 Linux 命令语句 root machine tmp export TEST v2 我
  • linux + 验证文件是文本还是二进制

    如何在不打开文件的情况下验证文件是二进制文件还是文本文件 恐怕是薛定谔的猫 在不打开文件的情况下无法确定文件的内容 文件系统不存储与内容相关的元数据 如果不打开文件不是硬性要求 那么有许多解决方案可供您使用 Edit 许多评论和答案都建议f
  • Vue 关闭组件返回避免直接改变 prop

    我有一个想要在不同页面上使用的组件 嗯 在第一次切换之前它运行良好 它显示得像以前一样 但是当我单击 关闭 按钮时 它会关闭 但控制台输出 Vue warn 避免直接改变 prop 因为该值将是 每当父组件重新渲染时都会被覆盖 相反 使用
  • 用于分析进程中加载​​的本机 DLL 和程序集的内存占用的工具?

    根据任务管理器 我有一个进程持有 130MB 内存 根据任务管理器 只有 11MB 的活动 NET 对象dotTrace http www jetbrains com profiler 所以我想知道另外 120MB 发生了什么 我需要一个工
  • 在 R 中合并 2 个具有相同但不同 case 列的数据框

    我有两个数据框 但问题是合并 by 列在不同情况下具有值 sn1capx1e0001 与 SN1CAPX1E0001 authors lt data frame surname I c Tukey Venables Tierney Ripl
  • 理解大 O 表示法 - 破解编码面试示例 9

    我被这两个代码困住了 Code 1 int f int n if n lt 1 return 1 return f n 1 f n 1 Code 2 平衡二叉搜索树 int sum Node node if node null return
  • 太阳位置的 R 函数给出了意想不到的结果

    我想计算给定时间 纬度和经度的太阳的位置 我在这里找到了这个很棒的问题和答案 一天中给定时间 纬度和经度的太阳位置 https stackoverflow com questions 8708048 position of the sun
  • 正则表达式中的异或

    寻找一些正则表达式帮助 我想设计一个与字符串匹配的表达式 foo OR bar 但不是两者都 foo AND bar 如果我做类似的事情 foo bar 它将匹配 foobar 不是我正在寻找的 那么 如何才能仅在存在一个或另一个术语时才使
  • Excel4Node:如何下载Excel文件而不保存?

    使用 excel4node 我可以将文件写入硬盘 但我想将其作为下载返回 而不将文件保存在服务器上 我认为以下代码是必需的 但不确定如何使用它 wb writeToBuffer then function buffer console lo
  • 以编程方式将 IIS 应用程序池标识“用户”分配给组

    问题 当创建新的 IIS 应用程序池并将其设置为使用应用程序池标识来获取权限时 我不确定如何将这些标识添加到用户组 例如管理员或性能计数器用户 的背景 我目前正在编写一个 C NET 库 它使用 Microsoft Web Administ