2015-08-10 6 views
2

Сначала я написал сценарий для создания подписи Outlook, в PowerShell, и теперь я хочу, чтобы превратить его в C# программы с дополнительными функциями, как шаблон здание и настройка и т.д.Каталога поискового

Красоты первоначального сценария что вы просто передаете ему имя пользователя, а все остальное. Вытягивает информацию, создает структуру каталогов, выплевывает HTML и т. Д.

У меня возникают проблемы с вытаскиванием информации из AD на C#. Я пытался это сделать с помощью пространства имен DirectoryServices. Я думаю, что у меня есть основное понимание того, как это должно работать, и что он должен делать, но я продолжаю получать ошибки, как будто я пропускаю что-то важное, например преобразование типа, или как инициализировать данные, которые можно использовать внутри приложение.

Вот мой код, и я не знаю, что случилось с ним:

Console.Write("What User do you want properties for?:"); 
string usr = Console.ReadLine(); 

DirectoryEntry dir = new DirectoryEntry("OU=users,DC=domain,DC=com"); 
DirectorySearcher find = new DirectorySearcher(dir, "(&(objectClass=User)(enabled=true)(SAMAccountName=" + usr + "))"); 
find.PropertiesToLoad.Add("SAMAccountName"); 
find.PropertiesToLoad.Add("GivenName"); 
find.PropertiesToLoad.Add("Surname"); 
find.PropertiesToLoad.Add("StreetAddress"); 
find.PropertiesToLoad.Add("City"); 
find.PropertiesToLoad.Add("State"); 
find.PropertiesToLoad.Add("PostalCode"); 
find.PropertiesToLoad.Add("OfficePhone"); 
find.PropertiesToLoad.Add("HomePhone"); 
find.PropertiesToLoad.Add("Fax"); 
find.PropertiesToLoad.Add("EmailAddress"); 
find.PropertiesToLoad.Add("Pager"); 

Console.WriteLine(find.Filter); 

SearchResult res = find.FindOne(); 

Ошибка вокруг, где я пытаюсь напечатать на экране, чтобы убедиться, я имею право информацию. Как показано здесь:

Console.Write(res); 
Console.ReadLine(); 

Редактировать: дополнительная информация.

Проблема, как представляется, при выполнении

SearchResult res = find.findOne(); 

Также фактическая ошибка

Unhandled Exception: System.Runtime.InteropServices.COMException: Unspecified Error 

    at System.DirectoryServices.DirectoryEntry.Bind(Boolean throwIfFail) 
    at System.DirectoryServices.DirectoryEntry.Bind() 
    at System.DirectorySerivices.DirectoryEntry.get_AdsObject() 
    at System.DirecotryServices.DirecotrySearcher.FindAll(Boolean findMoreThanOne) 
    at System.DirecoryServices.DirectorySearcher.FindOne() 
    at ConsoleApplication1.Program.Main(String[] args) 

Кроме того, вывод компилятора. Первоначально у меня создалось впечатление, что это связано с тем, что машина, которую я кодирую, не является частью домена, с которым я проверяю, но я также выполняю исполняемый файл на машине.

System.Runtime.InteropServices.COMException was unhandled 
    ErrorCode=-2147467259 
    HResult=-2147467259 
    Message=Unspecified error 

    Source=System.DirectoryServices 
    StackTrace: 
     at System.DirectoryServices.DirectoryEntry.Bind(Boolean throwIfFail) 
     at System.DirectoryServices.DirectoryEntry.Bind() 
     at System.DirectoryServices.DirectoryEntry.get_AdsObject() 
     at System.DirectoryServices.DirectorySearcher.FindAll(Boolean findMoreThanOne) 
     at System.DirectoryServices.DirectorySearcher.FindOne() 
     at ConsoleApplication1.Program.Main(String[] args) in c:\users\administrator\documents\visual studio 2015\Projects\ConsoleApplication1\ConsoleApplication1\Program.cs:line 36 
     at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args) 
     at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args) 
     at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly() 
     at System.Threading.ThreadHelper.ThreadStart_Context(Object state) 
     at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) 
     at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) 
     at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) 
     at System.Threading.ThreadHelper.ThreadStart() 
    InnerException: 
+0

Вы должны пытаться напечатать объект на экране вот почему этот вопрос. Попробуйте напечатать его, что свойства объектов. –

+0

Если вы обновите вопрос с ошибкой, которая будет полезна. Без ошибок трудно представить, какова ваша проблема. –

+0

В качестве примечания вы можете захотеть добавить некоторую проверку, чтобы гарантировать, что пользователь вводит данные, которые не просто приводят к сбою программы со странными ошибками. – Kupiakos

ответ

2

Включите протокол, сервер и порт в пути:

DirectoryEntry dir = new DirectoryEntry("LDAP://servername:port/OU=users,DC=domain,DC=com"); 
+0

Он разрешил первоначальную проблему, но, похоже, у нее другая проблема. Каков формат, если вы просто хотите, чтобы он использовал любой DC в домене и указывал точное OU для поиска? –

+0

Попробуйте без сервера: порт, но сохраняя протокол: «LDAP: // OU = users, DC = domain, DC = com» – Stone

+1

Получил другую ошибку, а затем попробовал ее вместо имени сервера. Я использовал свое полное полное доменное имя , Тогда я думаю, что я нахожусь в точке, где проблема только в том случае, когда я инициализирую переменную результата поиска. –

Смежные вопросы