2016-07-04 12 views
2

Ich habe eine AD-Abfrage und Eigenschaften manuell hinzufügen, aber ich möchte die Möglichkeit, alle Active Directory-Eigenschaften, die ein Benutzer für den Sucher haben kann.Active Directory-Abfrage Problem

Dies ist die aktuelle Art, wie ich es tue, was schön und gut funktioniert ...

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 

Also dachte ich, ich würde versuchen, sie alle zu addieren, um ein Benutzer zu wählen, und wählen könnte, welche Attribute sie wollten ... also kam ich auf diese Idee.

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 

aber ich bin für die meisten von ihnen die folgende Störung zu erhalten ..

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

Irgendwelche Hinweise auf das, was ich vermisst habe? Mir ist klar, dass ADSP nicht zum Eingeben von Zeichenfolge verwendet werden kann, aber ich bin nicht sicher, wie ich es beheben kann. Ich bin sicher, einige von ihnen sind Boolean, Ints, Datetime.

Antwort

1

vb.net ist nicht zu streng, um dies in Intellisense zu erfassen oder sogar zu bauen. C# wird dies in Intellisense erfassen.

Änderung dieser Zeile:

deSearch.PropertiesToLoad.Add(enumerator.Current) 

zu

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

--------- C# Version ------------

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

Gleicher Fehler, obwohl ich es gefunden habe, wenn ich nichts lade, zieht es automatisch alles. Das beantwortet meine eigene Frage. – TonyW

+0

Für was es wert ist, funktioniert es gut für mich ... getestet sowohl auf VB.Net und C# mit VS2015. – objectNotFound

+0

Wenn ich Ausnahmen erhalte, 40% von ihnen scheitern, siehst du aus, als ignorierst du sie. – TonyW

1

Der Fehler ist offensichtlich und die andere Antwort war richtig. enumerator.Current gibt ein Objekt von ActiveDirectorySchemaProperty zurück und nicht den Zeichenfolgennamen, der für PropertiesToLoad.Add() erforderlich ist. Wie richtig erwähnt Sie ToString

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

Ein anderer Weg ist Sammlung verwenden zurück von GetAllProperties() Methode (keine Notwendigkeit, fügen Sie eine zusätzliche enumerator wenn Sammlung bereits vorhanden ist) verwenden müssen:

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

Um zu überprüfen, ob der Code funktioniert Sie

MessageBox.Show(deSearch.PropertiesToLoad.Count) 

die einzige Frage, die Count Immobilie am Ende überprüfen könnten, warum Sie das brauchen? Mit PropertiesToLoad() werden Eigenschaften zurückgegeben, die Sie für das Suchergebnis abrufen möchten. Wenn Sie z. B. eine Suchseite haben, auf der der Nutzer nach bestimmten Kriterien suchen kann, wird das Suchergebnis als Tabelle mit grundlegenden Details wie Nutzername, Anzeigename, E-Mail usw. angezeigt, aber nicht alle. Es macht keinen Sinn, alle Attribute zu laden und zurückzugeben, wenn dies nicht notwendig ist (und auch aus Gründen der Leistung). Zum Beispiel hat das Schema meines "Test" -Verzeichnisses über 800 Attribute.