按照Microsoft的本指南,我一直在努力将Active Directory功能添加到现有的ASP.NET网站:http://support.microsoft.com/kb/326340。这是一个漫长的过程,但我现在坚持的是无法访问AccountManagement类来使用某些功能,例如“GetGroup()”。
我可以很好地访问DirectoryServices,但不能访问帐户管理。当我使用以下代码测试引用时:
Response.Write(System.DirectoryServices.AccountManagement.Principal.GetGroups())
我收到此错误:BC30456:'AccountManagement'不是'DirectoryServices'的成员。
我已将此程序集标记添加到web.config页面:
<add assembly="System.DirectoryServices, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A" />
此外,我正在导入两个名称空间:
<%@ Import Namespace="System.DirectoryServices" %>
<%@ Import Namespace="System.DirectoryServices.AccountManagement" %>
这是我在错误页面上显示的版本信息:
版本信息:Microsoft .NET Framework版本:4.0.30319; ASP.NET版本:4.0.30319.34237
我正在VS 2010中编辑此网站。我缺少什么,如何在此处添加AccountManagement?我没有正确导入它,或者在某个地方我可以查看是否有丢失.dll?
答案 0 :(得分:5)
虽然您要在标记中导入两个名称空间,但只引用System.DirectoryServices.dll
。 AccountManagement部分位于单独的dll中。
添加对web.config的另一个引用:
<add assembly="System.DirectoryServices.AccountManagement ...
答案 1 :(得分:5)
我按照Reg Edit的建议尝试了,但后来又出现了另一个错误,我的应用程序找不到web.config中描述的引用。几个小时后,我遇到了this stackoverflow answer。
它表示对 System.DirectoryServices.AccountManagement 的引用应在“ True ”上具有“复制本地”。老实说,我认为没有理由说这应该有效,因为那是一个框架库,但改变这个设置对我有用。
您可以这样做:
using (var context = new PrincipalContext(ContextType.Domain)) { var principal = UserPrincipal.FindByIdentity(context, User.Identity.Name); var firstName = principal.GivenName; var lastName = principal.Surname; }
您需要添加对该引用的引用
System.DirectoryServices.AccountManagement
汇编。您可以像这样添加Razor助手:
@helper AccountName() { using (var context = new PrincipalContext(ContextType.Domain)) { var principal = UserPrincipal.FindByIdentity(context, User.Identity.Name); @principal.GivenName @principal.Surname } }
如果您从视图中执行此操作而不是控制器,则 您还需要为web.config添加程序集引用:
<add assembly="System.DirectoryServices.AccountManagement" />
在
configuration/system.web/assemblies
下添加。
来自:Answer To: How do I get the full name of a user in .net MVC 3 intranet app?