Bonjour à tous.

Je cherche modifier mon adresse IP en C# en utilisant la WMI.
J'utilise pour ça la méthode EnableStatic de la classe Win32_NetworkAdapterConfiguration.

J'arrive sans problème à définir les paramètres en DCHP (méthode EnableDHCP), définir la passerelle par défaut (SetGateways) et à définir les DNS (SetDNSServerSearchOrder).

Par contre, si je veux définir l'adress IP et le masque de sous réseau (EnableStatic d'après pas mal de docs) je récupère le code d'erreur 0 (tout s'est donc bien passé) mais au lieu d'avoir mon adresse IP, la valeur que j'obtient et celle que l'on à quand on est en DHCP et qu'aucun serveur DHCP n'est pas trouvé (169.254.xxx.xxx et 255.255.0.0 en masque).

Sur pas mal de sujet les gens disent : Désactive l'UAC.
Je n'y croyais pas trop puisque je faisait mes essais en lançant l'appli en tant qu'administrateur, mais bon, j'ai essayé quand même.
Résultat identique.

Est-ce que quelqu'un à une idée sur ce problème ?

Voici un exemple de code : (qui à priori fonctionnerai sous XP mais pas sous Vista, mais n'ayant plus que Vista sous la main...)
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
 
string ifName = "Inconnue";
 
//Spécification de tous les paramètres requis pour créer une connexion avec la classe ConnectionOptions. 
ConnectionOptions aConnectionOptions = new ConnectionOptions();
//Utilisation du namespace WMI dans lequel les opérations de gestion vont être effectuées.
ManagementScope aManagementScope = new ManagementScope(@"\\localhost\root\cimv2", aConnectionOptions);
 
//La classe ObjectQuery représente une requête de gestion qui retourne des instances ou des classes 
System.Management.ObjectQuery aObjectQuery = new System.Management.ObjectQuery("select * from Win32_NetworkAdapterConfiguration where IpEnabled = true");
 
//La classe ManagementObjectSearcher permet d'extraire une collection d'objets de gestion, en fonction de la requête spécifiée lors de son instanciation par le paramètre ObjectQuery ou directement par une string si l'on " code en dur ".
ManagementObjectSearcher aManagementObjectSearcher = new ManagementObjectSearcher(aManagementScope, aObjectQuery);
 
//ManagementObjectCollection représente différentes collections d'objets de gestion extraits via WMI. 
ManagementObjectCollection aManagementObjectCollection = aManagementObjectSearcher.Get();
 
//ManagementObject est un objet de gestion de données.
string text = "";
if (aManagementObjectCollection != null)
{
	foreach (ManagementObject aManagementObject in aManagementObjectCollection)
	{
		if (aManagementObject["Description"] != null)
		{
			ifName = aManagementObject["Description"].ToString();
		}
 
		string[] ipArray = { "192.168.0.100" };
		string[] subnetArray = { "255.255.255.0" };
		string[] defaultGatewayArray = { "192.168.0.50" };
		UInt16[] gatewayMetricsArray = { 1 };
		string[] dnsServersArray = { "194.2.0.20", "194.2.0.50" };
		object[] param = { ipArray, subnetArray };
 
		// Passer en ip Statique, et définir une nouvelle IP et un nouveau masque de sous réseau (ne fonctionne pas)
		ManagementBaseObject outParams = null;
		ManagementBaseObject inParams = aManagementObject.GetMethodParameters("EnableStatic");
		inParams["IPAddress"] = ipArray;
		//inParams["IPAddress"] = "192.168.0.100";
		inParams["SubnetMask"] = subnetArray;
		outParams = aManagementObject.InvokeMethod("EnableStatic", inParams, null);
		//object t = aManagementObject.InvokeMethod("EnableStatic", param);
		// Affiche le code d'erreur 0 = OK, sans redémarrage requis du PC, pourtant l'adresse devient 169.254.xxx.xxx/16
		MessageBox.Show(outParams["returnValue"].ToString(), "EnableStatic");
 
		// Définir la passerelle par défaut (fonctionne)
		inParams = aManagementObject.GetMethodParameters("SetGateways");
		inParams["DefaultIpGateway"] = defaultGatewayArray;
		inParams["GatewayCostMetric"] = gatewayMetricsArray;
		outParams = aManagementObject.InvokeMethod("SetGateways", inParams, null);
		MessageBox.Show(outParams["returnValue"].ToString(), "SetGateways");
 
		// Remttre en DHCP (fonctionne)
		inParams = aManagementObject.GetMethodParameters("EnableDHCP");
		outParams = aManagementObject.InvokeMethod("EnableDHCP", inParams, null);
		MessageBox.Show(outParams["returnValue"].ToString());
 
	}
}
Donc voilà, j'ai lu pas mal de trucs, et là j'avoue que je sèche...
Merci pour votre aide.