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 :
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 <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>
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.
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>();
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 :
Mais ça marche pas.
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(),
Si vous avez des idées pour régler mon souci, ou pour le contourné...
Merci à vous
Partager