[VB.NET] Recursive registry loop

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Mike2k
  • Registratie: Mei 2002
  • Laatst online: 22-08 11:59

Mike2k

Zone grote vuurbal jonge! BAM!

Topicstarter
Ik probeer een register loop te maken die alle subkeys ophaalt. Het gaat om een programma wat meerdere verbindingen kan openen zoals rdp, ssh, telnet enz.

Ik wil alle opgeslagen verbindingen netjes in een treeview tonen
Alle subkeys hebben een reg_sz "type" welke aanduid wat het is:
Folder
RDP
SSH
Telnet

Als het een folder, kunnen er subkeys in zitten.

Voorbeeld register layout:
Root = HKCU\Software\Phison Technologies\prcm
Daaronder:
connections\
-Test servers (type = folder)
-Windows (type = folder)
-Server1 (type = rdp)
-Server2 (type = rdp)
-Linux (type = folder)
-Server3 (type = ssh)
-Server4 (type = ssh)
-Server5 (type = rdp)

Wat ik wil maken is dat het pogramma door alle subkeys heen loopt en deze toevoegd aan een treeview.
Ik krijg alleen niet voor elkaar dat 'ie daadwerkelijk recursief door alle subkeys heen loopt.

PS: de register acties worden door de clsRegistry class gedaan.
Dat is deze functie
code:
1
2
3
4
5
6
7
8
9
    Public Function getAllSubkeys(ByVal key As String)
        Dim regkey As Microsoft.Win32.RegistryKey = Microsoft.Win32.Registry.CurrentUser.OpenSubKey("Software\Phison Technologies\prcm\" & key)
        Dim arrSubkeys = regkey.GetSubKeyNames
        If arrSubkeys.Count > 0 Then
            Return arrSubkeys
        Else
            Return False
        End If
    End Function


De code die ik nu heb:
RegConnMaster heeft waarde: connections\
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Public Class clsConnections
    Dim regAction As New clsRegistry
    Dim regConnMaster = "connections"
    Dim regConnKey As String = Nothing

    Public Sub loadConnections()
        Dim regConn = regAction.getAllSubkeys(regConnMaster & "\" & regConnKey)
        For Each key In regConn
            If regAction.GetRegVal(regConnMaster & "\" & regConnKey & "\" & key, "type") = "folder" Then
                regConnKey = regConnKey & "\" & key
                'MsgBox("folder " & key)
                'loadConnections()
            Else
                'tvAddConnections(key, regConnKey)
            End If
        Next
        regConn = Nothing
    End Sub


Ik zie het echt even niet meer. Kan iemand me helpen?

You definitely rate about a 9.0 on my weird-shit-o-meter
Chuck Norris doesn't dial the wrong number. You answer the wrong phone.


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Heb je uberhaupt al gedebugged? (Debuggen: Hoe doe ik dat?)

Je kent het 'recursief' principe gezien je topictitel wel maar ik zie nergens iets recursiefs terug in je code :? En heb je al eens gewoon gegoogled?

[ Voor 43% gewijzigd door RobIII op 11-03-2010 19:30 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • Mike2k
  • Registratie: Mei 2002
  • Laatst online: 22-08 11:59

Mike2k

Zone grote vuurbal jonge! BAM!

Topicstarter
hij is op dit moment inderdaad niet recursief omdat ik met een msgbox de waardes van de variabelen controleerde.
Als ik loadconnection() uncomment is hij wel recursief.

You definitely rate about a 9.0 on my weird-shit-o-meter
Chuck Norris doesn't dial the wrong number. You answer the wrong phone.


Acties:
  • 0 Henk 'm!

  • bigbeng
  • Registratie: Augustus 2000
  • Laatst online: 26-11-2021
Als je membervariabelen gebruikt als indicator variabelen voor je recursieve aanroepen, dan ben je niet goed bezig. Regconnkey verandert continu van waarde (en verliest daarbij zijn voorgaande waarde). Ook de manier waarop iedere recursieve aanroep opnieuw met de root begint (regel 7 in jouw voorbeeld) is fout.

Maak regconnkey een parameter voor je methode loadConnections en de waarde van regconnroot de eerste aanroep van je recursieve methode. En while your at it, lees eens wat meer over "variable scope".

[ Voor 7% gewijzigd door bigbeng op 11-03-2010 21:42 ]


Acties:
  • 0 Henk 'm!

  • YakuzA
  • Registratie: Maart 2001
  • Niet online

YakuzA

Wat denk je nou zelluf hey :X

Mike2k schreef op donderdag 11 maart 2010 @ 20:58:
hij is op dit moment inderdaad niet recursief omdat ik met een msgbox de waardes van de variabelen controleerde.
Als ik loadconnection() uncomment is hij wel recursief.
Als je loadconnection() uncomment is hij nog steeds niet recusief.

Misschien een infinite loop, maar niet recursief :)

Basic recursie in pseudocode:
code:
1
2
3
4
5
sub loadkey(Key k)
for each subkey in k.subkeys
  loadkey(subkey)
end for
end sub

Death smiles at us all, all a man can do is smile back.
PSN


Acties:
  • 0 Henk 'm!

  • bigbeng
  • Registratie: Augustus 2000
  • Laatst online: 26-11-2021
Uhm, een recursieve functie is een functie die zichzelf aanroept, dus hij is wel degelijk recursief. Dat ie nooit uit recursie breekt is een verhaal apart.

Acties:
  • 0 Henk 'm!

  • Mike2k
  • Registratie: Mei 2002
  • Laatst online: 22-08 11:59

Mike2k

Zone grote vuurbal jonge! BAM!

Topicstarter
Ik snap het principe van de recursieve functie wel, waar ik op dit moment niet uit kom is het volgende:
Die regConnKey wordt telkens aangevuld met een subkey zodat hij steeds dieper in het register zoekt.
Maar op het moment dat er geen subkeys meer zijn die als folder dienen, moet hij weer 1 level terug om daar verder te gaan, net zolang totdat hij in de root zit: "connections"

Hij krijg ik dat voor elkaar?
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Public Sub loadConnections(ByVal path As String)
        Dim regConn = regAction.getAllSubkeys(path)
        For Each key In regConn
            Dim tmpKeyPath = path + "\" + key
            If regAction.GetRegVal(tmpKeyPath, "type") = "folder" Then
                MsgBox("folder " & key)
                loadConnections(tmpKeyPath)
            Else
                MsgBox("File: " & key)
                'tvAddConnections(key, regConnKey)
            End If
        Next
        regConn = Nothing
    End Sub


Het enige probleem is nu dat als er een lege "folder" is, hij gelijk stopt met lopen...

[ Voor 53% gewijzigd door Mike2k op 11-03-2010 23:44 ]

You definitely rate about a 9.0 on my weird-shit-o-meter
Chuck Norris doesn't dial the wrong number. You answer the wrong phone.


Acties:
  • 0 Henk 'm!

  • Mike2k
  • Registratie: Mei 2002
  • Laatst online: 22-08 11:59

Mike2k

Zone grote vuurbal jonge! BAM!

Topicstarter
Ik ben zelf nog wat aan het debuggen geweest. Bovenstaande code gaat wel vooruit, maar niet meer terug...
  • connections
    • 10.10.1.1 (type = rdp)
    • Productie (type = folder)
      • 10.10.1.2 (type = rdp)
        • Test folder (type = folder)
          • 10.10.1.3 (type = rdp)
      • 10.10.1.4 (type = rdp)
    • Windows servers (type = folder)
    • Test servers (type = folder)
Bovenstaande layout is een voorbeeld van de 'folders' en connecties die aanwezig kunnen zijn in het register. Mijn code gaat op dit moment tot 10.10.1.3 en stopt daarna, terwijl 'ie eigenlijk weer terug moet en verder moet gaan met 10.10.1.4..maar dat krijg ik niet voor elkaar.

Het uiteindelijke doel is om deze structuur in een vb.net treeview te krijgen.

You definitely rate about a 9.0 on my weird-shit-o-meter
Chuck Norris doesn't dial the wrong number. You answer the wrong phone.


Acties:
  • 0 Henk 'm!

  • Alex)
  • Registratie: Juni 2003
  • Laatst online: 21-08 11:20
Dat komt omdat je de huidige locatie in een globale variabele zet buiten de huidige scope. Je sub kijkt dus iedere keer naar die waarde, en update ook die. YakuzA geeft dit ook al aan, en hoe je het moet aanpassen. Zie ook Mike2k's code.

We are shaping the future


Acties:
  • 0 Henk 'm!

Verwijderd

Dit is wel een hele late reactie, maar wie weet komt het iemand nog van pas :)

Je zal via een functie het register op de host moeten aanspreken en alle sleutels + waardes uitlezen.
Daarna zal er een check moeten komen die controleerd of er meerdere folders aanwezig zijn.
Zoja, dan zal de functie opnieuw aangeroepen moeten worden om de volgende folder uit te lezen.

Om je opweg te helpen:

Maak een verbinding met het registry op de host via de RegistryKey.OpenRemoteBaseKey

Tel de gevonden sleutels en doe er iets mee.
Visual Basic .NET:
1
2
3
4
5
   If (environmentKey.GetValueNames().Count > 0) Then       
      For Each Value As String In environmentKey.GetValueNames()
         Dosomething
      Next
End If


Tel daarna de folders in de key waarnaar je geconnect bent en call je functie opnieuw voor de folders.
Visual Basic .NET:
1
2
3
4
5
   If (environmentKey.GetSubKeyNames().Count > 0) Then
      For Each SubKeyName As String In environmentKey.GetSubKeyNames()
         Call function
      Next
End If


Have fun! :9

[ Voor 87% gewijzigd door Verwijderd op 15-08-2016 14:57 ]


Acties:
  • 0 Henk 'm!

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 17:46

Creepy

Tactical Espionage Splatterer

En ook 8)7 omdat een topic van 6 jaar oud daarvoor kicken ook niet echt nodig is ;)

[ Voor 52% gewijzigd door Creepy op 15-08-2016 15:31 ]

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney

Pagina: 1