[C#] Rookie recursive probleem

Pagina: 1
Acties:

Vraag


Acties:
  • 0 Henk 'm!

  • Carharttguy
  • Registratie: Juli 2010
  • Laatst online: 04-07 23:09
Hallo

Na even wat stilgelegen te hebben ben ik weer wat aan het programmeren gegaan.
Ik zit vast op een ogenschijnlijk simpel probleem.
Ik wil recursief een user zoeken in onze active directory. Maar om de een of andere reden maak ik een gigantische denkfout.

Ik heb nu dit:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public ADUser searchUserInLocation(string username, string path, bool deepSearch)
        {
            DirectoryEntry directoryObject = new DirectoryEntry(path);

            foreach (DirectoryEntry subItem in directoryObject.Children)
            {
                if (subItem.SchemaEntry.Name == "user" && subItem.Properties["samAccountName"].ToString() == username)
                {
                    return new ADUser(subItem);
                }
                if(subItem.SchemaEntry.Name == "organizationalUnit" && deepSearch == true)
                {
                    return searchUserInLocation(username, subItem.Path, true);
                }
            }

            return null;
        }


Maar om een of andere reden gaat die functie alleen in de eerste OU van de Active Directory, eens die overlopen is gaat die naar de laatste regel en stop dit.

Ik overloop de regels via breakpoints en step ins, maar ik zie geen reden waarom deze niet in de tweede OU gaat.

Zie iemand mijn simpele fout?

Hartelijk dank

Edit: Ik denk dat mijn probleem zit in het feit dat een object ook nog iets anders kan zijn, en niet altijd een user of een ou. Maar ik twijfel, want dan zou die toch gewoon naar de volgende ou moeten springen?

[ Voor 8% gewijzigd door Carharttguy op 26-02-2018 12:19 ]

Alle reacties


Acties:
  • 0 Henk 'm!

  • mulder
  • Registratie: Augustus 2001
  • Laatst online: 22:39

mulder

ik spuug op het trottoir

code:
1
else if(subItem.SchemaEntry.Name == "organizationalUnit" && deepSearch == true)

Als deze niet true is gaat de code niet naar de tweede OU, so there's your problem

oogjes open, snaveltjes dicht


Acties:
  • 0 Henk 'm!

  • Carharttguy
  • Registratie: Juli 2010
  • Laatst online: 04-07 23:09
De lijn die deze functie oproept is:

code:
1
UserExistsInOU(username, "LDAP://OU=XXXX,OU=Campus,DC=campus,DC=XXXX,DC=be", true);


Dus deze staat zeker op true. En het rare is, het werkt wel voor de 1ste child in de for, maar andere childs slaat die over.

Acties:
  • 0 Henk 'm!

  • mulder
  • Registratie: Augustus 2001
  • Laatst online: 22:39

mulder

ik spuug op het trottoir

Als de eerst uit de lijst een user is, zal de 2e child niet worden aangeroepen nee. Je doet immers een return.

oogjes open, snaveltjes dicht


Acties:
  • 0 Henk 'm!

  • Haan
  • Registratie: Februari 2004
  • Laatst online: 07:46

Haan

dotnetter

mulder schreef op maandag 26 februari 2018 @ 12:24:
Als de eerst uit de lijst een user is, zal de 2e child niet worden aangeroepen nee. Je doet immers een return.
Maar dat lijkt me ook precies de bedoeling toch?

Verder denk ik dat het door te debuggen toch echt wel inzichtelijk zou moeten worden wat er fout gaat, dus kijk nog eens goed naar subItem.SchemaEntry.Name bijvoorbeeld, of kijk zelf naar de inhoud van directoryObject.Children.

Kater? Eerst water, de rest komt later


Acties:
  • 0 Henk 'm!

  • Carharttguy
  • Registratie: Juli 2010
  • Laatst online: 04-07 23:09
Het viel me daarnet ineens in.

code:
1
2
3
4
if(subItem.SchemaEntry.Name == "organizationalUnit" && deepSearch == true)
                {
                    return searchUserInLocation(username, subItem.Path, true);
                }


Ik mag de user alleen returnen als er effectief een gevonden is.

[ Voor 5% gewijzigd door Carharttguy op 26-02-2018 13:10 ]


Acties:
  • +1 Henk 'm!

  • Russel88
  • Registratie: Juli 2009
  • Laatst online: 06:46
Probeer te debuggen.

Stel dat er in in "directoryObject.Children" de volgende waarden staat: "Janssen", "Afdeling HR", "Visser"
"Afdeling HR" heeft SchemaEntry.Name == "organizationalUnit". Binnenin "Afdeling HR" heb je user "Bouwman"

Wat gebeurt er dan als je op Visser gaat zoeken?
Als je dat weet, dan weet je ook waarom je functie niet werkt.
Pagina: 1