2016-07-27 28 views
0

Ich habe ein Tool (mit Visual Studio 2015 Express - Visual Basic) erstellt, das die Mcafee-Datenversion und das Datum aus der Registrierung auf Computern überprüft Eingabe entweder manuell, in einer Textdatei oder ausgewählt aus dem Active Directory. Das Tool funktioniert erfolgreich alle Informationen für 714 von 970 Computern/Laptops zurückgegeben. Die meisten Fehler waren entweder, weil sie nicht in DNS aufgelöst werden konnten oder nicht pingbar waren, und die Tools identifizieren diese und protokollieren sie erfolgreich. Es dauerte etwas über 15 Minuten, bis das Tool die Informationen abgerufen und in einer Tabelle gespeichert hatte. Das Problem ist, dass auf 19 der Ausfälle habe ich eine der beiden folgenden Fehler und jene 19 nahm die Mehrheit der 15 Minuten für das Werkzeug erhalten und melden Sie sich alle Informationen:Timer zum Überspringen zum Verbinden mit dem nächsten Computer für jede Schleife bei Remoteverbindung mit RegistryKey.OpenRemoteBaseKey

  1. Versuchte einen nicht autorisierten Vorgang auszuführen

  2. der Netzwerkpfad wurde nicht

    gibt es eine Möglichkeit der Verwendung eines Timers, so dass das Programm versucht, auf die Registrierung an dieser Stelle zu verbinden ... rk1 = RegistryKey.OpenRemoteBaseKey (RegistryHive.LocalMachine gefunden, strComputer, RegistryView.Registry64) und dann nach einer bestimmten Zeit stoppen und zum nex verschieben t Computer in der für jede Schleife? Ich habe nur für etwas mehr als ein Jahr programmiert und ich habe ausschließlich durch Versuch/Irrtum und Google gelernt, also bitte haben Sie Geduld mit mir, da ich kein erfahrener Programmierer bin. Hier ist der Code:

Das Programm funktioniert gut, mein Ziel ist es zu verbessern, indem es an den nächsten Computer überspringen, wenn es über einen längeren Zeitraum hängt. Ich habe die Computer herausgefiltert, die in DNS nicht aufgelöst werden können oder nicht pingable sind.

