2016-07-04 3 views
2

나는 AD 쿼리를 사용하고 속성을 수동으로 추가하지만 사용자가 검색 자에게 가질 수있는 모든 활성 디렉토리 속성을 추가 할 수 있어야합니다.액티브 디렉토리 쿼리 문제

이 벌금과 멋쟁이 작동 내가 그것을하고있어 현재의 방법이다는 ...

Dim de As New DirectoryEntry 
If getset.impersonationset = True Then 
    If getset.specificcontainerchecked = True Then 
     de.Path = "LDAP://" & getset.containerstring() 
     de.Username = getset.usernameset 
     de.Password = getset.passwordset 
    Else 
     de.Path = "LDAP://" & getset.DomainName() 
     de.Username = getset.usernameset 
     de.Password = getset.passwordset 
    End If 
Else 
    If getset.specificcontainerchecked = True Then 
     de.Path = "LDAP://" & getset.containerstring() 
    Else 
     de.Path = "LDAP://" & getset.DomainName() 
    End If 
End If 

Dim deSearch As New DirectorySearcher() 
deSearch.SearchRoot = de 
deSearch.Filter = "(&(objectClass=User)(objectCategory=Person))" 
deSearch.PageSize = 1000 
deSearch.SizeLimit = 1000 

If getset.specificcontainerchecked = True Then 
    If getset.subcontainers = True Then 
     deSearch.SearchScope = SearchScope.Subtree 
    ElseIf getset.subcontainers = False Then 
     deSearch.SearchScope = SearchScope.OneLevel 
    End If 
ElseIf getset.specificcontainerchecked = False Then 
    deSearch.SearchScope = SearchScope.Subtree 
End If 

deSearch.PropertiesToLoad.Add("sAMAccountName") 'Account Name 
    deSearch.PropertiesToLoad.Add("givenName") 'Display Name 
    deSearch.PropertiesToLoad.Add("sn") 'Load Users first name 
    deSearch.PropertiesToLoad.Add("description") 'Description 
    deSearch.PropertiesToLoad.Add("userAccountControl") 'Distinguished Name 
    deSearch.PropertiesToLoad.Add("lastLogonTimestamp") 'Last Login 
    deSearch.PropertiesToLoad.Add("whenCreated") 'Created Date 
    deSearch.PropertiesToLoad.Add("whenChanged") 'Changed Date 
    deSearch.PropertiesToLoad.Add("distinguishedName") 
    deSearch.PropertiesToLoad.Add("msNPAllowDialin") 
    deSearch.PropertiesToLoad.Add("cn") 'Wiles, Anthony 
    deSearch.PropertiesToLoad.Add("co") 'United States 
    deSearch.PropertiesToLoad.Add("company") 'Company 
    deSearch.PropertiesToLoad.Add("l") 'Alpharetta 
    deSearch.PropertiesToLoad.Add("mail") 'Email 
    deSearch.PropertiesToLoad.Add("st") 'State 

그래서 나는 내가 그렇게 사용자가 선택하고 속성을 선택할 수있는, 그들 모두를 추가 할 것이라고 생각 그들은 원했어 ... 그래서 나는 이것을 생각해 냈다.

Dim currSchema As ActiveDirectorySchema = ActiveDirectorySchema.GetCurrentSchema() 
Dim collection As ActiveDirectorySchemaClass = currSchema.FindClass("user") 
Dim properties As ReadOnlyActiveDirectorySchemaPropertyCollection = collection.GetAllProperties() 
Dim enumerator As IEnumerator = properties.GetEnumerator() 
     While enumerator.MoveNext() 
      Try 
       deSearch.PropertiesToLoad.Add(enumerator.Current) 
      Catch ex As Exception 
       MessageBox.Show(ex.Message) 
      End Try 
     End While 

하지만 난 그들 대부분 다음과 같은 오류를 받고 있어요 .. 저는 누락 된 사항에

