2014-09-18 8 views
4

Microsoft에서 http://support.microsoft.com/kb/326340이 가이드에 따라 기존 ASP.NET 웹 사이트에 Active Directory 기능을 추가하기 위해 노력하고 있습니다. 그것은 긴 과정 이었지만, 지금 당장 붙어있는 것은 "GetGroup()"과 같은 특정 기능을 사용하기 위해 AccountManagement 클래스에 액세스 할 수 없다는 것입니다.ASP.NET VB 사이트에서 System.DirectoryServices.AccountManagement를로드 할 수 없습니다.

나는 DirectoryServices에 액세스 할 수 있지만 계정 관리에는 문제가 없습니다. 내가 참조 테스트하려면 다음 코드를 사용하는 경우 :

Response.Write(System.DirectoryServices.AccountManagement.Principal.GetGroups()) 

을이 오류를 얻을 : BC30456를 'AccountManagement는'DirectoryServices '의 구성원이 아닙니다.

내가 이미 Web.config의 페이지로이 어셈블리 태그를 추가 한

:

<%@ Import Namespace="System.DirectoryServices" %> 
<%@ Import Namespace="System.DirectoryServices.AccountManagement" %> 

그리고이 오류에 표시 내 버전 정보입니다 :

<add assembly="System.DirectoryServices, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A" /> 

이 또한 내가 두 네임 스페이스를 수입하고 페이지 :

Version Information: Microsoft .NET Framework Version:4.0.30319; ASP.NET Version:4.0.30319.34237

VS 2010에서이 웹 사이트를 편집하고 있습니다. 무엇이 누락되어 있으며 어떻게받을 수 있습니까? ountManagement가 여기에 추가 되었습니까? 제대로 가져 오지 않았거나 누락 된 .dll이 있는지 확인할 수있는 곳이 있습니까?

+0

하지는'사용 <% @ 어셈블리 이름 = "System.DirectoryServices.AccountManagement"%>' – Kiquenet

답변

4

마크 업에서 두 ​​네임 스페이스를 모두 가져 오지만 System.DirectoryServices.dll 만 참조하십시오. AccountManagement 부분은 별도의 dll에 있습니다. 등록 편집에 의해 제안

<add assembly="System.DirectoryServices.AccountManagement ... 
+0

감사합니다! 내가 거기에 참조를 추가 할 수 있다고 생각하지 않았지만 ASP.NET 4.0을 사용하여 사이트를 업데이트 한 이후 "참조 추가 ..."옵션을 선택하지 않았습니다. – justanotherguy

+0

이제 코드 줄까지 "GetGroups()"까지 올 수 있습니다. 이제이 오류를 트리거하기 전에 : BC30469 : 비공유 구성원 참조는 개체 참조가 필요합니다. – justanotherguy

+0

@justanotherguy, 당신은'GetGroups()'를 정적 메서드 인 것처럼 호출합니다. C#에서는 '정적'이 VB.Net에서 'shared'와 같은 의미입니다. 그러나 이것은 인스턴스 메서드이므로이 메서드를 호출하기 전에 Principal ** 개체 **가 필요합니다. 사실 Principal은 추상 클래스이기 때문에 ** 객체 **는 (추상화되지 않은) 하위 클래스의 인스턴스 여야합니다. UserPrincipal. 그리고 GetGroups()는 해당 사용자가 속한 그룹을 제공합니다. –

4

내가 시도,하지만 난 내 응용 프로그램의 Web.config에 설명 된 참조를 찾을 수있는 또 다른 오류가 발생했습니다 :

은 Web.config의 또 다른 참조를 추가합니다. 몇 시간 후, 나는 this stackoverflow answer을 만났다.

System.DirectoryServices.AccountManagement에 대한 참조가 '진정한'에 "로컬 복사본"을 가져야한다고 말한다. 솔직히, 그것이 작동해야하는 이유는 없습니다. 프레임 워크 라이브러리이기 때문에 그 설정을 변경하는 것이 저에게 효과적이었습니다. 에서

You can do something like this:

using (var context = new PrincipalContext(ContextType.Domain)) 
{ 
    var principal = UserPrincipal.FindByIdentity(context, User.Identity.Name); 
    var firstName = principal.GivenName; 
    var lastName = principal.Surname; 
} 

You'll need to add a reference to the System.DirectoryServices.AccountManagement assembly.

You can add a Razor helper like so:

@helper AccountName() 
    { 
     using (var context = new PrincipalContext(ContextType.Domain)) 
    { 
     var principal = UserPrincipal.FindByIdentity(context, User.Identity.Name); 
     @principal.GivenName @principal.Surname 
    } 
} 

If you indend on doing this from the view, rather than the controller, you need to add an assembly reference to your web.config as well:

<add assembly="System.DirectoryServices.AccountManagement" /> 

Add that under configuration/system.web/assemblies .

: 유효 나를 위해 Answer To: How do I get the full name of a user in .net MVC 3 intranet app?