For Each sel In picker.SelectedObjects 
     Try 
     If HostIsResolvable(sel.Name) Then 
      Try 
       reply = ping.Send(sel.Name, 1) 
       If reply.Status = IPStatus.Success Then 
        IPAddr = reply.Address.ToString() 
        Try 
        comsys(sel.Name) 
        Dim rk1 As RegistryKey 
        Dim rk2 As RegistryKey 
        rk1 = RegistryKey.OpenRemoteBaseKey 
        (RegistryHive.LocalMachine, sel.Name, 
        RegistryView.Registry64) 
        rk2 = rk1.OpenSubKey 
        ("SOFTWARE\Wow6432Node\McAfee\AVEngine") 
        mAV = rk2.GetValue("AVDatVersion").ToString 
        mAD = rk2.GetValue("AVDatDate").ToString 
        objExcel.Cells(y, 1) = sel.Name 
        objExcel.Cells(y, 2) = IPAddr 
        objExcel.Cells(y, 3) = commodel 
        objExcel.Cells(y, 4) = comuser 
        objExcel.Cells(y, 5) = "DAT Version Number: " & mAV 
        objExcel.Cells(y, 6) = "DAT Date: " & mAD 
        y = y + 1 
        Catch ex As Exception 
        My.Computer.FileSystem.WriteAllText(Dell 
        & "\McAfeeDATeNumFailed.txt", sel.Name & "-Unable to 
        connect. Make sure this computer is on the network, 
        has remote administration enabled, and that both 
        computers are running the remote registry service. 
        Error message: " & ex.Message & vbCrLf, True) 
        End Try 
       Else 
        My.Computer.FileSystem.WriteAllText(Dell 
        & "\McAfeeDATeNumFailed.txt", sel.Name & " is not 
        pingable! " & vbCrLf, True) 
       End If 

      Catch ex As Exception 
        My.Computer.FileSystem.WriteAllText(Dell 
        & "\McAfeeDATeNumFailed.txt", sel.Name & "Ping error: 
        Unable to connect. Make sure this computer is on the 
        network, has remote administration enabled, and that 
        both computers are running the remote registry 
        service. Error message: " & ex.Message & vbCrLf, True) 
      End Try 
      Else 
      My.Computer.FileSystem.WriteAllText(Dell 
      & "\McAfeeDATeNumFailed.txt", sel.Name & " could not be 
      resolved in DNS! " & vbCrLf, True) 
      End If 
     Catch ex As Exception 
      My.Computer.FileSystem.WriteAllText(Dell 
      & "\McAfeeDATeNumFailed.txt", sel.Name & "DNS error: Unable to 
      connect. Make sure this computer is on the network, has remote 
      administration enabled, andd that both computers are running the 
      remote registry service. Error message: " & ex.Message & 
      vbCrLf, True) 
     End Try 
     sel = Nothing 
    Next 

Antwort

0

Sie müssen Ihre Anfrage in einen anderen Thread stellen. Dieser Thread kann abgebrochen werden.

Sub Main() 
    Dim thrd As New Thread(AddressOf endlessLoop) 'thread with your sub 
    thrd.Start() 'Start thread 
    thrd.Join(1000) 'Block until completion or timeout 

    If thrd.IsAlive Then 
     thrd.Abort() 'abort thread 
    Else 
     'thread finished already 
    End If 

End Sub 

Sub endlessLoop() 
    Try 
     While True 
      'Your Code 
     End While 
    Catch ex As ThreadAbortException 
     'Your code when thread is killed 
    End Try 
End Sub 

Hoffe, das hilft.

‚***** EDIT *** Ihr Code wie folgt aussehen könnte (ich nicht geprüft habe, ob es irgendwelche Variablen in Sub passieren sind)

For Each sel In picker.SelectedObjects 
    Try 
     If HostIsResolvable(sel.Name) Then 
      Try 
       reply = ping.Send(sel.Name, 1) 
       If reply.Status = IPStatus.Success Then 
        IPAddr = reply.Address.ToString() 
        call timerThread 'New 
       Else 
        My.Computer.FileSystem.WriteAllText(Dell 
        & "\McAfeeDATeNumFailed.txt", sel.Name & " is not 
        pingable! " & vbCrLf, True) 
       End If 

      Catch ex As Exception 
       My.Computer.FileSystem.WriteAllText(Dell 
       & "\McAfeeDATeNumFailed.txt", sel.Name & "Ping error: 
       Unable to connect. Make sure this computer is on the 
       network, has remote administration enabled, and that 
       both computers are running the remote registry 
       service. Error message: " & ex.Message & vbCrLf, True) 
      End Try 
     Else 
     My.Computer.FileSystem.WriteAllText(Dell 
     & "\McAfeeDATeNumFailed.txt", sel.Name & " could not be 
     resolved in DNS! " & vbCrLf, True) 
     End If 
    Catch ex As Exception 
     My.Computer.FileSystem.WriteAllText(Dell 
     & "\McAfeeDATeNumFailed.txt", sel.Name & "DNS error: Unable to 
     connect. Make sure this computer is on the network, has remote 
     administration enabled, andd that both computers are running the 
     remote registry service. Error message: " & ex.Message & 
     vbCrLf, True) 
    End Try 
    sel = Nothing 
Next 



Sub timerThread() 
    Dim thrd As New Thread(AddressOf registryRequest) 'thread with your sub 
    thrd.Start() 'Start thread 
    thrd.Join(15000) 'Block until completion or timeout (15 seconds) 

    If thrd.IsAlive Then 
     thrd.Abort() 'abort thread 
    Else 
     'thread finished already 
    End If 
End Sub 

Sub registryRequest() 
    Try 
     comsys(sel.Name) 
     Dim rk1 As RegistryKey 
     Dim rk2 As RegistryKey 
     rk1 = RegistryKey.OpenRemoteBaseKey 
     (RegistryHive.LocalMachine, sel.Name, 
     RegistryView.Registry64) 
     rk2 = rk1.OpenSubKey 
     ("SOFTWARE\Wow6432Node\McAfee\AVEngine") 
     mAV = rk2.GetValue("AVDatVersion").ToString 
     mAD = rk2.GetValue("AVDatDate").ToString 
     objExcel.Cells(y, 1) = sel.Name 
     objExcel.Cells(y, 2) = IPAddr 
     objExcel.Cells(y, 3) = commodel 
     objExcel.Cells(y, 4) = comuser 
     objExcel.Cells(y, 5) = "DAT Version Number: " & mAV 
     objExcel.Cells(y, 6) = "DAT Date: " & mAD 
     y = y + 1 
    Catch ex As ThreadAbortException 
     My.Computer.FileSystem.WriteAllText(Dell 
     & "\McAfeeDATeNumFailed.txt", sel.Name & "-Unable to 
     connect. Make sure this computer is on the network, 
     has remote administration enabled, and that both 
     computers are running the remote registry service. 
     Error message: " & ex.Message & vbCrLf, True) 
    End Try 
End Sub 
+0

Danke für die Antwort. Sollte dies eine Funktion sein, damit der Registrierungswert zurückgegeben und die Tabelle aktualisiert werden kann? –

+0

Hallo, ich denke der lange Teil von dir Code ist in der zweiten Versuchserklärung. Sie könnten dies in "endlessLoop" kopieren und den Kommentar "Ihr Code" ersetzen. Rufen Sie dann 'Main' anstelle der try-Anweisung auf. Der Fangteil von try könnte kopiert werden, um einen Teil von endlessLoop zu fangen. Sorry für schlechtes Format, aber Beantwortung per Smartphone. – pLurchi

+0

Und bitte manipulieren Sie die Anweisung thrd.join. Dies ist die Wartezeit bis zum Abbruch der Anfrage in Millisekunden. – pLurchi

0

Dies funktioniert gut, aber ich bin sicher, dass es verbessert werden kann, also bitte antworten Sie mit Vorschlägen, wenn Sie sie haben. Hier ist der Code:

Versuchen

Dim source1 As New CancellationTokenSource

Dim-Token als CancellationToken = source1.Token

Dim T20 Als Aufgabe = Task.Factory.StartNew (function() getping ((sel.Name), Token))

T20.Wait (30)

Wenn T20.Status = Taskstatus.Laufen Dann

source1.Cancel() 

My.Computer.FileSystem.WriteAllText(Dell & "\McAfeeDATeNumFailed.txt", sel.Name & " Ping timed out. The task was disposed of at " & ex_time & "." & vbCrLf & vbCrLf, True) 

End If

Dim source2 As New CancellationTokenSource

Dim token2 Wie CancellationToken = source2.Token

Dim T21 Als Aufgabe = Task.Factory.StartNew (function() Comsys ((sel.Name), token2))

T21.Wait (500)

Wenn T21.Status = TaskStatus.Running Dann

source2.Cancel() 

My.Computer.FileSystem.WriteAllText(Dell & "\McAfeeDATeNumFailed.txt", sel.Name & " RPC error. The task was disposed of at " & ex_time & "." & vbCrLf & vbCrLf, True) 

End If

Dim SOURce3 As New CancellationTokenSource

Dim token3 Wie CancellationToken = source3.Token

Dim T22 als Aufgabe = Aufgabe .Factory.StartNew (Funktion() getregvalues ​​((sel.Name), token3))

T22.Wait (600)

Wenn T22.Status = TaskStatus.Running Dann

source3.Cancel() 

My.Computer.FileSystem.WriteAllText(Dell & "\McAfeeDATeNumFailed.txt", sel.Name & " Error retrieving registry value. The task was disposed of at " & ex_time & "." & vbCrLf & vbCrLf, True) 

End If

IPAddr = reply.Address.ToString()

objExcel.Cells (y, 1) = sel. nennen

objExcel.Cells (Y, 2) = IPAddr

objExcel.Cells (y, 3) =

Nachtstuhl

objExcel.Cells (y, 4) = comuser

objExcel.Cells (y, 5) = "DAT Versionsnummer:" & MAV

objExcel.Cells (y, 6) = „Datum DAT : "& mad

y = y + 1

IPAddr = Nothing

Antwort = Nothing

commodel = Nothing

comuser = Nothing

sel = Nothing

Thread.Sleep (10)

Fang ex As Exception

End Try

+0

Sie könnten eine Schleife schreiben, anstatt zuerst zu warten. Verringern Sie die Wartezeit und wiederholen Sie die Schleife mehrmals. Wenn running = true, dann exit loop. Dies wird Ihre Zeit verringern. – pLurchi

0

Ich werde versuchen, das und Zeit es in beide Richtungen.Ich habe einen fortfahren für hier hinzugefügt und es von 6 und einer halben Minute auf 3 und eine halbe Minute runtergeschnitten (wenn es nicht pingbar war, dann gehe zum nächsten Computer, anstatt die anderen 2 Aufgaben auszuführen).

Wenn T20.Status = TaskStatus.Running Dann

source1.Cancel()

Weiter Für

End If

0

ich die Wartezeit zu einer Schleife zu ändern begonnen und ich erinnerte mich dass es so lange dauert, bis die Remote-Informationen erfolgreich abgerufen werden und in Excel übergehen, ohne dass Daten in der Excel-Tabelle verloren gehen. Zum Beispiel habe ich die Zeit auf 10 ms reduziert und einige der Computer reagierten nicht schnell genug auf den Ping, so dass der Computer und seine Informationen nicht zur Tabelle hinzugefügt wurden. Ebenso reduzierte ich die ms in der Registrierungsaufgabe, und die Registrierungsinformationen für diesen Computer fehlten in der Tabelle.