Conversion from type 'ActiveDirectorySchemaProperty' to type 'string' is not valid. 

모든 단서? ADSP 형식 문자열을 캐스팅 할 수 없다는 것을 알고 있지만 그것을 수정하는 방법을 잘 모르겠습니다. 나는 그들 중 일부가 부울, ints, datetime입니다 확신합니다.

답변

1

vb.net은 intellisense에서 이것을 포착하거나 빌드하기에는 너무 엄격하지 않습니다. C#이 intellisense에서 이것을 잡을 것입니다.

변경이 라인 :

deSearch.PropertiesToLoad.Add(enumerator.Current) 

deSearch.PropertiesToLoad.Add(enumerator.Current.ToString()) 

--------- C# 버전 ------------

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.DirectoryServices; 
using System.DirectoryServices.AccountManagement; 
using System.DirectoryServices.ActiveDirectory; 
using System.Collections; 

namespace AD 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      DirectorySearcher deSearch = new DirectorySearcher(); 

     ActiveDirectorySchema currSchema = ActiveDirectorySchema.GetCurrentSchema(); 
     ActiveDirectorySchemaClass collection = currSchema.FindClass("user"); 
     ReadOnlyActiveDirectorySchemaPropertyCollection properties = collection.GetAllProperties(); 
     IEnumerator enumerator = properties.GetEnumerator(); 
     while (enumerator.MoveNext()) 
     { 
      try 
      { 
       deSearch.PropertiesToLoad.Add(enumerator.Current.ToString()); 
       Console.WriteLine(enumerator.Current.ToString()); 
      } 
      catch (Exception ex) 
      { 
       // MessageBox.Show(ex.Message); 
      } 
     } 
    } 
} 

+0

동일한 오류가 발생합니다. 아무 것도로드하지 않으면 동일한 오류가 발생하지만 자동으로 모든 항목을 가져옵니다. 그런 종류의 대답은 내 자신의 질문입니다. – TonyW

+0

그것이 나를 위해 잘 작동하는 가치에 대한 ... VB.Net 및 C# VS2015 사용하여 테스트했습니다. – objectNotFound

+0

내가 예외를 잡을 때, 40 %가 실패하고, 당신은 그들을 무시하는 것처럼 보입니다. – TonyW

1

오류는 분명하고 다른 대답은 정확합니다. enumerator.CurrentPropertiesToLoad.Add()에 필요한 문자열 이름이 아닌 ActiveDirectorySchemaProperty의 개체를 반환합니다. 로 제대로은 ToString을 사용할 필요가 언급 한

deSearch.PropertiesToLoad.Add(enumerator.Current.ToString) 

또 다른 방법은 (컬렉션이 이미있을 경우 추가로 열거를 추가 할 필요가 없습니다) GetAllProperties() 메소드에 의해 반환되는 모음을 사용하는 것입니다

For Each p As ActiveDirectorySchemaProperty In properties 
    deSearch.PropertiesToLoad.Add(p.Name) 
Next 

있는지 확인하려면 코드는 마지막

MessageBox.Show(deSearch.PropertiesToLoad.Count) 

당신이 왜 필요합니까되는 유일한 질문에 Count 속성을 확인할 수 있습니다 작동? PropertiesToLoad()는 검색 결과에 대해 검색하려는 속성을 반환하는 데 사용됩니다. 예를 들어 사용자가 특정 기준으로 검색 할 수있는 검색 페이지가 있고 검색 결과가 사용자 이름, 표시 이름, 전자 메일 등의 기본 세부 정보가있는 테이블로 표시되지만 모두가 아닌 것은 표시됩니다. 특별한 필요가 없으면 (또한 성능상의 이유로) 모든 속성을로드하고 반환하는 것은 의미가 없습니다. 예를 들어, "test"디렉토리의 구성표에는 800 개가 넘는 속성이 있습니다.