2016-07-03 14 views
-1

Ich erhalte eine Fehlermeldung:Eine nicht behandelte Ausnahme des Typs ‚System.AccessViolationException‘ aufgetreten in System.DirectoryServices.dll

An unhandled exception of type 'System.AccessViolationException' occurred in System.DirectoryServices.dll

zufällig während eine Handvoll Benutzer bewegt.

Es ist seltsam, es scheint keinen Sinn zu geben, wenn sie auftreten, ich habe es in einem TRY und aus irgendeinem Grund in letzter Zeit begann es die App zu stürzen. Im Debugger werden sie angezeigt, Sie können über sie weiterarbeiten und den Thread beenden, die "Fehler" -Aktionen funktionieren und führen die Bewegung im nächsten Zyklus erneut aus.

< --Code es Snip ->

If Action_Exe = "Update" Then 
    If IsDBNull(Processing_DataResults.Rows.Item(Master_Loop)(16)) Then 
     Trace.WriteLine("Error in datatable. NULL found.") 
     Trace.WriteLine("Record: " & Master_Loop) 
     Trace.WriteLine("User: " & Processing_DataResults.Rows.Item(Master_Loop)(1)) 
     Trace.WriteLine("AD Current Path: " & newUser.Path) 
     'Update to try again 
     CycleSQLQUERY.CommandText = "UPDATE [dbo].[AMS_Processing_Table] SET [Process_FLAG] = 3 WHERE [TrackingID] = '" & Processing_DataResults.Rows.Item(Master_Loop)(0).ToString & "';" 
     WinEventLog.WriteEntry("Account Processing Thread: Null Var Found in Datatable. - " & Processing_DataResults.Rows.Item(Master_Loop)(1) & "-" & Master_Loop, EventLogEntryType.FailureAudit, 1614) 
     Continue For 
    End If 
    Trace.WriteLine("OLD: " & Replace(newUser.Path, newUser.Name & ",", "")) 
    Trace.WriteLine("New: " & LDAPSpecial & Replace(Processing_DataResults.Rows.Item(Master_Loop)(16), "/", "\/")) 
    If LCase(Replace(newUser.Path, newUser.Name & ",", "")) <> LCase(LDAPSpecial & Replace(Processing_DataResults.Rows.Item(Master_Loop)(16), "/", "\/")) Then 
     Thread.Sleep(100) 
     Dim UserObjPath As String = newUser.Path 
     Dim SuccessfulMove As Boolean = True 
     Try 
      newUser.MoveTo(New DirectoryEntry(LDAPSpecial & Replace(Processing_DataResults.Rows.Item(Master_Loop)(16), "/", "\/"))) 
     Catch CatchALL As Exception 
      Trace.WriteLine(CatchALL.GetType) 
      Trace.WriteLine("OLD: " & Replace(newUser.Path, newUser.Name & ",", "")) 
      Trace.WriteLine("New: " & LDAPSpecial & Replace(Processing_DataResults.Rows.Item(Master_Loop)(16), "/", "\/")) 
      WinEventLog.WriteEntry("Account Processing Thread: Failed to move user object in AD. - " & Processing_DataResults.Rows.Item(Master_Loop)(1) & " - " & CatchALL.Message & "; OLD: " & LCase(Replace(newUser.Path, newUser.Name & ",", "")) & "; NEW:" & LCase(LDAPSpecial & Replace(Processing_DataResults.Rows.Item(Master_Loop)(16), "/", "\/")), EventLogEntryType.FailureAudit, 1611) 
      SuccessfulMove = False 
      CycleSQLQUERY.CommandText = "UPDATE [dbo].[AMS_Processing_Table] SET [Process_FLAG] = 3 WHERE [TrackingID] = '" & Processing_DataResults.Rows.Item(Master_Loop)(0).ToString & "';" 
      Try 
       CycleSQLQUERY.ExecuteNonQuery() 
      Catch ex_SQL As Exception 
       'addin 5/3/16 
      End Try 
      Continue For 
     End Try 
     If SuccessfulMove = True Then 

     Dim ChangeLineCount As Int64 

Alle aber, Anregungen, Tipps oder Korrekturen würden sehr geschätzt. Dies ist eine Multi-Thread-Anwendung, insbesondere dieser Teil. Ich habe versucht, die Anzahl der Threads und das gleiche Problem zu wählen.

+0

Es scheint, Sie können nicht fett Code. Der Ort, an dem der Fehler auftritt, ist auf ** newUser.MoveTo (Neuer DirectoryEntry (LDAPSpecial & Replace (Processing_DataResults.Rows.Item (Master_Loop) (16), "/", "\ /")) ** –

+0

Ein Code Block ist aus einem Grund ein Codeblock. :) –

+0

Niemand? : -/ nun, ich bin froh, dass ich nicht der Einzige bin, der es schwierig gefunden hat. –

Antwort

0

Also, ich habe gefunden, was mein Problem war, wenn jemand anderes in diese läuft. Was passierte, war früher in dem Code, den ich mit AD (mit nur dem Domain-Namen) später im Code verbinde, wenn die Operation eine Bewegung war, würde sie den obigen Code ausführen und eine neue Verbindung zu AD erstellen. Wenn Sie eine Verbindung zum Active Directory herstellen, wird ein verfügbarer Domänencontroller ausgewählt (gewünschte Aktion). Dies ist hilfreich, wenn ein DC ausfällt oder die Last zu groß ist, um die zusätzliche Last zu bewältigen. Wie auch immer, die zweite Verbindung würde sich manchmal mit einem anderen DC verbinden. Es würde Fehler geben, wenn sich beide Verbindungen nicht auf demselben DC befinden, höchstwahrscheinlich, weil die Änderungen noch nicht zu dieser DC repliziert worden waren, da sie gerade erst vor weniger als einer Sekunde stattgefunden hatten. Also, meine Lösung für das Problem ist, dass ich lade, welche DC die erste Verbindung verwendet, indem Sie dnshostname von LDAP ziehen und das in der zweiten Verbindung verwenden.