Bonjour a tous,

Tout d'abord, ce message étant mon premier, je vous remercie pour l'aide que vous apportez sur ce forum et qui m'a plus d'une fois éviter quelques sérieux maux de crânes...

Cependant, j'ai un problème qui m'empêche d'avancer depuis maintenant quelques jours et c'est pourquoi je me permet de poster sur ce forum.

Je vais tout d'abord vous expliquer un petit peu ce que j'essaye de faire : une application de monitoring.

Dans l'entreprise dans laquelle j'effectue un stage, il m'a été demandé de checker certains services/process/accès aux BDD.

Pour cela j'ai choisis une application en WPF.

Mon problème :

je dois checker un total de 84 serveurs situés sur 21 domaines.

Pour que cela ne prenne pas trop de temps, j'ai choisis d'utiliser un threadpool.
Dans ce threadpool, je lance 21 threads ( un par domaine ).

Le problème que j'ai est que pour effectuer ce checks, j'utilise l'impersonation.
Mais je n'arrive pas à gérer de manières parallèle mes connexions aux différents domaines, et le code me retourne l'erreur :

Message : Impossible d'ouvrir le Gestionnaire de contrôle des services sur l'ordinateur 'x.y.z.e'. Cette opération requiert des privilèges supplémentaires.
Je vous donne une partie de mon code pour que vous puissiez un petit peu mieux comprendre car je ne crois pas être très clair.


Ici, je lance mes différents threads.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
 
 
foreach (var domain in domains.ListDomain)
            {
                var tempDomain = domain;
                ThreadPool.QueueUserWorkItem(delegate
                {
                    CheckProcessAndServiceByDomain(tempDomain);
                });
            }

Et voici l'action que se passe dans le threadpool :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
 
 
var serverIp = string.Empty;
                try
                {
                    i.Impersonate(domain.Username, domain.DomainName, domain.Password, Impersonation.LogonType.LOGON32_LOGON_NEW_CREDENTIALS, Impersonation.LogonProvider.LOGON32_PROVIDER_DEFAULT);
 
                    foreach (var server in domain.ListIpServer)
                    {
                        var serverName = string.Concat(domain.DomainName.Split('.')[0], "000", server);
                        serverIp = string.Concat(domain.IpAdressesrange, server);
 
 
                        if (PingServeur(serverIp))
                        {
 
                            var servicesList = ServiceController.GetServices(serverIp).ToList();
                            var processList = Process.GetProcesses(serverIp).ToList();
 
                            listToAdd.AddRange(CheckFreeSpaceByDisk(domain, server, 'c', serverName));
                            listToAdd.AddRange(CheckFreeSpaceByDisk(domain, server, 'd', serverName));
                        }
                        else
                        {
                            listToAdd.Add(string.Format("Le serveur {0} ne répond pas.", serverName));
                            Dispatcher.BeginInvoke(DispatcherPriority.Normal,
                                (ThreadStart)(() => AddChildToTreeView(listToAdd, domain)));
                        }
                    }
 
 
                    Dispatcher.BeginInvoke(DispatcherPriority.Normal,
                                (ThreadStart)(() => AddChildToTreeView(listToAdd, domain)));
                }
                catch (Exception e)
                {
                    try
                    {
                        //TextWriter sw = new StreamWriter("Log.txt");
                        //sw.WriteLine(string.Concat("Une erreur a eu lieu le ", DateTime.Now.ToString("dd MMMM yyyy"),
                        //                           Environment.NewLine, "Message : ", e.Message,
                        //                           Environment.NewLine, "Sur le domaine : ", domain.DomainName,
                        //                           " sur le serveur : ", serverIp));
                        //sw.Close();
 
 
                        using (TextWriter sw = new StreamWriter("Log.txt", true))
                        {
                            sw.WriteLine(string.Concat("Une erreur a eu lieu le ", DateTime.Now.ToString("F"),
                                                   Environment.NewLine, "Message : ", e.Message,
                                                   Environment.NewLine, "Sur le domaine : ", domain.DomainName,
                                                   " sur le serveur : ", serverIp));
                        }
                    }
                    catch (Exception)
                    {
                        Dispatcher.BeginInvoke(DispatcherPriority.Normal,
                                (ThreadStart)(() =>
                                    {
                                        if (messageBox) return;
 
                                        messageBox = true;
                                        var a = MessageBox.Show(
                                            string.Format(
                                                "Une erreur s'est déroule, le programme n'a pas été en état d'écrire le message d'erreur sur le fichier log.txt." +
                                                "{0}{1}Voici le message : {2}{3}{4}{5}Voulez vous fermer le programme ? ",
                                                Environment.NewLine, Environment.NewLine, Environment.NewLine, e.Message,
                                                Environment.NewLine, Environment.NewLine), "Hum, c'est embarassant.", MessageBoxButton.YesNo);
                                        if (a == MessageBoxResult.Yes)
                                            Close();
                                        else
                                            messageBox = false;
                                    }));
 
                    }
                }
            }
            Dispatcher.BeginInvoke(DispatcherPriority.Normal,
                                (ThreadStart)(() =>
                                    {
                                        var compteur = txtHiddent.Text;
                                        var next = int.Parse(compteur) + 1;
                                        txtHiddent.Text = next.ToString();
                                    }));

Voila, je ne sais pas si j'ai bien réussi à me faire comprendre.

Mais j'espère vraiment que vous pourrez m'aider.


Cordialement,

Fabien.