Résolu Outil pour copier et lancer un fichier sur un poste

Plus d'informations
il y a 1 mois 1 semaine - il y a 1 mois 6 jours #33885 par Matthieu
Bonjour,

Voilà je suis en train de développer un script en PowerShell pour copier un fichier d'installation sur un poste puis lancer l'installation.
Plus j'avance et plus j'ai l'impression de faire une usine à gaz.

Mes étapes :
1. copie du fichier de mon poste vers le poste distant sur c:\
2. ouverture d'une connexion à distance sur le poste
3. contrôle que le dossier c:\temp existe. Si pas de dossier, le créer
4. déplacement du fichier de c: vers c:\temp
5. exécution du fichier

Pour le moment, j'ai fait les 4 premiers points. J'ai des erreurs sur le point 4 car je dois relance deux fois le script pour que cela fonctionne comme s'il essayé de copier le fichier avant d'avoir créé le dossier temp. Mais de toute façon, idéalement, j'aurais préféré contrôler si le dossier temp existe sur le poste distant, le créer si ce n'est pas le cas et copier directement le fichier dedans sans devoir passer au préalable par une copie sur le c: mais ça ne semblait pas fonctionner. Je m'y prends sans doute mal... Voilà mon code :
# Déclaration du chemin du fichier sur le poste local
$localFilePath = "C:\temp\PROTECT_Installer_x64_fr_FR.exe"

# Déclaration des détails du poste distant
$remoteComputer = "192.168.254.230"
$remoteFolderPath = "\\$remoteComputer\c$"

#Copie du fichier à la racine du poste distant
Copy-Item -Path $localFilePath -Destination $remoteFolderPath

#Connexion au poste distant
Enter-PSSession -ComputerName $remoteComputer -Credential "IT-CONNECT\Administrateur"

# Spécifier les chemins des fichiers et dossiers
$sourceFilePath = "C:\PROTECT_Installer_x64_fr_FR.exe"
$destinationFolderPath = "C:\temp"

# Vérifier si le dossier de destination existe, sinon le créer
if (-not (Test-Path $destinationFolderPath -PathType Container)) {
New-Item -Path $destinationFolderPath -ItemType Directory | Out-Null
Write-Host "Le dossier $destinationFolderPath a été créé."
} else {
Write-Host "Le dossier $destinationFolderPath existe déjà."
}

# Copier le fichier vers le dossier de destination
Move-Item -Path $sourceFilePath -Destination $destinationFolderPath
Dernière édition: il y a 1 mois 6 jours par Matthieu.

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

Plus d'informations
il y a 1 mois 1 semaine #33886 par Fabien
Bonjour Matthieu,

Effectivement, pour le simplifier, tu peux copier le fichier directement à l'emplacement prévu et vérifier son existence avant.
Ensuite, il te suffit d'exécuter le fichier à distance.

Voici un exemple : 
# Déclaration du chemin du fichier sur le poste local
$FilePath = "C:\Temp\Wireshark.exe"

# Déclaration des détails du poste distant
$remoteComputer = "PCHOME01"
$remoteFolderPath = "\\$remoteComputer\c`$\Temp\"

# Vérifier si le dossier de destination existe, sinon le créer
if (-not (Test-Path $remoteFolderPath -PathType Container)) {
    New-Item -Path $remoteFolderPath -ItemType Directory | Out-Null
    Write-Host "Le dossier $remoteFolderPath a été créé."
} else {
    Write-Host "Le dossier $remoteFolderPath existe déjà."
}

#Copie du fichier à l'emplacement du poste distant
Copy-Item -Path $FilePath -Destination $remoteFolderPath

#Execute le fichier sur le poste distant
Invoke-Command -ComputerName $remoteComputer -Credential $cred -ScriptBlock {Start-Process -FilePath "C:\Temp\Wireshark.exe"}

Attention sur l'application que tu lances à distance.
Le mieux est un .MSI avec des arguments pour ne pas l'installer en mode interface graphique car tu n'as pas le retour graphique en Powershell à distance.

Fabien
Les utilisateur(s) suivant ont remercié: Matthieu

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

Plus d'informations
il y a 1 mois 1 semaine #33891 par Arnaud Petitjean
Bonjour Matthieu,

Effectivement, comme le souligne très justement Fabien, PowerShell ne te renverra pas de retour graphique si tu lances un exe à distance. 
L'exécution d'Exe est faite pour des utilitaires ligne de commande.

Par ailleurs, je ne comprends pas à quoi te sert la commande Enter-PSSession dans ton script. En effet, celle-ci t'ouvres une session interactive sur une machine distante. Tu ne pourras donc juste taper des commandes, rien de plus.
Il faut à mon avis que tu fasses toutes tes actions distantes à travers une Session WinRM et avec la commande Invoke-Command.

De plus, sache qu'il est possible de copier des fichiers (avec Copy-Item) à travers une session WinRM. Ce qui parfois peut te sauver la vie si le protocole SMB n'est pas autorisé.

Arnaud

MVP PowerShell et créateur de ce magnifique forum :-)
Auteur de 6 livres PowerShell aux éditions ENI
Fondateur de la société Start-Scripting
Besoin d'une formation PowerShell ?

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

Plus d'informations
il y a 1 mois 1 semaine #33892 par Matthieu

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

Plus d'informations
il y a 1 mois 1 semaine #33893 par Matthieu
J'avais fait avec la commande Invoke-Command mais j'avais une erreur WMI... je ne sais pas pourquoi tout semblait ok c'est pour contourner le problème que je faisais Enter-PSSession.

Oui pour le .exe je vais mettre un msi là c'était pour tester. Après il faudra que je fasse une petite interface graphique pour tout ça et modifier un peu mon code pour ne pas avoir certaines informations en dur.

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

Plus d'informations
il y a 1 mois 1 semaine #33897 par Arnaud Petitjean
Ok. Tiens nous au courant de la suite !

Bizarre pour ton erreur WMI, il n'y a pas de raison...

MVP PowerShell et créateur de ce magnifique forum :-)
Auteur de 6 livres PowerShell aux éditions ENI
Fondateur de la société Start-Scripting
Besoin d'une formation PowerShell ?

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

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