Есть несколько странных вопросов.Я подключаюсь к 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