Странные ошибки при подключении к AD - Visual Basic - PullRequest
0 голосов
/ 11 июня 2018

Есть несколько странных вопросов.Я подключаюсь к AD, чтобы получить список активных пользователей и их групп и записать его в таблицу на SQL.Код написан на Visual Basic.Иногда я получаю сообщение об ошибке «На сервере нет такого объекта».Но когда я пытаюсь запустить тот же процесс через 5 минут - все идет хорошо.Другими словами, я не получаю эту ошибку каждый раз, когда запускаю процесс, только изредка.Другая часть проблемы - если я пытаюсь извлечь данные из таблиц sql и создать файл Excel с отчетом - сразу после запуска процесса выше

Я получаю сообщение об ошибке:

Исключение System.AccessViolationException не обработано. HResult = -2147467261 Сообщение = Попытка чтения или записи в защищенную память.Это часто указывает на то, что другая память повреждена.Source = System.Data StackTrace: в System.Data.OleDb.DataSourceWrapper.InitializeAndCreateSession (OleDbConnectionString constr, SessionWrapper & sessionWrapper) в System.Data.OleDb.OleDbConnectionInternal..ctor (OleDbConnection.OdDirectoryConnect)..CreateConnection (опции DbConnectionOptions, DbConnectionPoolKey poolKey, объект poolGroupProviderInfo, DbConnectionPool бассейн, DbConnection owningObject) в System.Data.ProviderBase.DbConnectionFactory.CreateConnection (варианты DbConnectionOptions, DbConnectionPoolKey poolKey, объект poolGroupProviderInfo, DbConnectionPool бассейн, DbConnection owningConnection, DbConnectionOptions userOptions) ...

Если я остановлю обработку, закрою приложение для Windows, снова открою и запущу экспорт только для Excel - работает нормально.Я подумал, что, возможно, память не была освобождена, но у меня есть команды в конце обработки, которые извлекают данные из AD:

dirEntry.Dispose()
dirEntry = Nothing

Есть ли специальные команды для очистки памяти после подключения к AD?Что может быть причиной этих двух спорадических ошибок?Спасибо!

За запрос - добавление частичного кода.- получение списка пользователей и групп, а затем удаление dirEntry:

Public Sub ListAllADUsers (dirEntry As DirectoryEntry) Dim UserList As New Collection () Dim UsernameList As New Collection () Dim oresult As SearchResultCollection

    Dim dirSearcher As DirectorySearcher = New DirectorySearcher("(&(objectCategory=Person)(objectClass=user))")
    dirSearcher.SearchRoot = dirEntry
    dirSearcher.PropertiesToLoad.Add("SAMAccountName")
    dirSearcher.PropertiesToLoad.Add("givenname")
    dirSearcher.PropertiesToLoad.Add("cn")
    dirSearcher.ServerTimeLimit = New TimeSpan(0, 10, 0)
    dirSearcher.PageSize = 10000
    dirSearcher.ClientTimeout = TimeSpan.FromMinutes(12000)

    oresult = dirSearcher.FindAll()
    For Each result In oresult
        If Not result.GetDirectoryEntry.Properties("cn").Value Is Nothing Then
           UserList.Add(result.GetDirectoryEntry.Properties("cn").Value, result.GetDirectoryEntry.Properties("SAMAccountName").Value)
           GetGroupsAD(result.GetDirectoryEntry.Properties("SAMAccountName").Value.ToString(), result.GetDirectoryEntry.Properties("cn").Value.ToString())
            If StopFlag = 1 Then Exit Sub
        End If
    Next

    dirSearcher.Dispose()
End Sub

1 Ответ

0 голосов
/ 12 июня 2018

Хорошо - решено.Были списки коллекций, которые я собирался использовать, но решил не делать этого.Однажды я это закомментировал - все работает нормально.Кто знал, что это может все испортить ??Закрытие.Так что, если кто-то будет использовать мой код - просто удалите коллекции ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...