Forum: PC-Programmierung C# System.directory.services bzw Staticklasse? und Winforms


von csharper (Gast)


Lesenswert?

Hallo in die Runde,

ich habe ein Problem, welches mir seit Stunden die Zeit raubt...


Gegeben ist folgende static Klasse
1
using System;
2
using System.Collections.Generic;
3
using System.Linq;
4
using System.Text;
5
using System.DirectoryServices;
6
7
    public static class ADQuery
8
    {
9
10
        public static string GetHomeFolder()
11
        {
12
            string[] PropertiesToLoad = new string[1];
13
            PropertiesToLoad[0] = "homeDirectory"; //homeDirectory beinhaltet den Pfad des P-Laufwerkes
14
            string filter = "(&(objectCategory=user)(objectClass=user)(cn=" + Environment.UserName + "))";
15
16
            try
17
            {
18
                SearchResultCollection results = p_NewQuery(filter, PropertiesToLoad);
19
20
                if (results != null)
21
                {
22
                    foreach (SearchResult result in results)
23
                    {
24
                        DirectoryEntry directoryObject = result.GetDirectoryEntry();
25
                        return directoryObject.Properties["homeDirectory"].Value.ToString();
26
                    }
27
                }
28
            }
29
            catch { }
30
31
            return null;
32
        }
33
34
35
        private static System.DirectoryServices.SearchResultCollection p_NewQuery(string filter, string[] ptoLoad)
36
        {
37
            //Directorysearcher basteln
38
            DirectoryEntry Dentry = new DirectoryEntry("LDAP://xxxxx.DE");
39
40
            DirectorySearcher dSearcher = new DirectorySearcher(Dentry);
41
            dSearcher.Filter = filter;
42
            
43
            foreach(string property in ptoLoad) //Eigenschaften, welche ausgelesen werden sollen laden.
44
            {
45
            dSearcher.PropertiesToLoad.Add(property); 
46
            }
47
            
48
49
            return dSearcher.FindAll();
50
        }
51
52
    }

Und folgender Aufruf (funktioniert nicht)
Nach Klick auf Winform Button
1
void Button1Click(object sender, EventArgs e)
2
    {
3
      char[] driveletter = new char[1];
4
            driveletter[0] = 'P';
5
            
6
            try
7
            {
8
        NetworkDrive.MapFolder(ADQuery.GetHomeFolder(), driveletter);
9
            }
10
            catch(Exception err)
11
            {
12
              MessageBox.Show(err.Message.ToString() +  " Homefolder-> " + ADQuery.GetHomeFolder());
13
            }
14
    }

Hier wird mir die Exception ungültiges Verzeichnis geworfen und 
ADQuery.GethomeFolder() gibt nur einen leeren String zurück.

Rufe ich ADQuery.GethomeFolder() hier auf erhalte ich allerdings den 
Pfad des Homefolders...:
1
public MainForm()
2
    {
3
      InitializeComponent();
4
    }


Was läuft schief, welchen Kontextwechsel verstehe ich nicht?

von csharper (Gast)


Lesenswert?

Also an Winforms liegt es nicht, habe jetzt auf WPF umgestellt und auch 
dort beobachte ich das gleiche Problem.

Wenn ich einmalig wie hier zu sehen ein AD Query mache, läuft das 
Programm danach problemlos...
1
public MainForm()
2
    {
3
      InitializeComponent();
4
      ADQuery.GetHomeFolder();
5
    }

Woran liegt das?

von Frank L. (Firma: Flk Consulting UG) (flk)


Lesenswert?

Hallo,
Dein GetHomeFolder() läuft wahrscheinlich auf das catch und liefert 
folglich nichts zurück.

Gruß
Frank

von csharper (Gast)


Lesenswert?

Frank L. schrieb:
> Hallo,
> Dein GetHomeFolder() läuft wahrscheinlich auf das catch und liefert
> folglich nichts zurück.
>
> Gruß
> Frank

Fehler gefunden.

Problem war tatsächlich, dass das Projekt auf dem Laufwerk lag, welches 
ich über das Programm gemapped / unmapped habe.

Habe ich zum Programmstart einen ADQuery abgesetzt, so konnte die 
.exe.config noch gelesen werden und wurde gecached.

Wenn ich zur Laufzeit des Programmes den ADQuery abgesetzt habe, so 
konnte diese Config eben nicht mehr gelesen werden und das Catch in der 
ADQueryKlasse hat mir den Fehler unterdrückt.


Danke für den Hinweis, manchmal steht man echt auf dem Schlauch.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.