Question Probleme avec Invoke-Command et manip doc Word

Plus d'informations
il y a 11 ans 7 mois #17941 par IDFNaute
Bonjour,

Je viens soumettre mon problème aux experts du forum. J'ai effectué une recherche sur le forum et Google sans vraiment trouver de résultat.

Voici le context :

Lors d'un déploiement par MDT je souhaiterait imprimé un document Word personnalisé pour l'utilisateur. Lors de la séquence de tache MDT, le compte utilisé est l'administrateur local de la machine.

J'utilise donc un Invoke-Command, pour exécuter le script sur un serveur possédant la bonne imprimante ainsi que Word.

Lorsque j'exécute le script sans passer par le Invoke-Command sur le serveur directement, tout se passe sans problème. J'en conclue que le problème provient du passage en Invoke-Command.

Je vous ai fourni le code (les premières variables sont en dur pour les tests mais en production elles seront dynamiques).

[code:1]
### Variables ###

$NomComplet = \"Albert DUPOND\"
$Login = \"adupond\"

$userpower = \"Domaine\utilisateur\"
$passwordpower = ConvertTo-SecureString \"MDP\" -AsPlainText -Force
$credentials = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList ($userpower,$passwordpower)

### Script ###

Invoke-command -computername serveur.domaine. -credential $credentials -ArgumentList ($NomComplet,$Login) -scriptblock{
param($NomComplet,$Login)

$EmplacementTemplate = \"\\Emplacement-Réseau\Template-AMI_X.docx\"
$societe = \"Societe A\"
$date = get-date -uformat \"%Y%m%d\"
$NomAMI = \"$date-$Nomcomplet\" + \".docx\"

$FicheAMI = \"\\Emplacement-Réseau\AideMemoireInformatique\$NomAMI\"


###Fonction####
function GenerationFiche ($NomComplet,$Login,$EmplacementTemplate,$FicheAMI){
$ARemplacer1 = \"Prénom NOM\"
$Remplacant1 = \"$NomComplet\"
$ARemplacer2 = \"login\"
$Remplacant2 = \"$Login\"
$ARemplacer3 = \"Mdp2014\"
$annee = get-date -uformat %Y
$Remplacant3 = 'Societe' + $Remplacant2.Substring(0,2) + $annee

$Word = new-object -com word.application
$Word.visible = $true#$False
$OpenDoc = $Word.documents.Open($EmplacementTemplate)
$Selection = $Word.selection
Write-Host \"**Premier remplacement**\"
Write-Host \"Le remplacé est $ARemplacer1\"
Write-Host \"Le remplacant est $Remplacant1\"
$Selection.Find.Execute(\"$ARemplacer1\",$False,$True,$False,$False,$False,$True,1,$False,\"$Remplacant1\",2)
Write-Host \"Remplacement du login\"
$Selection.Find.Execute(\"$ARemplacer2\",$False,$True,$False,$False,$False,$True,1,$False,\"$Remplacant2\",2)
Write-Host \"Remplacement du mot de passe\"
$Selection.Find.Execute(\"$ARemplacer3\",$False,$True,$False,$False,$False,$True,1,$False,\"$Remplacant3\",2)
Write-Host \"Sauvegarde de la fiche\"
$OpenDoc.SaveAs([ref]\"$FicheAMI\"«»)
Write-Host \"Impression de la fiche\"
$Word.printout()
Write-Host \"Fermeture de l'application\"
$OpenDoc.close();
}

if ($societe -eq \"Societe B\"«»){
Write-Host \"La société est $societe,l'aide mémoire n'est pas imprimé.\"
}
elseif ($societe -ne \"Societe B\"«»){
Write-Host \"La société est $societe,l'aide mémoire est imprimé.\"
GenerationFiche $NomComplet $Login $EmplacementTemplate $FicheAMI
}
}
[/code:1]

Et voici le résultat qui en découle dans le console.

**Premier remplacement**
Le remplacé est Prénom NOM
Le remplacant est Albert DUPOND
Impossible d’appeler une méthode dans une expression Null.
+ CategoryInfo : InvalidOperation : (: ) [], RuntimeException
+ FullyQualifiedErrorId : InvokeMethodOnNull
+ PSComputerName : serveur.domaine

Remplacement du login
Impossible d’appeler une méthode dans une expression Null.
+ CategoryInfo : InvalidOperation : (: ) [], RuntimeException
+ FullyQualifiedErrorId : InvokeMethodOnNull
+ PSComputerName : serveur.domaine

Remplacement du mot de passe
Impossible d’appeler une méthode dans une expression Null.
+ CategoryInfo : InvalidOperation : (: ) [], RuntimeException
+ FullyQualifiedErrorId : InvokeMethodOnNull
+ PSComputerName : serveur.domaine

Sauvegarde de la fiche
Impossible d’appeler une méthode dans une expression Null.
+ CategoryInfo : InvalidOperation : (: ) [], RuntimeException
+ FullyQualifiedErrorId : InvokeMethodOnNull
+ PSComputerName : serveur.domaine

Impression de la fiche
Exception lors de l'appel de « PrintOut » avec « 0 » argument(s) : « Cette méthode ou propriété n'est pas disponible car une fenêtre de document n'est pas active. »
+ CategoryInfo : NotSpecified: (: ) [], MethodInvocationException
+ FullyQualifiedErrorId : COMException
+ PSComputerName : serveur.domaine

Fermeture de l'application
Impossible d’appeler une méthode dans une expression Null.
+ CategoryInfo : InvalidOperation : (: ) [], RuntimeException
+ FullyQualifiedErrorId : InvokeMethodOnNull
+ PSComputerName : serveur.domaine



J'ai essayé sans passer par ISE pour vérifier que le problème ne venait pas de là, cela n'a rien changé.

Pour info, je me suis inspiré de ce script pour la manipulation du doc Word : www.loone.net/?p=120

Bonne journée à vous :)

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 11 ans 7 mois #17944 par Laurent Dardenne
Que donne l'invoke-command sans passer par MDT, mais par une session sur un poste ?

La session distante ne peut adresser le moniteur, l'instruction .visible=$true est fausse ou en tout cas inopérante.
Il n'y a pas de sélection de texte, ta sélection est peut vide/$null.

J'ai un doute pour l'accès à l'objet COM, des logs sur les étapes de construction du doc seront utiles.

Les versions de PS sont-elle identique de chaque côté ?
Pour test test tu utilises la même version d'Office ?

Tutoriels PowerShell

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 11 ans 7 mois #17945 par IDFNaute
Alors pour le moment, le script n'a pas été intégré à la séquence de tâche de MDT. Il a été testé sur un poste client (même version de Word et même version de Powershell). Avec le même problème, si le script est utilisé avec \"Invoke-command\" cela pose problème, si le script est utilisé sans Invoke-Command, ca se déroule très bien.

Pour l'instruction $Word.visible = $true#$False je l'ai mise en True pour voir les modifications, et effectivement on voit bien les remplacements de chaine de caractère (à terme, elle devra être en $False).

Je ne comprends pas bien ce que tu veux dire par \"Il n'y a pas de sélection de texte, ta sélection est peut vide/$null.\"

Normalement il fait la sélection de texte à ce moment là, si je ne me trompe pas :
[code:1]$Selection.Find.Execute(\"$ARemplacer1\"...[/code:1]

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 11 ans 7 mois #17946 par Laurent Dardenne
IDFNAUTE écrit:

Je ne comprends pas bien ce que tu veux dire par \"Il n'y a pas de sélection de texte, ta sélection est peut vide/$null.\"

'peut être vide ou $null'.

Ceci semble affecter $null à la variable $Selection
[code:1]$Selection = $Word.selection[/code:1]
IDFNAUTE écrit:

Normalement il fait la sélection de texte à ce moment là, si je ne me trompe pas :

Il y a qq temps que je n'ai pas codé d'automatisme avec Word, mais là tu fais un cherche/remplace sur une étendue (range) existante, cela ne sélectionne pas l'étendue .

Contrôle la propriété InvocationInfo des messages d'erreur 'Impossible d’appeler une méthode dans une expression Null.'<br><br>Message édité par: Laurent Dardenne, à: 19/08/14 16:20

Tutoriels PowerShell

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 11 ans 7 mois #17949 par IDFNaute
Effectivement tu avais vu juste sur la sélection. Je viens de faire deux tests.

Le premier est de désactiver l'Invoke-Command pour que le script s'execute en local sur ma machine voila ce que ça donne lorsque je vérifie mes variables :

[code:1]
Write-Host \&quot;Word est : $Word\&quot;
Write-Host \&quot;OpenDoc est : $OpenDoc\&quot;
Write-Host \&quot;La sélection est : $Selection\&quot;
[/code:1]

Le résultat :

[code:1]
Word est : Microsoft.Office.Interop.Word.ApplicationClass
OpenDoc est : Microsoft.Office.Interop.Word.DocumentClass
La sélection est : System.__ComObject
[/code:1]

Maintenant quand je réactive Invoke-Command (en enlevant les commentaires) voici ce qui se passe :
[code:1]
Write-Host \&quot;Word est : $Word\&quot;
Write-Host \&quot;OpenDoc est : $OpenDoc\&quot;
Write-Host \&quot;La sélection est : $Selection\&quot;
[/code:1]

Le résultat :

[code:1]
Word est : Microsoft.Office.Interop.Word.ApplicationClass
OpenDoc est :
La sélection est :
[/code:1]

Avec Invoke-Command, les deux variables $OpenDoc et $Selection ne sont pas attribué d'où les erreurs \&quot;Impossible d’appeler une méthode dans une expression Null.\&quot;

Le souci est que maintenant je ne comprends pas pourquoi elles restent vides.

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 11 ans 7 mois #17950 par Laurent Dardenne
IDFNAUTE écrit:

Le souci est que maintenant je ne comprends pas pourquoi elles restent vides.

Je te propose de Logguer le résultat d'un appel à Test-Path sur le chemin du document, vérifier les droits, et sinon d'essayer avec un lecteur mappé (pas un psdrive).

Tutoriels PowerShell

Connexion ou Créer un compte pour participer à la conversation.

Temps de génération de la page : 0.053 secondes
Propulsé par Kunena