以编程方式为 IIS 7 中的自定义标识应用程序池设置用户帐户
本文关键字:程序池 应用程序 应用 设置 用户 标识 自定义 方式 编程 IIS | 更新日期: 2023-09-27 18:33:59
在我的 C# 代码中,我需要为 Web 应用程序创建自定义标识并将其添加到 IIS 7 中。我执行以下操作:
string strAppPoolName = "MyAppPool";
string strUserName = Environment.UserDomainName + "''" + "myappusername";
addUserAccount(strUserName, strUserPass);
using (ServerManager serverManager = new ServerManager())
{
//Add application pool
ApplicationPool appPool = serverManager.ApplicationPools.Add(strAppPoolName);
appPool.AutoStart = true;
appPool.ManagedPipelineMode = ManagedPipelineMode.Integrated;
appPool.ManagedRuntimeVersion = "v4.0";
appPool.ProcessModel.MaxProcesses = 1;
//Assign identity to a custom user account
appPool.ProcessModel.IdentityType = ProcessModelIdentityType.SpecificUser;
appPool.ProcessModel.UserName = strUserName;
appPool.ProcessModel.Password = strUserPass;
}
将用户添加到活动目录的位置如下:
public static void addUserAccount(string sUserName, string sPassword)
{
using (PrincipalContext oPrincipalContext = new PrincipalContext(ContextType.Domain))
{
using (UserPrincipal up = new UserPrincipal(oPrincipalContext))
{
up.SamAccountName = sUserName;
up.SetPassword(sPassword);
up.Enabled = true;
up.PasswordNeverExpires = true;
up.Description = "My app's user account";
up.Save();
}
}
}
问题是,当我稍后将我的站点和应用程序添加到该应用程序池下的 IIS 7 时,Web 应用程序无法运行,因为它没有足够的权限。对我来说更重要的是,即使我手动将此新用户帐户的读/写权限设置为安装我的 Web 应用程序的文件系统文件夹,某些 .NET 类(如 System.Security.Cryptography(也会失败并出现意外的错误代码。
因此,在进行研究时,我发现了以下陈述:
如果使用自定义标识,请确保用户帐户 指定 是 Web 服务器上 IIS_IUSRS 组的成员,以便 该帐户对资源具有适当的访问权限。此外,当您使用 在您的环境中进行 Windows 和 Kerberos 身份验证,您可能会 需要向域注册服务主体名称 (SPN( 控制器 (DC(。
那么,你怎么做呢?
如果需要将该帐户添加到IIS_IUSERS组(计算机上的本地组(,则可以使用该GroupPrincipal
。请记住,要为您的计算机创建一个本地PrincipalContext
,而不是您用于用户的域。只需按标识查找组,然后将新创建的用户添加到Members
集合。Add
方法具有接受UserPrincipal
的重载。
您的代码如下所示:
using (PrincipalContext oPrincipalContext = new PrincipalContext(ContextType.Domain))
{
using (PrincipalContext oGroupContext = new PrincipalContext(ContextType.Machine))
{
// find the local group IIS_IUSRS
using(var gp = GroupPrincipal.FindByIdentity(oGroupContext,"IIS_IUSRS"))
{
using (UserPrincipal up = new UserPrincipal(oPrincipalContext))
{
up.SamAccountName = sUserName;
up.SetPassword(sPassword);
up.Enabled = true;
up.PasswordNeverExpires = true;
up.Description = "My app's user account";
up.Save();
// add new user to Members of group
gp.Members.Add(up);
// save before Disposing!
gp.Save();
}
}
}
}