Bonjour a tous,
je suis entrain de créer une application qui récupère des infos de windows et permet de les changer (ip, date, nom du pc, domaine, ...). J'ai réussi a recuperer toutes les infos via WMI sans problème en lisant l'excellent tuto http://laurent-dardenne.developpez.c...es/wmi-p2/#L13 . Maintenant le gros problème est de changer les propriétés : domaine, nom du pc, adresse IP fixe ou dhcp, ... J'ai déjà créer un script vb qui effectue cela, mais l'interface et la gestion des erreurs pas terribleJ'ai réussi a ouvrir un processus par exemple voila la fonction
et cela execute cmd
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 function setWMI(Requete, Properties, Item, Value : String) :Integer; var WmiLocator: TSWbemLocator; WmiService: SWbemServices; WmiObject, WmiObjectInProperties, WmiObjectOut: SWbemObject; WmiObjectMethod: ISWbemMethod; WmiProperty: SWbemProperty; ArrayVariant, ArrayValue: OleVariant; begin WmiLocator:= TSWbemLocator.Create(nil); try Screen.Cursor := crAppStart; // Connexion WMI (PCName, 'ROOT\CIMV2', UserName, UserPassword, '', '', ...) WmiService := WMILocator.ConnectServer('.', 'ROOT\CIMV2', '', '', '', '', wbemConnectFlagUseMaxWait, nil); WmiObject := WmiService.Get(Requete, 0, Nil); WmiObjectMethod := WmiObject.Methods_.Item(Properties, 0); WmiObjectInProperties := WmiObjectMethod.InParameters.SpawnInstance_(0); WmiProperty := WmiObjectInProperties.Properties_.Item(Item,0); ArrayValue := Value; WmiProperty.Set_Value(ArrayValue); WmiObjectOut := WmiObject.ExecMethod_(Properties, WmiObjectInProperties, wbemFlagReturnWhenComplete, Nil); ArrayVariant := WmiObjectOut.Properties_.Item('ReturnValue', 0); Result := ArrayVariant.Value; Screen.Cursor:= crDefault; Finally; WmiLocator.Disconnect; WmiLocator.Free; end; end;
après j'ai essayer de mettre mon ip en mettant
Code : Sélectionner tout - Visualiser dans une fenêtre à part setWMI('Win32_Process', 'Create', 'CommandLine', 'cmd')
mais m'as renvoyer erreur alors j'ai essayer plusieurs autres sans succès. J'ai chercher sur internet et trouver un code qui fonctionnai plus ou moin bien mais qui a l'aire d'être asser bizarrement fais. Voila la fonction :
Code : Sélectionner tout - Visualiser dans une fenêtre à part setWMI('Win32_NetworkAdapterConfiguration WHERE Index=0', 'EnableDHCP', '', '')
Result := ArrayVariant.Requete(value) ne fonctionne pas car Requete n'est pas une methode mais si on le remplace par Result := ArrayVariant.EnableDHCP(); cela fonctionne parfaitement! Mais le code est asser bizard... Quelqu'un connais une bonne solution ou une fonction?? Merci d'avance a tous
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 function setExecWMI(Requete, Properties, Value :String) :Integer; var WmiLocator: TSWbemLocator; WmiService: SWbemServices; ArrayVariant: OleVariant; ObjectEnumerator: IEnumVariant; NumberItem: LongWord; begin WmiLocator:= TSWbemLocator.Create(nil); try Screen.Cursor := crAppStart; // Connexion WMI (PCName, 'ROOT\CIMV2', UserName, UserPassword, '', '', ...) WmiService := WMILocator.ConnectServer('.', 'ROOT\CIMV2', '', '', '', '', wbemConnectFlagUseMaxWait, nil); ArrayVariant := WmiService.ExecQuery(Requete, 'WQL', 0, Nil); // Affecte un énumérateur pour la collection d'objet SWbemObject ObjectEnumerator:= IUnknown(ArrayVariant._NewEnum) as IEnumVariant; while (ObjectEnumerator.Next(1, ArrayVariant, NumberItem) = S_OK) do begin Result := ArrayVariant.Requete(value); end; Screen.Cursor:= crDefault; Finally; ArrayVariant := Unassigned; WmiLocator.Disconnect; WmiLocator.Free; end; end;
Partager