Bonjour à tous,

Voilà je vous explique, je développe un petit programme qui qui effectue un scan sur le réseaux grâce à NMAP qui généré un rapport en XML; mon programme doit juste récupéré les information puis par la suite, les comparées à d'autre info. Le problème c'est que j'ai une exception NullReferenceException.

Donc voici un exemple du fichier généré par NMAP :
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
 
<runnmap>
   <host>
      <address addr="10.x.x.x." addrtype="ipv4"/>
      <address addr="00:00:00:00:00" addrtype="mac"/>
      <hostnames>
         <hostname name="pc1.domain.local"/>
      </hostnames>
      <os>
         <osclass vendor="Microsoft" osfamily="Windows" osgen="XP" accuracy="100"/>
      </os>
   </host>
   <host>
      <address addr="10.x.x.x." addrtype="ipv4"/>
      <address addr="00:00:00:00:00" addrtype="mac"/>
      <hostnames>
         <hostname name="pc2.domain.local"/>
      </hostnames>
      <os>
         <osclass vendor="Panasonic" osfamily="embedded" accuracy="100"/>
      </os>
      </host>
Et voilà mon programme :
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
 
XDocument xmlDoc = XDocument.Load(nmap.xml);
 
            IList<Host> lshost = null;
 
            lshost = (from host in xmlDoc.Root.Elements("host")
                          select new Host
                          {
                              MacAddress = host.Elements("address")
                                          .Where(h => h.Attribute("addrtype").Value == "mac")
                                          .Select(h => h.Attribute("addr").Value)
                                          .FirstOrDefault(),
                              IpAddress = host.Elements("address")
                                          .Where(h => h.Attribute("addrtype").Value == "ipv4")
                                          .Select(h => h.Attribute("addr").Value)
                                          .FirstOrDefault(),
                              Hostname = host.Elements("hostnames")
                                          .Elements("hostname")
                                          .Select(h => h.Attribute("name").Value)
                                          .FirstOrDefault(),
                              OperatingSystem = host.Elements("os")
                                                  .Elements("osclass")
                                                  .Select(h => h.Attribute("osgen").Value)
                                                  .FirstOrDefault(),
                          }
                            ).ToList<Host>();
Si je prends le premier host tout seul, il n'y a pas de souci, mais pour le deuxième, comme il n'y a pas d'attribut "osgen" dans sa balise <osclass> il génère une exception NullReférenceException.

Il n'y a pas un moyen de lui dire si tu trouve pas cette attribut OperatingSystem = "".
J'ai même essayer de faire ça :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
 
OperatingSystem = host.Elements("os")
                                                  .Elements("osmatch")
                                                  .Select(h => h.Attribute("name").Value)
                                                  .DefaultIfEmpty(" ").FirstOrDefault(),
Mais ça marche pas.

Si vous avez des idées pour régler mon souci, ou pour le contourné...

Merci à vous