1
votes

Créer un e-mail à partir de PowerShell à l'aide du planificateur de tâches (erreur d'exécution 429)

J'ai créé plusieurs scripts pour envoyer des e-mails après avoir effectué certaines analyses. Cela a fonctionné auparavant. Maintenant, quelques-uns des scripts échouent et donnent le message d'erreur suivant:

Erreur d'exécution "429":
Le composant ActiveX ne peut pas créer d'objet

Il fait alors référence à la ligne de code Outlook Object comme erreur.

Le script s'exécute lorsque je quitte MS Outlook et bogue si Outlook est en cours d'exécution. J'utilise un planificateur de tâches pour l'exécuter et Outlook est généralement en cours d'exécution.

Private Sub Send_Ratings_Email()

    Dim OutApp As Object, OutMail As Object
    Dim rng As Range
    Dim StrBody As String
    StrBody = "Please find  Maturities for the Current Week Below: "

    Application.ScreenUpdating = False
    On Error Resume Next
    Set OutApp = GetObject(, "Outlook.Application")
    On Error GoTo 0
    If OutApp Is Nothing Then Set OutApp = GetObject("Outlook.Application")

    On Error GoTo cleanup
 
    Set OutMail = OutApp.CreateItem(0)
    On Error Resume Next
            
    Call AddAzureLabel(OutMail, "Restricted - Internal")
    With OutMail
        .To = " example.com"
        .Subject = "Weekly Maturities - W/C " & Format(Now, "dd-mmm-yy")
        .HTMLBody = StrBody & RangetoHTML(rng)
        .Display  'Or use .Send
    End With
    On Error GoTo 0
    Set OutMail = Nothing

cleanup:
    Set OutApp = Nothing
    Application.ScreenUpdating = True

Powershell Script fonctionne lorsqu'il est exécuté manuellement.


15 commentaires

Votre environnement a-t-il récemment changé? Il peut s'agir d'un paramètre de sécurité dans Outlook qui n'autorise pas l'accès par programme. Vous devrez peut-être basculer cela dans Fichier> Options> Centre de gestion de la confidentialité> Paramètres du centre de confiance> Accès par programme.


Salut David - merci pour votre aide. Cette section semble convenir. Je ne comprends pas pourquoi la macro Excel lorsqu'elle est appelée à partir d'un script Powershell dans le planificateur de tâches ne fonctionne pas


Hmmmm. Il existe BEAUCOUP d'informations sur la source d'erreur possible via Microsoft, ici: support.microsoft.com/en-us/help/828550/...


Je serais curieux de savoir si vous obtenez la même erreur PowerShell / planificateur de tâches en utilisant GetObject au lieu de CreateObject .


J'ai sorti le code If OutApp Is Nothing Then Set OutApp = CreateObject ("Outlook.Application") et maintenant tout ce qui se passe est le planificateur de tâches effectue l'analyse et se ferme


Ce n'est pas ce que j'ai demandé, cependant. Cette ligne de code semble n'avoir pratiquement aucun effet réel, OutApp n'est toujours rien tant qu'elle n'est pas instanciée, et à moins que vous n'utilisiez des variables globales de portée (ne le faites pas), elle ne sera pas instanciée tant que vous appelez CreateObject ou GetObject pour gérer l'instance éventuellement déjà en cours d'exécution.


Cela pourrait vous aider de réviser votre question pour afficher le code que vous utilisez actuellement :)


Problèmes toujours. que ce ne soit pas possible. Difficile de croire que même lorsque j'exécute manuellement le script PowerShell, cela fonctionne, mais le planificateur de tâches ne fonctionne pas


Il est possible que vous fassiez simplement quelque chose de mal ou que vous ayez quelque chose de mal configuré, et nous n'avons pas encore compris de quoi il s'agit :)


code modifié pour montrer ce que j'utilise - afin de réduire les commentaires, je vais simplement modifier celui-ci pour les réponses. J'espère vraiment que nous pouvons résoudre ce problème


Set OutApp = GetObject ("Outlook.Application") est incorrect, vous devez utiliser GetObject (, "Outlook.Application") ou CreateObject ("Outlook .Application ") . C'est pourquoi votre programme se ferme simplement dans ce cas, vous obtenez une erreur sur cette affectation et il suit le nettoyage GoTo .


