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

API, COM et SDKs Delphi Discussion :

Exécuter une autre application, ça marche mais


Sujet :

API, COM et SDKs Delphi

  1. #1
    Candidat au Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Novembre 2018
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Novembre 2018
    Messages : 2
    Points : 4
    Points
    4
    Par défaut Exécuter une autre application, ça marche mais
    Bonjour,

    J'ai un problème assez étrange que je n'arrive pas à comprendre. On a une vieille application écrite en Pascal qui a besoin de faire des opérations sur Outlook mais la librairie utilisée pose des problèmes avec les versions 64 bits. La direction a prit la décision d'utiliser une autre application écrite en C# qu'on a sous la main qui utilise Microsoft.Office.Interop.Outlook qui sera alors appelée par l'application en Pascal en ligne de commande. Maintenant le problème c'est que cette application C# ne réagit pas pareil si on la lance depuis cette application Pascal ou depuis n'importe quoi d'autre...

    Exemple, l'application C# ne fait qu'une seule chose, elle ouvre Outlook et prépare un mail. J'ai désactivé les arguments dans cette application pour être certain donc il suffit de lancer l'application et le mail est près à partir avec un mail, un objet et un message. Si outlook est ouvert, ça marche. Si outlook est fermé, ça marche. Maintenant je lance l'application à partir de l'application Delphi en utilisant ShellExecuteEx. Si outlook est fermé, ça marche. Si outlook est ouvert, Exception que voici :

    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
     
    Exception : {
      "ClassName": "System.Runtime.InteropServices.COMException",
      "Message": "Opération non disponible (Exception de HRESULT : 0x800401E3 (MK_E_UNAVAILABLE))",
      "Data": null,
      "InnerException": null,
      "HelpURL": null,
      "StackTraceString": "   à System.Runtime.InteropServices.Marshal.GetActiveObject(Guid& rclsid, IntPtr reserved, Object& ppunk)\r\n   à System.Runtime.InteropServices.Marshal.GetActiveObject(String progID)\r\n   à MgMail.Program.GetOutlookInstance()\r\n   à MgMail.Program.Main(String[] args)",
      "RemoteStackTraceString": null,
      "RemoteStackIndex": 0,
      "ExceptionMethod": "8\nGetActiveObject\nmscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\nSystem.Runtime.InteropServices.Marshal\nVoid GetActiveObject(System.Guid ByRef, IntPtr, System.Object ByRef)",
      "HResult": -2147221021,
      "Source": "mscorlib",
      "WatsonBuckets": null
    }
    Cette application C# marche très bien quand elle est lancée à la main, très bien quand elle est lancée depuis CMD, powershell, une autre application C#... Que ce soit avec outlook 32 ou 64bits, ouvert ou fermé, 100% de réussite à chaque fois.

    Lancée depuis Pascal avec ce code, ça ne marche que si outlook est fermé. Dès que l'application doit négocier avec Outlook, ça plante.

    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
     
    Function RunAsAdmin(hWnd : HWND; aFile : String; aParameters : String) : Boolean;
    Var
     Sei : TShellExecuteInfoA;
    begin
     Fillchar(sei,SizeOf(sei),0);
     sei.cbSize := SizeOf(sei);
     sei.Wnd    := hWnd;
     sei.fMask  := SEE_MASK_FLAG_DDEWAIT or SEE_MASK_FLAG_NO_UI;
     sei.lpfile := PChar(aFile);
     sei.lpVerb := 'runas';
     sei.lpParameters := PChar(aParameters);
     sei.nShow := SW_HIDE;
     RunAsAdmin:=ShellExecuteEx(@sei);
    end;
    L'application Pascal elle ne me lève aucune erreur...

    J'espère que quelqu'un pourra m'aider car là je suis bloqué bloqué avec cette histoire...

    Edit: je pensais que ça pouvais venir des droits alors j'ai ajouté un fichier manifest à l'application Pascal mais même lancée en mode administrateur ça ne marche que si outlook est fermé.

    Cordialement,
    Merci

  2. #2
    Candidat au Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Novembre 2018
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Novembre 2018
    Messages : 2
    Points : 4
    Points
    4
    Par défaut La solution
    Bonjour,

    Alors cela m'a pris la journée pour comprendre et trouvé la solution mais c'est fait, ça marche et en plus on est vendredi soir
    Alors, c'est bien un problème de sécurité mais je l'ai pris à l'envers.

    Vu que ça marchait quand outlook est fermé mais pas quand il est ouvert, je me suis dis que outlook démarrait avec des droits administrateurs et que mon application ne pouvait pas obtenir l'instance d'outlook à cause de ça donc j'ai perdu mon temps à essayer de lancer le 2ème programme de toutes les manières possible et je me suis bien cassé les dents... car le problème est inversé. En fait c'est mon application qui démarrait en mode administrateur et qui se retrouve avec un contexte de sécurité différent de celui d'outlook qui lui tourne avec les droits utilisateurs.

    Vu que je ne peux pas empêcher quelqu'un de démarrer l'application Pascal avec les droits administrateurs, j'ai d'abord tenté de détecter dans l'application C# si j'avais les droits admin et si oui, j'ai tenté un genre de rappel pour relancer l'application C# sans droits mais je n'ai pas réussis. Finalement, au lieu d'utiliser CMD ou PowerShell, j'utilise maintenant RunAs.exe de cette façon : 'runas /trustlevel:0x20000 mgmail'

    Merci quand même et à une prochaine

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 07/08/2014, 20h50
  2. Réponses: 3
    Dernier message: 04/05/2012, 22h41
  3. Réponses: 3
    Dernier message: 29/04/2012, 21h26
  4. Réponses: 5
    Dernier message: 22/05/2008, 14h42

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