Bonjour,
J'aimerai exécuter un script vbs sur une machine distante.
Le problème est que je ne peux pas utiliser "invoke-command" car bloqué par une politique de sécurité.
Si quelqu'un a une idée de comment faire je suis preneur.
Merci
Version imprimable
Bonjour,
J'aimerai exécuter un script vbs sur une machine distante.
Le problème est que je ne peux pas utiliser "invoke-command" car bloqué par une politique de sécurité.
Si quelqu'un a une idée de comment faire je suis preneur.
Merci
salut moman
le wmi peut être une piste
un exemple de code que j'avais trouvé y a quelque années :
Code:
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 function Process_cmd { Param($Target,$exec) $random = get-random #cmd to execute remotely $cmd = "cmd /c $exec > C:\$random.txt" #execute the cmd remotely $processid = Invoke-WmiMethod -class Win32_process -name Create -ArgumentList $cmd -ComputerName $Target #wait until the process is done do { $resultprocess = Get-WmiObject win32_process -ComputerName $Target | where {$_.processid -eq $processid.processid } sleep 1 } until ($resultprocess -eq $null) #copy the log file into the script folder to get the content quickly if (test-path "\\$Target\C$\$random.txt") { #get the log content create by the cmd try { $result = Get-Content \\$Target\C$\$random.txt -encoding ascii } catch {} #remove the log try { remove-item \\$Target\C$\$random.txt -ErrorAction SilentlyContinue } catch {} } return $result }
Merci 6ratgus.
Je testerais ta réponse lundi.
Sinon, j'avais essayé de faire un mappage réseau, de copier le script sur la machine distante et de l’exécuter via ce mappage.
Pour l’exécuter j'avais utilisé le cscript de la machine distante via le mappage, mais le script semblait s’exécuter sur la machine de départ, je pense donc que ce doit être du à l'environnement d’exécution.
Voila, voila. Si vous avez d'autres idées, je suis toujours preneur.
Merci.
Merci 6ratgus.
Ça fonctionne très bien ^^
Bonjour bonjour :)
Voila plusieurs jours que je cherche... Mais sans succès....
Disons que j'ai résolu 50% du problème, mais le reste ...
je souhaite faire deux chose, la première consiste à lancer une commande CMD sur une liste de serveur, ils sont, pour l'instant en Win2003.(je n'ai pas trouvé la solution)
La deuxième chose consiste à lancer un vbs sur, également une liste de serveur en 2003. j'ai trouvé en utilisant Psexec.
J'ai essayé avec la même méthode, psexec, mais sans succès, avec un runas... idem.
je suis donc tombé sur ton script, mais j'avoue ne pas trop le comprendre... pourriez vous me l'expliquer ?
Merci merci :)
voici un petit exemple d'utilisation de Process_cmd :
Attention certaines commandes demandent une élévation "admin", Process_cmd ne résout pas ce problème !Code:
1
2
3
4 $commande = "dir c:\" # tu remplace ce dir par la commande que tu veux exécuté $ordinateur = "pc-de-test" Process_cmd $Ordinateur $commande
pour ton problème de "lancer une commande CMD sur une liste de serveur" tu as plusieurs solutions !!! tout dépend de ta liste
en voici une :
Code:
1
2
3 "serveur1", "serveur2", "serveur3" | foreach { Process_cmd $_ $commande }
Bonjour,
Merci pour ce script. Néanmoins je ne comprend toujours pas le fonctionnement. En quel langage est-ce ? du VBscript ? Comment dois-j faire pour l’exécuter ?
c'est du PowerShellCitation:
En quel langage est-ce ?
tu doit enregistrer ton script dans un fichier avec l'extension .ps1Citation:
Comment dois-j faire pour l’exécuter ?
puis pour exécuté tu tape la commande suivante : powershell -file tonscript.ps1
tu a ici sur ce forum/site des tutoriels pour débuté en powershell
Encore merci :)
Malheureusement : " Le terme «*Process_cmd*» n'est pas reconnu comme nom d'applet de commande, fonction, fichier de script ou programme"
Super le deuxième site :)
Salut, kewin117.
Je lance le script comme cela :
Ça devrai régler ton problème (pas besoin d'utiliser les jobs), si tu n'y arrive met ce que tu as fait je t'aiderai à le lancer.Code:
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 $Process_cmd = { Param($Target,$exec) $random = get-random $cmd = "cmd /c $exec > C:\$random.txt" $processid = Invoke-WmiMethod -class Win32_process -name Create -ArgumentList $cmd -ComputerName $Target do { $resultprocess = Get-WmiObject win32_process -ComputerName $Target | where {$_.processid -eq $processid.processid } sleep 1 } until ($resultprocess -eq $null) if (test-path "\\$Target\C$\$random.txt") { try { $result = Get-Content \\$Target\C$\$random.txt -encoding ascii } catch {} try { remove-item \\$Target\C$\$random.txt -ErrorAction SilentlyContinue } catch {} } return $result } foreach ($User in $Users) { $running = @(Get-Job | Where-Object { $_.State -eq 'Running' }) if ($running.Count -lt $nbMax) { Start-Job -ScriptBlock $Process_cmd -ArgumentList $User.Nom, "cscript C:\Install_WSUS.vbs action:install restart:$restart" -name $User.Nom } else { $running | Wait-Job Start-Job -ScriptBlock $Process_cmd -ArgumentList $User.Nom, "cscript C:\Install_WSUS.vbs action:install restart:$restart" -name $User.Nom } Get-Job | Receive-Job }
Sinon j'ai aussi une question ^^, l’exécution de mon script C:\Install_WSUS.vbs ne donne pas le même résultat lorsque je l’exécute à distance ou en local, cela est un comportement normal ??
Salut moman,
Merci pour le code, mais je n'y comprend pas grand chose... Comment je fais pour le modifier avec mes propres paramètres?
-Exécuter un cmd se trouvant dans le répertoire d:\......... de chaque serveur
-Exécuter se cmd (donc présent sur chaque serveur) sur une liste de serveur présent dans un fichier *.txt
:)
encor merci
:salut:
Si par hasard, vous cherchiez une solution en Vbscript pour la liste des processus en cours d'exécution et les éléments à démarrage automatique (en locale) :
Le code suivant devrait faire l'affaire :
Code:
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 #fonction pour executer a distance via WMI $Process_cmd = { Param($Target,$exec) $random = get-random $cmd = "cmd /c $exec > C:\$random.txt" $processid = Invoke-WmiMethod -class Win32_process -name Create -ArgumentList $cmd -ComputerName $Target do { $resultprocess = Get-WmiObject win32_process -ComputerName $Target | where {$_.processid -eq $processid.processid } sleep 1 } until ($resultprocess -eq $null) if (test-path "\\$Target\C$\$random.txt") { try { $result = Get-Content \\$Target\C$\$random.txt -encoding ascii } catch {} try { remove-item \\$Target\C$\$random.txt -ErrorAction SilentlyContinue } catch {} } return $result } $Users = Import-Csv -Path ".\machine.csv" -Delimiter ";" foreach ($User in $Users) { $Process_cmd -ArgumentList $User.Nom, "d:\nom_executable" }
Voila, tu crée un fichier csv "machine.csv" sous la forme : Nom;Ip dans lequel tu mets tes machines.
Et normalement c'est tout.
Merci 6ratgus pour ta réponse.
Mais au niveau de la GPO il me semble que l'on ai pas maitre du temps ?? Je ne sais pas si c'est la raison, mais pour certaines machines de la plateforme sur laquelle je travail, les GPO pour WSUS ne sont pas d'actualité.
merci, mais....
Vous devez fournir une expression de valeur à droite de l'opérateur «*-*».
Au niveau de C:\Users\Downloads\Sans titre2.ps1*: 33 Caractère*: 18
+ $Process_cmd - <<<< ArgumentList $User.Nom, "d:\.."
Désolé :oops:
Tu remplace ca : d:\nomexecutableCode:
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 #fonction pour executer a distance via WMI $Process_cmd = { Param($Target,$exec) $random = get-random $cmd = "cmd /c $exec > C:\$random.txt" $processid = Invoke-WmiMethod -class Win32_process -name Create -ArgumentList $cmd -ComputerName $Target do { $resultprocess = Get-WmiObject win32_process -ComputerName $Target | where {$_.processid -eq $processid.processid } sleep 1 } until ($resultprocess -eq $null) if (test-path "\\$Target\C$\$random.txt") { try { $result = Get-Content \\$Target\C$\$random.txt -encoding ascii } catch {} try { remove-item \\$Target\C$\$random.txt -ErrorAction SilentlyContinue } catch {} } return $result } $Users = Import-Csv -Path ".\machine.csv" -Delimiter ";" foreach ($User in $Users) { $running = @(Get-Job | Where-Object { $_.State -eq 'Running' }) if ($running.Count -lt 5) { Start-Job -ScriptBlock $Process_cmd -ArgumentList $User.Nom, "d:\nomexecutable" -name $User.Nom } else { $running | Wait-Job Start-Job -ScriptBlock $Process_cmd -ArgumentList $User.Nom, "d:\nomexecutable" -name $User.Nom } Get-Job | Receive-Job }
La tu les lance 5 par 5 au maximum.
Pour tester, je le test sur un seul serveur.
voici le retour de la commande :
Id Name State HasMoreData Location Command
-- ---- ----- ----------- -------- -------
1 Job1 Running True localhost ...
Dans le fichier machine.csv
j'ai dans la cellule A1 : monserveur.domaine.fr;@IP
ou dois-je les séparer par cellule ?
Ton retour est normal.
Quand ton script distant aura fini son exécution tu devrais avoir un truc du genre : Completed False
en le relançant ??
Voici le retour quand je le relance :
PS C:\Users\\Downloads> & '.\Sans titre3.ps1'
Id Name State HasMoreData Location Command
-- ---- ----- ----------- -------- -------
3 Job3 Running True localhost ...
Impossible de valider l'argument sur le paramètre «*ComputerName*». L'argument est null ou vide. Indiquez un argument q
ui n'est pas null ou vide et réessayez.
+ CategoryInfo : InvalidData: (:) [Invoke-WmiMethod], ParameterBindingValidationException
+ FullyQualifiedErrorId : ParameterArgumentValidationError,Microsoft.PowerShell.Commands.InvokeWmiMethod
Impossible de valider l'argument sur le paramètre «*ComputerName*». L'argument est null ou vide. Indiquez un argument q
ui n'est pas null ou vide et réessayez.
+ CategoryInfo : InvalidData: (:) [Get-WmiObject], ParameterBindingValidationException
+ FullyQualifiedErrorId : ParameterArgumentValidationError,Microsoft.PowerShell.Commands.GetWmiObjectCommand