Le planificateur de tâches exécute-t-il PS à partir du même compte? Sinon, cela pourrait être un problème d'autorisations ou une autre configuration. Avez-vous essayé de réparer les installations d'Outlook et d'Excel? Au cas où.


Ouais - le TS exécute le PS à partir du même compte. les réparations sont correctes. L'erreur à venir est que le composant ActiveX ne peut pas créer d'objet. Mais Outlook est déjà ouvert. Le TS fonctionne lorsque les perspectives ne sont pas ouvertes


voir ma "réponse" ci-dessous, je suis curieux de savoir ce qui se passe si nous encapsulons l'instanciation Outlook. Pouvez-vous exécuter cette procédure foo à partir de PS et voir ce qui se passe?


Bien sûr - je n'ai pas tenté de chance, il s'ouvre et je ne crois même pas qu'il exécute la macro. manuellement sur PowerShell cela fonctionne cependant.


3 Réponses :


1
votes

Vous créez une instance d'Outlook si elle ne fonctionne pas, vérifiez plutôt si elle est déjà en cours d'exécution et récupérez l'application en cours d'exécution ou créez-en une si ce n'est pas le cas:

On Error Resume Next
Set OutApp = GetObject(, "Outlook.Application")
On Error GoTo 0
If OutApp Is Nothing Then Set OutApp = CreateObject("Outlook.Application")


8 commentaires

Je placerais OEG0 après avoir obtenu obj au cas où la création d'obj échouerait également.


Vous créez une instance d'Outlook si elle ne fonctionne pas Ce n'est pas vraiment vrai. Vous pouvez CreateObject même si Outlook est déjà en cours d'exécution. Dans ce cas, CreateObject renvoie l'instance déjà en cours d'exécution.


Remplacez votre ligne Set OutApp ... par le bloc sur ma réponse, cela devrait résoudre le problème.


merci ... obtenir une erreur disant qu'il ne peut pas créer de composant. Mettre en surbrillance 'Set OutApp = Create' .... dans l'instruction IF. D'autres idées?


La bibliothèque d'objets Microsoft Outlook XX.X est-elle cochée dans vos références? Être XX.X la version de vos perspectives.


Oui - fait vérifier la bibliothèque de références d'objets pour Outlook. Outlook16.0 - Edit: le script semble fonctionner lorsque j'exécute manuellement la macro mais pas avec le planificateur de tâches - ce qui est fou car il a fonctionné dans le passé


C'est bizarre ... vraiment pas de logique sur votre erreur. Pour commencer, si Outlook est déjà ouvert, il devrait éviter le deuxième ensemble, et si ce n'est pas le cas ... Vous n'avez eu aucun problème avec cela.


bon sang - je suppose que je ne pourrais rien faire d'autre? Je ne peux juste pas comprendre pourquoi ça ne marche pas



0
votes

Ajouter ceci comme réponse pour le moment, mais vraiment essayer de déboguer d'une manière qui ne rentre pas dans les commentaires. Similaire à l'autre réponse, mais l'idée est de l'utiliser pour créer un cas de test et voyons si nous pouvons le faire fonctionner dans votre cas Planificateur de tâches> Powershell.

Demandez à votre PS d'exécuter le foo code> ou la procédure foo2 ici, et j'ai encapsulé l'instanciation Outlook en tant que fonction autonome pour essayer de garder les choses propres et d'isoler l'erreur.

try {
    stop-process -Name "outlook" -ErrorAction Stop
    Write-Host "Stopped the running instance of Outlook Application"
    } catch { 
    Write-Host "outlook was not already running"
    } 
    
$excel = new-object -comobject excel.application
$file = "C:\debug\ps-excel.xlsm"
$wb = $excel.workbooks.open($file)
$excel.run("Module1.foo")

que je cours depuis PS comme:

$excel.Run("Module1.foo2")

Et:

$excel = new-object -comobject excel.application
$file = "C:\debug\ps-excel.xlsm"
$wb = $excel.workbooks.open($file)
$excel.Run("Module1.foo")

