IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Delphi Discussion :

[WMI] Modifier propriétés


Sujet :

Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Août 2006
    Messages
    185
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 185
    Par défaut [WMI] Modifier propriétés
    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 terrible J'ai réussi a ouvrir un processus par exemple voila la fonction
    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;
    et cela execute cmd
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    setWMI('Win32_Process', 'Create', 'CommandLine', 'cmd')
    après j'ai essayer de mettre mon ip en mettant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    setWMI('Win32_NetworkAdapterConfiguration WHERE Index=0', 'EnableDHCP', '', '')
    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
    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;
    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

  2. #2
    Membre confirmé
    Inscrit en
    Août 2006
    Messages
    185
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 185
    Par défaut
    Personne ne voit comment faire?

  3. #3
    Nouveau candidat au Club
    Inscrit en
    Décembre 2005
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 2
    Par défaut
    Non, mais ça m'intéresse aussi! Quel hazard, juste aujourd'hui que j'en ai besoin

  4. #4
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 492
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 492
    Par défaut
    salut

    as tu essaye un truc du genre

    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
       
      WmiLocator:= TSWbemLocator.Create(nil);
      try
        Screen.Cursor := crAppStart;
        // Connexion WMI (PCName, 'ROOT\CIMV2', UserName, UserPassword, '', '', ...)
        objService := WMILocator.ConnectServer('.', 'ROOT\CIMV2', '', '', '',
                                              '', wbemConnectFlagUseMaxWait, nil);
    
        objInstances := objService.ExecQuery(Requete, 'WQL', 0, Nil);
    
        // Affecte un énumérateur pour la collection d'objet SWbemObject
        ObjectEnumerator:= IUnknown(objInstances._NewEnum) as IEnumVariant;
    
        while (ObjectEnumerator.Next(1, objInstance, NumberItem) = S_OK) do
        begin
           objInstance.Properties_.Item('???').Value := ???;
           objInstance.Put_;
        end;
        
        Screen.Cursor:= crDefault;
      Finally;
        objInstance := Unassigned;
        objInstances:= Unassigned;
        WmiLocator.Disconnect;
        WmiLocator.Free;
      end;

  5. #5
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Billets dans le blog
    1
    Par défaut
    Salut,
    Citation Envoyé par anapurna
    as tu essaye un truc du genre
    C'est presque ça. Dans l'exemple que tu donnes tu itéres sur le résultat alors que le pb ce situe en amont.

    Le code suivant, adapté d'un exemple du tuto WMI,
    WmiProperty := WmiObjectInProperties.Properties_.Item(Item,0);
    ArrayValue := Value;
    ne tient pas compte du fait que la méthode, de l'objet qu'on souhaite manipuler, attend + paramètres.
    Dans l'exemple d'origine un seul paramètre est défini et est suffisant pour la méthode appelée.

    Il faut donc, je n'ai pas eu le temps de tester, itérer sur les paramétres attendus par la méthode de la classe WMI ciblée.
    Le passage des noms de paramétre et leurs valeurs respectives peut se faire via un tableau ouvert (Param, valeurs: Array of const).

    Il est peut préférable d'écrire une classe spécialisée pour ces affectations, classe qui se chargerait également des différents contrôles de validité.

  6. #6
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 492
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 492
    Par défaut
    salut

    tu sous entend un truc du genre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    objMethod := objInstance.Methods_.Item('MaMethode', 0);
       objInParameters := objMethod.InParameters.SpawnInstance_(0);
       objInParameters.Properties_.Item('IPAddress', 0).Set_Value('192.168.51.47');
         ...  
       objResult := objInstance.ExecMethod_('MaMethode', objInParameters, wbemFlagReturnWhenComplete, nil);
    @+ Phil

  7. #7
    Membre confirmé
    Inscrit en
    Août 2006
    Messages
    185
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 185
    Par défaut
    Personne ne voit comment faire?

  8. #8
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 492
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 492
    Par défaut
    salut

    ton objet a t'il des propriete (Variable) directement accessible
    si oui tu devrais pouvoir faire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    objResult := objNetAdapter.Properties_.Item('MaVariable', 0);
    si c'est une methode (procedure ou fonction)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    objResult  :=  objNetAdapter.Methods_.Item('MaMethode', 0);
    @+ Phil

  9. #9
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Billets dans le blog
    1
    Par défaut
    Salut,
    Citation Envoyé par BATiViR
    Personne ne voit comment faire?
    Si on te l'as même indiqué

    Essaie déjà de créer une ou 2 procédures dédiées aux méthodes des classes WMI que tu souhaites manipuler ensuite on verra pour la factorisation...

  10. #10
    Membre confirmé
    Inscrit en
    Août 2006
    Messages
    185
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 185
    Par défaut
    Merci pour vos réponse mais j'ai toujours le même problème après avoir essayer et reverifier ma fonction. Si je résume l'exemple que tu m'as donner et que fai une fonction avec cela me donne
    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
    Function SetWMIConfig(Requete, Properties, Value :String) :integer;
    var
      objWMIService, vValue, objWMIServices : OleVariant;
      iValue : longword;
     
      ObjectEnumerator:    IEnumVariant;
      WmiLocator:          TSWbemLocator;
      WmiService:          SWbemServices;
    begin
      WMILocator:= TSWbemLocator.Create(nil);
     
      Screen.Cursor := crAppStart;
     
      // Connexion WMI (PCName, 'ROOT\CIMV2', UserName, UserPassword, '', '', ...)
      WMIService := WMILocator.ConnectServer('.', 'ROOT\CIMV2', '', '', '',
                                              '', wbemConnectFlagUseMaxWait, nil);
     
      objWMIServices := WMIService.ExecQuery(Requete, 'WQL', 0, Nil);
      ObjectEnumerator := IUnknown(objWMIServices._NewEnum) as IEnumVariant;
     
      while ObjectEnumerator.Next(1,objWMIService,iValue) = 0 do
      begin
        try
        vValue := Value;
        Result := objWMIService.Properties(vValue);
        except
          Result := -1;
        end;
      end;
      objWMIServices := Unassigned;
      objWMIService := Unassigned;
      WMILocator.Disconnect;
      WMILocator.Free;
    end;
    Et j'ai toujours un problème au niveau de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Result := objWMIService.Properties(vValue);
    Properties est égal à 'SetProductKey' par exemple et Requete à 'Select * from Win32_WindowsProductActivation' et value à 'XXXXX-XXXXX-XXXXX-XXXXX-XXXXX'!!! Mais sa me renvoie erreur Properties n'est pas une methode valide et si je met en dure
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Result := objWMIService.SetProductKey(vValue);
    il me renvoie Operation non valide! Cela fonctionne car je l'es fai sous VBScript... Vous voyez l'erreur je suis complétement perdu Je veux juste faire cette fonction pour pouvoir changer toutes mes config avec WMI...

  11. #11
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 492
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 492
    Par défaut
    salut

    je sais plus quoi dire pour qu'il comprenne la syntaxe

    regarde bien ma syntaxe
    est ce que tu trouve que je t'ai ecrit la meme chose ?

    il ne faut surtout pas oublier le _
    a propertie et le item n'est pas n'ont plus anodin

    @+ phil

  12. #12
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par BATiViR
    Cela fonctionne car je l'es fai sous VBScript...
    Communique le nous.
    Citation Envoyé par BATiViR
    mais j'ai vraiment besoin de faire cela....
    Ici il ne s'agit pas de faire mais de comprendre, bon à force ça vas bien finir par tomber en marche

  13. #13
    Membre confirmé
    Inscrit en
    Août 2006
    Messages
    185
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 185
    Par défaut
    voila le VBScript que j'ai créer :
    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
      Dim ProdKey, objWMIItems, Items, result, RE, CheckChaine, test
    ON ERROR RESUME NEXT
     
    ProdKey = "12345-12345-12345-12345-12345"
     
    ChangeKey
     
    Sub ChangeKey
      ProdKey = InputBox("Veuillez entrez la clef de Windows XP Pro MUI SP2","Windows Key",ProdKey)
        If ProdKey = "" Then 
          ProdKey = "Veuillez entrez une clef valide!"
          ChangeKey
        ElseIf ChecKey(ProdKey) Then
          KeyOk
        Else
          ProdKey = "Format Clef invalide!"
          ChangeKey
        End if  
    End Sub
     
    Sub KeyOk
      ProdKey = Replace(ProdKey,"-","")
      For Each Items In GetObject("winmgmts:{impersonationLevel=impersonate}").InstancesOf ("win32_WindowsProductActivation")
        result = Items.SetProductKey(ProdKey)
       if err = 0 then
         WScript.Echo "La clef à été changé avec succès!"
         WScript.Quit
       else
         Err.Clear
       end if
      Next
    End Sub
      ProdKey = "Clef invalide!"
      ChangeKey
     
    Function ChecKey(chaine)
      Set RE = New RegExp
      RE.Pattern = "\w{5}\-\w{5}\-\w{5}\-\w{5}\-\w{5}"
      set CheckChaine = RE.Execute(chaine)
        If CheckChaine.Count = 0 Then
          ChecKey = False
        Else 
          ChecKey = True
        End If
    End Function
    J'ai aussi créer un pour changer l'addresse IP, DNS...
    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
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    Sub sChangePC
     
      strPCName = InputBox("Veuillez entrez le Nom du PC desiré","",strPCName)
        If strPCName = "" Then 
          InfoSys
        Else
          WScript.CreateObject("WScript.Shell").RegWrite "HKLM\SYSTEM\ControlSet001\Control\ComputerName\ComputerName\ComputerName",strPCName,"REG_SZ"
          WScript.CreateObject("WScript.Shell").RegWrite "HKLM\SYSTEM\ControlSet001\Services\Tcpip\Parameters\NV Hostname",strPCName,"REG_SZ"
          WScript.CreateObject("WScript.Shell").RegWrite "HKLM\SYSTEM\ControlSet001\Services\Tcpip\Parameters\Hostname",strPCName,"REG_SZ"
          WScript.CreateObject("WScript.Shell").RegWrite "HKLM\SYSTEM\ControlSet002\Control\ComputerName\ComputerName\ComputerName",strPCName,"REG_SZ"
          WScript.CreateObject("WScript.Shell").RegWrite "HKLM\SYSTEM\ControlSet002\Services\Tcpip\Parameters\NV Hostname",strPCName,"REG_SZ"
          WScript.CreateObject("WScript.Shell").RegWrite "HKLM\SYSTEM\ControlSet002\Services\Tcpip\Parameters\Hostname",strPCName,"REG_SZ"
          WScript.CreateObject("WScript.Shell").RegWrite "HKLM\SYSTEM\CurrentControlSet\Control\ComputerName\ComputerName\ComputerName",strPCName,"REG_SZ"
          WScript.CreateObject("WScript.Shell").RegWrite "HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\NV Hostname",strPCName,"REG_SZ"
          WScript.CreateObject("WScript.Shell").RegWrite "HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Hostname",strPCName,"REG_SZ"
        End if
     
      strWorkgroup = InputBox("Veuillez entrez le Groupe de Travail desiré ou cliquez sur annuler","","")
        If strWorkgroup = "" Then
        Else
          objWMIExec.Run "%SystemRoot%\System32\NetDom.exe MEMBER /JOINWORKGROUP " & UCase(strWorkgroup)
        End if 
        If DetectReseau = 1 Then
          sChangeIP
        Else
          WScript.Quit
        End If
    End Sub
     
    Sub sChangeIP
      strNbrCarte = InputBox(strNbrAllCartes & VbCrLf & VbCrLf & "Veuillez entrez le Numero de la Carte Reseau a Modifier","","1")
        If strNbrCarte = "" Then
          InfoSys
        End if
     
      Reponse = WScript.CreateObject("WScript.Shell").Popup("Voulez-vous activer le DHCP?", , "", vbYesNo + vbDefaultButton1 + vbApplicationModal + vbSystemModal)
        If Reponse = vbYes Then
          Reponse = ""
          set Items = GetObject("winmgmts:Win32_NetworkAdapterConfiguration=" & strNbrCarte)
            errEnable = Items.EnableDHCP()
            strSettingID = Items.SettingID
            WScript.sleep(10000)        
     
          WScript.CreateObject("WScript.Shell").RegWrite "HKLM\SYSTEM\ControlSet001\Services\NetBT\Parameters\Interfaces\Tcpip_" & strSettingID & "\NameServerList","","REG_SZ"
          WScript.CreateObject("WScript.Shell").RegWrite "HKLM\SYSTEM\ControlSet002\Services\NetBT\Parameters\Interfaces\Tcpip_" & strSettingID & "\NameServerList","","REG_SZ"
          WScript.CreateObject("WScript.Shell").RegWrite "HKLM\SYSTEM\CurrentControlSet\Services\NetBT\Parameters\Interfaces\Tcpip_" & strSettingID & "\NameServerList","","REG_SZ"
     
          WScript.CreateObject("WScript.Shell").RegWrite "HKLM\SYSTEM\ControlSet001\Services\Tcpip\Parameters\Interfaces\" & strSettingID & "\NameServer","","REG_SZ"
          WScript.CreateObject("WScript.Shell").RegWrite "HKLM\SYSTEM\ControlSet002\Services\Tcpip\Parameters\Interfaces\" & strSettingID & "\NameServer","","REG_SZ"
          WScript.CreateObject("WScript.Shell").RegWrite "HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces\" & strSettingID & "\NameServer","","REG_SZ"
     
          WScript.CreateObject("WScript.Shell").RegWrite "HKLM\SYSTEM\ControlSet001\Services\Tcpip\Parameters\Interfaces\" & strSettingID & "\EnableDHCP","1","REG_DWORD"
          WScript.CreateObject("WScript.Shell").RegWrite "HKLM\SYSTEM\ControlSet002\Services\Tcpip\Parameters\Interfaces\" & strSettingID & "\EnableDHCP","1","REG_DWORD"
          WScript.CreateObject("WScript.Shell").RegWrite "HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces\" & strSettingID & "\EnableDHCP","1","REG_DWORD"
     
          CheckErr
     
        End if
        If Reponse = vbNo Then
          Reponse = ""
        End if
     
      strAdressIP = InputBox("Veuillez entrez l'Adresse IP","","192.168.98.0")
        If strAdressIP = "" Then 
          InfoSys
        Else 
          strIP = strAdressIP
          strAdressIP = Array(strAdressIP)
        End if  
     
      strSubNetMask = InputBox("Veuillez entrez le Masque de sous-reseau [SubNetMask]","","255.255.255.0")
        If strSubNetMask = "" Then 
          InfoSys
        Else 
          strSubNetMask = Array(strSubNetMask)
        End if 
     
      strGateway = InputBox("Veuillez entrez l'adresse de la Passerelle [Gateway] ou cliquez sur Annuler","",strIP)
     
      strDNS1 = InputBox("Veuillez entrez l'adresse du Serveur DNS Primaire ou cliquez sur Annuler","",strIP)
        if strDNS1 <> "" Then
          strDNS2 = InputBox("Veuillez entrez l'adresse du Serveur DNS Secondaire ou cliquez sur Annuler","",strDNS1)
        End if    
     
    set Items = GetObject("winmgmts:Win32_NetworkAdapterConfiguration=" & strNbrCarte)
      errEnable = Items.EnableStatic(strAdressIP, strSubNetMask)
      if strGateway <> "" Then
        errEnable = Items.setgateways(Array(strGateway))
      End if
      if strDNS2 = "" Then
        errEnable = Items.SetDNSServerSearchOrder(Array(strDNS1))  
      End if 
      if strDNS2 <> "" Then
        errEnable = Items.SetDNSServerSearchOrder(Array(strDNS1, strDNS2))   
      End if
     
      CheckErr
     
    End Sub
     
    Sub CheckErr
     if errEnable = 0 then
         WScript.Quit
       elseif errEnable = 94 then
         WScript.Quit
       else
         WScript.Echo "Erreur : Veuillez recommencer!"
         errEnable.Clear
      end if
    End Sub
    Et un autre pour changer le mot de passe Administrateur-Administrator :
    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
    ON ERROR RESUME NEXT
     
    Dim strPWD, strPCName, strPWDCheck
     
      strPWD = "Entrez le Mot de Passe!"
      PwdSet
     
    Sub PwdSet
    strPWD = InputBox("Veuillez entrez le Mot de Passe desiré","",strPWD)
        If strPWD = "" Then
          PwdSet
        Else
          PwdCheck
        End if
    End Sub
     
    strPCName = WScript.CreateObject("WScript.Shell").RegRead ("HKLM\SYSTEM\CurrentControlSet\Control\ComputerName\ComputerName\ComputerName")
     
    Sub PwdCheck
    strPWDCheck = WScript.CreateObject("WScript.Shell").Popup("Le mot de Passe est-il correct? : " & strPWD, 0, "", vbYesNo)
        If strPWDCheck = vbNo Then
          PwdSet
        End if
    End Sub
     
    set objWMIService = GetObject("WinNT://" & strPCName & "/Administrator")
    objWMIService.SetPassword(strPWD)
     
      if err = 0 then
         WScript.Echo "Mot de Passe changé avec succès!"
         WScript.Quit
      end if
     
      err = 0
     
    set objWMIService = GetObject("WinNT://" & strPCName & "/Administrateur")
    objWMIService.setPassword(strPWD)
     
      if err = 0 then
         WScript.Echo "Mot de Passe changé avec succès!"
         WScript.Quit
      else
         Err.Clear
      end if
     
    strPWD = "Mot de Passe Invalide!"
    PwdSet
    Enfaite je dois faire ces trois script en delphi avec une fonction... Merci pour votre aide

  14. #14
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Billets dans le blog
    1
    Par défaut
    Voici un début :
    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
     
    procedure TForm1.Test;
    var
      WMILocator:          SWbemLocator;
      WmiService:          SWbemServices;
     
      WmiObject:           SWbemObject;
      wmiObjectSet:        SWbemObjectSet;
     
      WmiProperty:         SWbemProperty;
      WmiPropertySet:      SWbemPropertySet;
     
      PropertyEnumerator,
      ObjectEnumerator:    IEnumVariant;
      ArrayVariant:        OleVariant;  // Tableau de variant
      NumberItem:          LongWord;
     
    begin
       WMILocator:= CoSWbemLocator.Create;
     
       // Création d'une connexion à un espace de nom local
       // ici le nom de l'espace de nom cible est : CIMV2
       // L'appel renvoie un pointeur sur un objet SWbemServices
       WmiService:= WMILocator.ConnectServer('.', 'ROOT\CIMV2', '', '', '',
                                             '', wbemConnectFlagUseMaxWait, nil);
     
        // Retrouve, via une requête WQL et dans l'espace de nom courant,
        // une collection d'instance de la classe win32_WindowsProductActivation
        // Pour la licence Windows XP une seule ( 1 par PC )
       WmiObjectSet := WMIService.ExecQuery('SELECT * FROM win32_WindowsProductActivation',
                                            'WQL',
                                            wbemFlagReturnImmediately,
                                            Nil);
     
        // Affecte un énumérateur pour la collection d'objet SWbemObject
       ObjectEnumerator:= (WmiObjectSet._NewEnum) as IEnumVariant;
     
        // Retourne NumberItem éléments dans le tableau ArrayVariant,
        // ici 1 élément est demandé à chaque itération
    // *************************************************
    // ** ici on récupére une instance de la classe WMI
    // *************************************************
      while (ObjectEnumerator.Next(1, ArrayVariant, NumberItem) = S_OK) do
      begin
          // Récupére l'instance
       WmiObject := IUnknown(ArrayVariant) as SWBemObject;
             // Retrouve la collection d'objet WmiProperty contenant toutes les propriétés
             //Voir les propriétés en ReadOnly : http://msdn2.microsoft.com/en-us/library/aa394520.aspx
       WmiPropertySet:= WmiObject.Properties_;
          // Affecte un énumérateur pour la collection d'objet WmiProperty
       PropertyEnumerator:= (WmiPropertySet._NewEnum) as IEnumVariant;
     
         // Aprés l'affectation précédente, on peut réutiliser la variable ArrayVariant
         // ici 1 élément est demandé à chaque itération
    // *************************************************
    // ** ici on récupére une collection à partir de l'instance courante de la classe WMI récupéré précédemment
    // *************************************************
       while (PropertyEnumerator.Next(1, ArrayVariant, NumberItem) = S_OK) do
       begin
    // *********************************************
    // ** ici on récupére l'élément courant de la collection, c'est à dire une propriété -> SWBemProperty
    // *********************************************
     
            // Récupére une propriété
        WmiProperty := IUnknown(ArrayVariant) as SWBemProperty;
         //Affiche le contenue du variant selon son type sous-jacent
        Memo1.Lines.Add(WMIVariantToStr(WmiProperty.Get_Value));
       end;
      end;
    end;
    Concernant ton itération sur les propriétes c'est une erreur car elles sont en lecture seule
    De plus le provider de cette classe n'est implémenté que sous XP.

    Pour le code VBS :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
      For Each Items In GetObject("winmgmts:{impersonationLevel=impersonate}").InstancesOf ("win32_WindowsProductActivation")
        result = Items.SetProductKey(ProdKey)
    Il récupére une instance de la classe WMI recherchée puis appel sa méthode SetProductKey avec le nouvelle clé ProdKey.
    Il te faut donc "juste" adapter le code d'exemple de manipulation de l'appel de méthode indiqué dans le tuto.
    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
     
    procedure TForm1.BTCreateProcessClick(Sender: TObject);
    var
      WMILocator            : ISWbemLocator;
     
      Instance_inParameters : SWbemObject;
     
      WmiProperty           : SWbemProperty;
     
      ProcessMethod         : ISWbemMethod;
     
      WmiObject             : SWbemObject;
      MethodeResultat       : SWbemObject;
      wmiObjectSet          : SWbemObjectSet;
     
     
      PropertyProdKey,
      PropertyReturnValue   : OleVariant;
     
      ObjectEnumerator:    IEnumVariant;
      ArrayVariant:        OleVariant;  // Tableau de variant
      NumberItem:          LongWord;
     
    begin
       WMILocator:= CoSWbemLocator.Create;
     
       WmiService:= WMILocator.ConnectServer('.', 'ROOT\CIMV2', '', '', '',
                                             '', wbemConnectFlagUseMaxWait, nil);
       WmiObjectSet := WMIService.ExecQuery('SELECT * FROM Win32_WindowsProductActivation',
                                            'WQL',
                                            wbemFlagReturnImmediately,
                                            Nil);
     
       ObjectEnumerator:= (WmiObjectSet._NewEnum) as IEnumVariant;
     
      while (ObjectEnumerator.Next(1, ArrayVariant, NumberItem) = S_OK) do
      begin
       WmiObject := IUnknown(ArrayVariant) as SWBemObject;
      end;
     
       Memo1.Lines.Add(AdjustLineBreaks(WmiObject.GetObjectText_(0)));
       //This method is valid only if the ActivationRequired property is equal to 1.
       PropertyReturnValue:= WmiObject.Properties_.Item('ActivationRequired', 0);
       if PropertyReturnValue.Value=0
        then exit;
     
       ProcessMethod:=WmiObject.Methods_.Item('SetProductKey', 0);
     
       Instance_inParameters:= ProcessMethod.InParameters.SpawnInstance_(0);
     
       WmiProperty:= Instance_inParameters.Properties_.Item('ProductKey',0);
     
       PropertyProdKey:= '0-0-0';
        //Renseigne la valeur de la propriété
       WmiProperty.Set_Value(PropertyProdKey);
                    //opération non valide si ActivationRequired=0
       MethodeResultat:= WmiObject.ExecMethod_('SetProductKey', Instance_inParameters, wbemFlagReturnWhenComplete, nil);
     
         // Recupére la valeur de retour de la méthode via la propriété 'ReturnValue'
       PropertyReturnValue:= MethodeResultat.Properties_.Item('ReturnValue', 0);
       {Code de retour :
        ?
        }
     
       if PropertyReturnValue.Value <> 0 then
         MessageBox(0, PChar('Erreur '+inttostr(PropertyReturnValue.Value)),
                    PChar(Form1.Caption), MB_OK);
     
    end;
    C'est du code de test adaptée pour BDS2006. La fin de la méthode est à revoir mais le principe est la.
    Pense à conculter la doc du SDK WMI.

    Un conseil utilise les constantes fournies par la librairie de type ce n'est pas pour rien qu'on les y place.

  15. #15
    Membre confirmé
    Inscrit en
    Août 2006
    Messages
    185
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 185
    Par défaut
    Merci fonctionne nickel ton code... Je vais faire quelques test et essayer de faire une fonction et la posterai ici pour si quelqu'un en aurait besoin... Je peux trouver ou SDK WMI??
    Juste une dernière question, j'ai réussi a changer le nom du PC et le Clef d'activation avec la fonction que j'ai fai a partir de ton code enfaite j'avai déjà fai juste mais comme je ne verifiai pas si l'activation était requi il me renvoyais erreur Bon enfaite maintenant pour changer l'adresse IP, DNS, ... je ne pas me baser sur mon code non?? Et pour changer le mot de passe sa a l'aire d'être totalement different, voila mon VBScript :
    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
    ON ERROR RESUME NEXT
     
    Dim strPWD, strPCName, strPWDCheck
     
      strPWD = "Entrez le Mot de Passe!"
      PwdSet
     
    Sub PwdSet
    strPWD = InputBox("Veuillez entrez le Mot de Passe desiré","",strPWD)
        If strPWD = "" Then
          PwdSet
        Else
          PwdCheck
        End if
    End Sub
     
    strPCName = WScript.CreateObject("WScript.Shell").RegRead ("HKLM\SYSTEM\CurrentControlSet\Control\ComputerName\ComputerName\ComputerName")
     
    Sub PwdCheck
    strPWDCheck = WScript.CreateObject("WScript.Shell").Popup("Le mot de Passe est-il correct? : " & strPWD, 0, "", vbYesNo)
        If strPWDCheck = vbNo Then
          PwdSet
        End if
    End Sub
     
    set objWMIService = GetObject("WinNT://" & strPCName & "/Administrator")
    objWMIService.SetPassword(strPWD)
     
      if err = 0 then
         WScript.Echo "Mot de Passe changé avec succès!"
         WScript.Quit
      end if
     
      err = 0
     
    set objWMIService = GetObject("WinNT://" & strPCName & "/Administrateur")
    objWMIService.setPassword(strPWD)
     
      if err = 0 then
         WScript.Echo "Mot de Passe changé avec succès!"
         WScript.Quit
      else
         Err.Clear
      end if
     
    strPWD = "Mot de Passe Invalide!"
    PwdSet
    Merci 1000fois encore pour ton aide et dsl de te redemander quelque chose mais j'ai vraiment chercher des heures-jours sans succès...

  16. #16
    Membre confirmé
    Inscrit en
    Août 2006
    Messages
    185
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 185
    Par défaut
    désolé j'ai essayer mais je ne comprend pas ce que tu veux dire avec MaVariable ou MaMethode ?? Ma methode je croix est SetProductActivation et après je dois lui mettre comme valeur 'XXXXX-XXXXX-XXXXX-XXXXX-XXXXX'. Je ne vois pas comment faire cela peux-tu détailler un peux s'il te plait, je débute en delphi mais j'ai vraiment besoin de faire cela....

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Modifier propriété imprimante pour impression PDF
    Par seb.49 dans le forum Windows Forms
    Réponses: 1
    Dernier message: 28/01/2008, 20h27
  2. Réponses: 6
    Dernier message: 07/11/2007, 16h58
  3. Modifier propriétés feuille de style
    Par Jiraiya42 dans le forum Général JavaScript
    Réponses: 11
    Dernier message: 12/10/2007, 10h25
  4. Modifier propriéte d'un fichier (commentaire, etc.)
    Par Hypollite76 dans le forum Delphi
    Réponses: 7
    Dernier message: 21/02/2007, 18h33
  5. [C#] Modifier Propriété d'un contrôle d'une autre Form
    Par sara21 dans le forum Windows Forms
    Réponses: 4
    Dernier message: 16/09/2006, 20h41

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo