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

VBScript Discussion :

CreateObject avec indication de l'exe ?


Sujet :

VBScript

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 66
    Par défaut CreateObject avec indication de l'exe ?
    Bonjour,

    Je souhaite instancier un objet application en choisissant l'executable.

    Plus précisément, l'application dont je parle est Impromptu (Cognos). Elle est constituée de deux exécutables "impromptu Administrateur" (impadmin.exe) et "impromptu Utilisateur" (impuser.exe). Les deux ".exe" ont le même n° de version (cer4).

    Si je fais CreateObject("cognosimpromptu.application.cer4"), c'est "impromptu Utilisateur" qui est lancé car la clé de registre "CognosImpromptu.Application.cer4" pointe vers impuser.exe (et cela parceque la version utilisateur a été installée après la version administrateur !).

    D'où ma question: comment forcer le démarrage de la version administrateur lors du createobject ?

    J'espère que ma question est assez claire...

    Merci d'avance pour votre aide !
    Drooxy

  2. #2
    Membre éclairé
    Inscrit en
    Septembre 2009
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 63
    Par défaut
    En changeant la clef de registre qui contient le chemin d'acces de l'exe:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Set WshShell = WScript.CreateObject("WScript.Shell")
    WshShell.RegWrite "TACLEF\DE\REGISTRE","C:\PATH\impadmin.exe","REG_SZ"

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 66
    Par défaut
    Merci pour ta réponse.

    Le problème est que sur les environnements de production je n'aurai très probablement pas le droit de modifier la base de registre...

    Drooxy

  4. #4
    Membre éclairé
    Inscrit en
    Septembre 2009
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 63
    Par défaut
    Bizarre pour quelqu'un qui est sensé travailler comme "administrateur'.


    Si ce n'est pas pour changer le registre, je ne vois pas à quoi ça sert...

  5. #5
    Rédacteur
    Avatar de omen999
    Profil pro
    Inscrit en
    Février 2006
    Messages
    1 302
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 1 302
    Par défaut
    salut,
    manifestement, les concepteurs n'ont pas imaginé que les deux versions pouvaient être installées sur la même machine
    dernière solution: vérifier avec un objet viewer si le clsid de la version admin est différent de la version utilisateur
    si c'est le cas, un script exécuté dans un environnement windows script file (*.wsf) pourra faire la différence
    car il est capable d'instancier un objet également à partir du clsid et non du seul progid
    exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <job>
    <object id="oFileSystem" classid="clsid:0D43FE01-F093-11CF-8940-00A0C9054228"/>
    <script language="VbScript">
    set oDrive = oFileSystem.GetDrive("C:")
    msgbox FormatNumber(oDrive.FreeSpace/1024,0)
    </script>
    </job>
    nomen omen, nemo non omen - Consultez la FAQ VBScript et les cours et tutoriels VBScript
    le plus terrible lorsqu'une voiture renverse un piéton, c'est que ce sont les freins qui hurlent. (ramón)
    pas de questions techniques par mp

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 66
    Par défaut
    Merci à tous les deux.

    Je vais regarder cette dernière piste.

    Je me demandais toutefois s'il était possible de lancer "impadmin.exe" grâce à un "run" (ou à un "exec") puis de récupérer l'objet par un "GetObject"... mais je n'ai rien trouvé de tel...

    Amicalement.
    Drooxy

  7. #7
    Rédacteur
    Avatar de omen999
    Profil pro
    Inscrit en
    Février 2006
    Messages
    1 302
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 1 302
    Par défaut
    Je me demandais toutefois s'il était possible de lancer "impadmin.exe" grâce à un "run" (ou à un "exec") puis de récupérer l'objet par un "GetObject"... mais je n'ai rien trouvé de tel...
    c'est effectivement une solution si le serveur com impadmin.exe met à jour systématiquement le progid dans le registre à son lancement. à vérifier

    l'utilisation de getobjet n'a d'intérêt que pour récupérer l'instance courante déjà créée par impadmin
    nomen omen, nemo non omen - Consultez la FAQ VBScript et les cours et tutoriels VBScript
    le plus terrible lorsqu'une voiture renverse un piéton, c'est que ce sont les freins qui hurlent. (ramón)
    pas de questions techniques par mp

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 66
    Par défaut
    Voilà qui fonctionne:
    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
    Sub Main
     
    '-- Start Impromptu  
      Dim oShell
      Set oShell = WScript.CreateObject("WScript.Shell")
      oShell.Run """" & "C:\Program Files\Cognos\Cer5\Bin\ImpAdmin.exe" & """", 0, False  
      Set oShell = Nothing
     
    '-- Wait for Impromptu Administrateur to start 
      Dim oWMIService
      Set oWMIService  = GetObject("winmgmts:\\" & "." & "\root\cimv2")
     
      Dim oItem
      Dim oColItems
     
      Dim Compteur: Compteur = 0
      While (Compteur = 0)
        Compteur=0
        Set oColItems = oWMIService.ExecQuery("Select Caption from Win32_Process where Caption='ImpAdmin.exe'",,48)
        For Each oItem in oColItems
        Compteur = Compteur + 1
      Next
        WScript.Sleep 2000
      Wend
     
      Set oItem = nothing
      Set oColItems = nothing 
     
      Set oWMIService = nothing
     
    '-- Get Object Impromptu  
      Dim objImpApp
      Set objImpApp = GetObject(, "CognosImpromptu.Application")
     
    '-- Ouverture du catalogue 
       objImpApp.OpenCatalog "S:\Applis\Pack_Harmonise\CodaSecur\_commun\Catalogues\CAT00000.cat", "Auteur", , , , 0
       Dim objImpCat
       Set objImpCat = objImpApp.ActiveCatalog
     
    ' Utilisation des objets Impromptu
    ' ...
       msgbox objImpCat.ActiveUserClass.Name
    ' ...
     
    '-- Kill running 'ImpAdmin.exe'
        Dim objWMIService
        Set objWMIService  = GetObject("winmgmts:\\" & "." & "\root\cimv2")
        Dim objProcessList
        Set objProcessList = objWMIService.ExecQuery ("Select * from Win32_Process Where Name = 'ImpAdmin.exe'") 
        Dim Proc: Proc = ""
        fOr Each Proc in objProcessList
          Proc.Terminate()
        next
     
        Set objProcessList = nothing 
        Set objWMIService = nothing
     
    '-- Suppresion des objets utilisés --    
       Set objImpCat              = Nothing
       Set objImpApp              = Nothing
     
    End sub
    Juste un petit doute sur les parties "Wait for Impromptu Administrateur to start" et "Kill running 'ImpAdmin.exe'"... Ca fonctionne mais il y a peut-être plus simple...

    Merci en tous cas pour votre aide !

    Drooxy

  9. #9
    Rédacteur
    Avatar de omen999
    Profil pro
    Inscrit en
    Février 2006
    Messages
    1 302
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 1 302
    Par défaut
    Ca fonctionne mais il y a peut-être plus simple...
    un peu mais pas grand chose comme placer le test en fin de boucle par un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Do
    Loop While Compteur=0
    qui évite de faire un raz du compteur dans la boucle
    inutile également de libérer l'objet wmiservice en cours de route pour le réinstancier 10 lignes + loin...
    et d'un façon générale, les libérations explicites des objets sont le + souvent sans intérêt pratique
    la seule façon de simplifier radicalement le script, c'est d'utiliser un wsf
    nomen omen, nemo non omen - Consultez la FAQ VBScript et les cours et tutoriels VBScript
    le plus terrible lorsqu'une voiture renverse un piéton, c'est que ce sont les freins qui hurlent. (ramón)
    pas de questions techniques par mp

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 66
    Par défaut
    Merci pour ces suggestions !

    En fait, j'instancie wmiservice dans deux fonctions différentes mais j'ai ré-arrangé le script avant de le poster pour le simplifier...

    OK pour la boucle j'aurais dû m'en apercevoir

    En fait je libère les objets explicitement afin de garder le "réflexe" (certains autres languages nécessitent cette libération explicite...).

    Je vais regarder ce qu'est un fichier .wsf... Apparemment il s'agit d'un fichier qui peut contenir du xml et du vbscript ? Pourquoi m'en parles-tu dans le cadre de ce script ? Je suis curieux !

    Merci en tous cas pour tes remarques !

    Bonne soirée,
    Drooxy

  11. #11
    Membre éclairé
    Inscrit en
    Septembre 2009
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 63
    Par défaut
    Une autre aproche serait de carrément renomer le fichier impadmin.exe en impuser.exe.
    Si du moin tu as accès au fichiers du systme vu que tu n'as déjà pas accès au registre...

  12. #12
    Rédacteur
    Avatar de omen999
    Profil pro
    Inscrit en
    Février 2006
    Messages
    1 302
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 1 302
    Par défaut
    Apparemment il s'agit d'un fichier qui peut contenir du xml et du vbscript ? Pourquoi m'en parles-tu dans le cadre de ce script ? Je suis curieux !
    wsf est un fichier au format xml utilisé par wsh à partir de la v5.5 qui ajoute des fonctionnalités intéressantes et injustement méconnues
    (inclusion de fichiers, regroupement de plusieurs scripts dans un même fichier, scripts multilangages, constantes, etc..)
    un commentaire du papa de la v5: http://blogs.msdn.com/ericlippert/ar.../25/80139.aspx
    son principal défaut est d'être né quelques mois seulement avant l'apparition du framework .NET qui, comme chacun sait, guérit le cancer, rend la vue aux aveugles
    et qui a surtout conduit à l'abandon de tout nouveau développement du framework wsh considéré comme trop léger
    dans ton cas, l'utilisation d'un object viewer comme celui-ci qui est excellent: http://www.japheth.de/COMView.html t'aurait peut-être permis de découvrir que le CLSID d'impadmin est différent de celui d'impuser et d'écrire un fichier impromptu.wsf dans ce style:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <job>
    <object id="objImpApp" classid="clsid:<LE CLSID D'IMPADMIN>"/>
    <script language="VbScript">
    objImpApp.OpenCatalog "S:\Applis\Pack_Harmonise\CodaSecur\_commun\Catalogues\CAT00000.cat", "Auteur", , , , 0
    Set objImpCat = objImpApp.ActiveCatalog
    ' Utilisation des objets Impromptu
    msgbox objImpCat.ActiveUserClass.Name
    </script>
    </job>
    nomen omen, nemo non omen - Consultez la FAQ VBScript et les cours et tutoriels VBScript
    le plus terrible lorsqu'une voiture renverse un piéton, c'est que ce sont les freins qui hurlent. (ramón)
    pas de questions techniques par mp

Discussions similaires

  1. .lib en .a avec ou sans reimp.exe
    Par katia_heraklion dans le forum Bibliothèques
    Réponses: 3
    Dernier message: 29/03/2007, 16h25
  2. syntaxe avec indice de tableau
    Par mussara dans le forum Général JavaScript
    Réponses: 11
    Dernier message: 27/10/2006, 14h01
  3. Tableau de sommet avec indices
    Par casafa dans le forum OpenGL
    Réponses: 1
    Dernier message: 24/10/2006, 13h37
  4. [vb.net] problème avec indices d'un DataSource
    Par A2rem dans le forum Windows Forms
    Réponses: 1
    Dernier message: 14/09/2006, 16h14
  5. Pb avec le fichier user.exe
    Par StyleXP dans le forum Windows 2000/Me/98/95
    Réponses: 4
    Dernier message: 04/03/2006, 15h04

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