- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
问题:当创建新的 IIS 应用程序池并将其设置为使用应用程序池标识获取权限时,我不确定如何将这些标识添加到用户组,例如管理员或性能计数器用户。
背景:我目前正在编写一个 C#.NET 库,它使用 Microsoft.Web.Administration 来执行以下操作:
上下文是该库将由可执行安装程序使用,以在 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 ...
}
据我所知,这将是最好的安全做法,然后我会添加对特定网站的权限,以实现最低限度的系统访问权限。此过程的一部分是将这些应用程序池身份添加到用户组,例如管理员或性能监视器用户。这就是并发症出现的地方。
现在,作为documented elsewhere , 每个应用程序池标识以 IIS AppPool\\<pool_name>
的格式存在但是这个伪用户没有通过普通的 GUI 用户管理控件列出,并且似乎无法通过诸如 System.DirectoryServices.AccountManagement
之类的库访问。当关注 this example on SO .此外,有关应用程序池标识的其他问题似乎与 referencing it from within a child website 有关。 ,而不是在安装上下文中。
所以,有谁知道正确的方法是什么
最佳答案
感谢您提出的问题。这正是我昨晚试图解决的问题,它给了我足够的继续,我终于能够拼凑出一个仅使用托管代码的答案。我发现通过三个步骤让框架找到并使用虚拟用户:
new System.Security.Principal.NTAccount(@"IIS APPPOOL\<appPoolName>")
处理该帐户。.Translate(typeof (System.Security.Principal.SecurityIdentifier))
将其转换为 SIDPrincipal.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();
}
}
}
关于c# - 以编程方式将 IIS 应用程序池标识 "users"分配给组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14712916/
我正在 R 中使用 RecordLinkage 库。 我有一个包含 ID、姓名、电话、邮件的数据框 我的代码如下所示: ids = data$id pairs = compare.dedup(data
我目前正在构建一个新的 ASP.NET MVC 5 项目,我想在 9 月左右发布。我需要选择一个成员(member)系统,但我目前对我应该采取哪个方向感到很困惑。当前的 SimpleMembershi
我正在为 Brackets 定制一个大纲插件,它使用正则表达式来识别当前打开的文件的大纲。 我使用 regex101.com 创建了以下正则表达式(使用环视来确定该行以七个空格开头并以“SECTION
我已在表中将一列标记为“身份” create table Identitytest( number int identity(1,001) not null, value varch
我不知道那是字符串还是数组... char str4[100] = { 0 }; 那个代码是字符串? 如果是,它打印什么? 最佳答案 I dont know if that a string or a
我这里有一个场景,当用户想要重置密码时,系统必须通过电子邮件向用户发送一个随机生成的临时密码。我尝试将临时密码存储到数据库中的一个新列中,但我不确定这种方法是否有效。有些人建议使用 token,如下所
Vista 的现代 Windows 应用程序中有一个很好的功能。它是窗口标题中的图片。例如新的 skype (v4) 和 google chrome 都有它。 我在想它背后的技术是什么?如果你关闭 a
比较相同泛型类型的两个实例的最佳(最简洁和最佳)方法是什么,以便比较引用类型的身份(相同的对象,所以不是调用 Equals) 和 value 类型以获得值 equality。 目前我这样做: stat
我使用以下 C# 代码来获取处理器信息。如果我在虚拟机上运行我的应用程序,则管理类为空。我使用 Oracle VM VirtualBox 作为我的虚拟电脑 (Windows XP SP3) Syste
创建帐户后,Windows 帐户(本地、域、Active Directory)的 SID 是否会更改?如果是,在什么条件下。 最佳答案 是的,当您将帐户迁移到新域时,它会发生变化。 这就是您 AD 帐
我正在使用 Identity Server 4 并且我已经自定义了我的 ASP.NET Identity 用户,如下所示: public class ApplicationUser : Identit
我创建了一个 IIS 管理工具,旨在创建新应用程序、将它们分配到新的 AppPool,并为与该 AppPool 关联的身份添加所需的文件夹 ACL。根据this article ,每当创建新的应用程序
我使用 ASP.NET Identity .. 我想将 session 超时设置为无限制或最大值。我试过一些东西,但没有效果。注意:我使用共享主机。 谢谢你。 //web.config /
我有一台 Win 2008 R2 Enterprise 机器,它在几个网站上运行良好,每个网站都有自己的应用程序池。 我在向 IIS AppPool\A、IIS AppPool\B 等授予权限(使用
现有数据库模型(简化): 1 个用户可以加入 1 个或多个访问组。 1个AccessGroup可以有1个或多个AccessItens。 MSDN Says: When an identity is c
在具有单个表继承层次结构的 Hibernate/JPA 环境中使用 PostgreSQL 时,我看到了奇怪的行为。 首先是我的环境: PostgreSQL 8.3 Spring 2.5.6SEC01
是声明“一个类具有唯一标识”。是真是假? Java 中的对象有其唯一标识(至少通过它们的内存地址),但是类也有唯一标识吗?由于类不是对象,我对此感到困惑。或者是否需要实例化一个类(甚至可能)? 最佳答
我正在尝试通过将主要组件分解为单独的网络服务器来使用微服务架构来实现网络应用程序。我正在使用 ASP.NET Identity(仅电子邮件/用户名登录,无 Facebook 等)和“主”应用程序服务器
这个问题在这里已经有了答案: 关闭 10 年前。 Possible Duplicate: How do you like your primary keys? 我知道使用 GUID 的好处,以及使用
我可以这样获取所有用户 var users = UserManager.Users.ToList(); 我能找到这样的角色 var role = db.Roles.SingleOrDefault(m
我是一名优秀的程序员,十分优秀!