Dans le foo , GetObject génère une erreur mais ce n'est pas une erreur 429, et le contrôle passe à CreateObject qui instancie avec succès l'application. Donc, malheureusement, je ne suis pas en mesure de reproduire l'erreur sous aucune combinaison de foo / foo2 et si Outlook est déjà ouvert ne semble pas non plus.

Voici une solution potentielle quelque peu hack-y

Donc, c'est un peu hack-y parce que je ne pense pas que cela résout la cause profonde (et parce que je ne peut pas reproduire votre erreur, cela ne résoudra peut-être rien) mais ça vaut le coup, comme vous le notez:

Il est important de noter que le script s'exécute lorsque je quitte MS Outlook et bogue si Outlook est déjà en cours d'exécution

Mon idée est de simplement modifier votre PS pour vérifier l'instance en cours d'exécution d'Outlook et de la fermer via la stop-process Cmdlet.

Option Explicit

Sub foo()
Dim olApp As Object
Set olApp = GetApplication("Outlook.Application")

End Sub

Sub foo2()
Dim olApp As Object
Set olApp = GetApplication2("Outlook.Application")
End Sub

Function GetApplication2(className As String) As Object
' function to encapsulate the instantiation of an application object
Dim theApp As Object
On Error Resume Next
Set theApp = CreateObject(className)
If theApp Is Nothing Then
    MsgBox "Unable to get a handle on " & className
Else
    MsgBox "Successfully got a handle on " & className & ", returning to caller"
End If
Set GetApplication2 = theApp
End Function


Function GetApplication(className As String) As Object
' function to encapsulate the instantiation of an application object
Dim theApp As Object
On Error Resume Next
Set theApp = GetObject(, className)
If Err.Number <> 0 Then
    MsgBox "Unable to Get" & className & ", attempting to CreateObject"
    Set theApp = CreateObject(className)
End If

If theApp Is Nothing Then
    Err.Raise Err.Number, Err.Source, "Unable to Get or Create the " & className & "!"
    Set GetApplication = Nothing
End If

MsgBox "Successfully got a handle on Outlook Application, returning to caller"

Set GetApplication = theApp

End Function


7 commentaires

J'ai couru ceci via - TS / PS et il s'ouvre et aucune fenêtre contextuelle n'est apparue dans les deux cas. Cependant, lorsque je lance manuellement à partir de Powershell, l'instance fonctionne


@dsound J'ai révisé mes fonctions de test pour essayer de donner plus de détails lors de l'exécution à partir de PS.


@dsound essayez-vous d'utiliser l'applet de commande stop-process pour tuer Outlook s'il est déjà en cours d'exécution, via PowerShell? Une sorte de piratage, mais cela pourrait fonctionner.


ahh inutile - l'erreur est toujours à venir avec le hack. Il dit que Outlook n'était pas déjà en cours d'exécution, puis continue avec l'erreur :(


c'est farfelu, rien à ce sujet n'a de sens - alors maintenant, même si Outlook n'est PAS en cours d'exécution (PS tue le processus), il y a toujours des erreurs? J'aimerais pouvoir reproduire votre erreur, mais je ne peux pas. Cela fonctionne pour moi exactement comme je le pense. Il doit y avoir une sorte de problème de configuration, de registre ou d'autorisations de votre côté, mais je ne sais pas comment aider à isoler cette cause racine :(


Ouais, ça craint - j'ai téléchargé Advanced Task Scheduler - j'ai exécuté le script PowerShell là-bas et aucun problème. Le seul problème est que Adv. Le planificateur de tâches n'est pas gratuit, ce n'est qu'un essai.


Je suis même allé plus loin et j'ai essayé d'exécuter le mien via le planificateur de tâches (je venais juste d'exécuter PS à partir de l'invite de commande). Je ne parviens toujours pas à obtenir l'erreur, le mien ferme avec succès l'instance en cours d'exécution d'Outlook (si elle est ouverte) et, dans les deux cas, fait ce qu'elle doit faire dans Excel. Je vérifierais deux et trois fois les options du planificateur de tâches. Sinon, désolé, je ne peux pas être plus utile!



0
votes

Décochez "Exécuter avec les privilèges les plus élevés" dans votre tâche du planificateur de tâches


0 commentaires