好像我的本地计算机没有将数据写入Active Directory所需的权限。我可以读取数据但无法更改和更新。在调用.save()命令时,我收到下一条消息:“访问被拒绝”。
我没有使用任何登录详细信息来登录Active Directory,我也不希望使用任何登录。我知道它通常与应用程序池和IIS有关,但除了尝试和更改一些次要选项和功能外,我似乎无法找到可行的解决方案。
编辑: 这是我正在尝试执行的代码:
using (PrincipalContext pc = new PrincipalContext(ContextType.Domain, "DOMAINANME"))
{
GroupPrincipal group = new GroupPrincipal.FindByIdentity(pc, "GROUPNAME");
group.Members.Remove(pc, IdentityType.SamAccountName, "USERNAME");
group.Save();
}
答案 0 :(得分:5)
您的直觉是正确的 - 您需要对应用程序池帐户拥有适当的权限。
最简单的方法是:
这样,用户对iis的所有请求都在域管理员的上下文中运行,因此从iis到AD的所有请求都将成功 - 域管理员可以操作AD。
虽然上述解决方案可行,但可能不推荐。这是因为应用程序除了连接到AD之外还执行许多其他操作,如果有可能被滥用的地方,则可能会在域管理上下文中运行不需要的请求。
通常情况下,这样的应用程序将具有两个层,前层和后层。前层在受限制的上下文中运行,并负责所有用户请求。这是你的申请。后备层是另一个 Web应用程序,无法从Internet访问,只能从本地Intranet访问。此应用程序在域管理上下文中运行,并充当AD的网关。前端应用程序使用后端应用程序与AD通信。
答案 1 :(得分:4)
要执行需要Active Directory特定权限的代码,请按以下步骤操作:
根据您使用的ASP.NET版本,可能会略有不同,但基本上......
对于用户登录,只需使用标准的ASP.NET身份验证配置即可。因为它是最容易配置的(并且只适用于AD),我将在此处记录Windows身份验证。这将提示用户使用标准Windows登录对话框 - 他们需要输入域凭据。要配置应用程序,请对Web.config
进行以下更改<configuration>
...
<system.web>
...
<authentication mode="Windows" />
...
</system.web>
...
</configuration>
默认情况下,ASP.NET应该已经知道在配置为Windows身份验证时如何与Active Directory通信,因此不需要其他任何内容,但如果您发现需要单独的角色提供程序,随意采取the one we use。 (我们也有instructions。)但同样,你不应该需要它。
编辑:您还需要确保使用inetmgr.exe
配置IIS以禁止对应用程序进行匿名访问。否则,它将永远不会提示用户登录。我们通常会禁用匿名访问并启用 Windows 和基本身份验证 - 因为我们需要支持不支持NTLM的浏览器。
现在您已经过身份验证的用户,您可以通过编程方式模拟它们。以下内容改编自Impersonating the authenticating user in code:
System.Security.Principal.WindowsImpersonationContext impersonationContext;
impersonationContext = ((System.Security.Principal.WindowsIdentity)User.Identity).Impersonate();
try
{
// Do your writing to the AD here
}
finally
{
impersonationContext.Undo();
}
我也刚刚发现(在搜索此答案的参考链接时)这些都在MSDN文章How To: Use Windows Authentication in ASP.NET 2.0
中有详细记录。让我们知道它是怎么回事: - )