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
Ton fichier de machines est bien dans le meme répertoire que ton script ??
Il est bien constitué : Nom;IP
Machine1;@IP machine1
Machine2;@IP machine2 ??
oui oui,
dans un fichier csv portant le même nom que dans ton script.
Avec dans la cellule A1 : serveur.domaine.fr;@ip
Je me suis peut être mal exprimé :
dans ta cellule A1 met "Nom" dans ta cellule B1 met "IP"
dans A2 met "nom de ta machine" dans B2 met "@IP de ta machine"
ahhh ok :)
j'ai changé le fichier. le retour de la commande :
PS C:\Users\s0075871\Downloads> & '.\Sans titre3.ps1'
Id Name State HasMoreData Location Command
-- ---- ----- ----------- -------- -------
1 serveur.dom... Running True localhost ...
mais rien dans les logs du serveur
Supprime le morceau de code
Tu devrais avoir un log de type 2132654654.txt dans le répertoire de ton script distant.Code:
1
2
3
4
5 try { remove-item \\$Target\C$\$random.txt -ErrorAction SilentlyContinue } catch {}
Je ne sais pas ce que ton script distant fait, mais lorsqu'il fini son exécution, sur ta fenêtre powershell doit s'afficher :
Id Name State HasMoreData Location Command
-- ---- ----- ----------- -------- -------
1 Job1 Running True localhost ...
1 Job1 Completed False localhost ...
j'ai pas le fichier de log dans le répertoire distant.
en supprimant la ligne, cela ne change rien à l'execution
Ton script distant fait quoi ??
Essaie avec un script qui fait quelque chose de simple.
Si tu n'a pas vu :
Id Name State HasMoreData Location Command
-- ---- ----- ----------- -------- -------
1 Job1 Running True localhost ...
1 Job1 Completed False localhost ...
c'est que ton script distant n'a pas fini son job.
il lance une autre commande :)
en gros j'ai deux actions à faire. dans un premier temps lancer un cmd. puis un vbs.
Mon script pour le vbs fonctionne, mais pas pour le cmd.
Un script avec psexec ne fonctionne pas avec du cmd.
Je n'ai pas tout compris ^^
Mais quand tu lance tes scripts en local ils fonctionnent ??
dans le script que tu as fait, il y a t'il la possibilité d'intégrer une mire d'authentification ? (login +mdp (avec domaine différant)) pour exécuter ce cmd distant avec un identifiant différant ?
tu as quoi en tête comme méthode ?
pour vous aidées à faire avancé les choses, ci-dessous le code pour la fonction "Process_cmd_user" avec le passage d'un login et mot de passe (en clair, non scrypté avec credential)
pour info on utilise cette fonction avec un utilisateur admin sinon il ne peut pas généré le fichier de retour a la racine du disque C: !
pour un utilisateur "normal" il faut trouvé un dossier ou il a les droit en écriture. (pas si facile que ca)
pour demande le login et mot de passe le code suivant devrait suffire :
un exemple d'utilisation :Code:
1
2 $login = Read-Host -Prompt "ton login" $password = Read-Host -Prompt "ton mot de passe"
Code:Process_cmd_user $ordi "domain\$login" $motDePasse "gpupdate /force"
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 function Process_cmd_user { Param($Target, $login, $password, $exec) $random = get-random #cmd to execute remotely $cmd = "cmd /c $exec > C:\$random.txt" #execute the cmd remotely $pwdscurestring = Convertto-SecureString -AsPlainText $password -Force $Credential = New-Object -typename System.Management.Automation.PSCredential -ArgumentList $login, $pwdscurestring $processid = Invoke-WmiMethod -class Win32_process -name Create -ArgumentList $cmd -ComputerName $Target -Credential $Credential -WarningAction SilentlyContinue -ErrorAction SilentlyContinue if ($processid -ne $null) { #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 copy-item -path \\$Target\C$\$random.txt -destination .\ #get the log content create by the cmd $result=Get-Content .\$random.txt -encoding ascii #remove the log remove-item \\$Target\C$\$random.txt remove-item .\$random.txt } else { $result = "" } return $result }
Salut 6ratgus,
merci pour ton aide. Mais j'avoue ne plus rien comprendre... Déja que je nage pas mal...
Donc, pour résumer :
c'est ca ?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
39
40
41
42
43
44
45
46
47
48
49
50 #Ici, je mets mes identifiant $login = Read-Host -Prompt "ton login" $password = Read-Host -Prompt "ton mot de passe" #ici, je ne vois pas trop à quoi ca serre.... Process_cmd_user $ordi "domain\$login" $motDePasse "gpupdate /force" function Process_cmd_user { Param($Target, $login, $password, $exec) $random = get-random #ici, c'est mon fichier cmd en local sur les serveurs à lancer, je remplace donc par le chemin de mon cmd $cmd = "cmd /c $exec > C:\$random.txt" #Et ici, en gros, c'est le script qui va exectuer le cmd à distance $pwdscurestring = Convertto-SecureString -AsPlainText $password -Force $Credential = New-Object -typename System.Management.Automation.PSCredential -ArgumentList $login, $pwdscurestring $processid = Invoke-WmiMethod -class Win32_process -name Create -ArgumentList $cmd -ComputerName $Target -Credential $Credential -WarningAction SilentlyContinue -ErrorAction SilentlyContinue if ($processid -ne $null) { #là on attand que la commande soit OK do { $resultprocess = Get-WmiObject win32_process -ComputerName $Target | where {$_.processid -eq $processid.processid } sleep 1 } until ($resultprocess -eq $null) #là, création d'un fichier de log sur le serveur distant où se trouve le cmd à lancer (pas besoin de l'absolu) copy-item -path \\$Target\C$\$random.txt -destination .\ #get the log content create by the cmd $result=Get-Content .\$random.txt -encoding ascii #suppression du log distant remove-item \\$Target\C$\$random.txt remove-item .\$random.txt } else { $result = "" } return $result }
j'ai pas mal de point que je ne comprend pas...
oui c'est ça, sauf que la fonction doit être déclaré au debut
sinon je te laisse poursuivre avec moman qui te donnais la bonne marche à suivre !
qu’entends tu par fonction ?
Je ne visualise pas son utilité
comme ceci :
c'est pour l'exemple bien sur, c'est à toi de l'adapté à ton script ou celui de momanCode:
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
43
44
45
46
47
48 #Ici, je mets mes identifiant $login = Read-Host -Prompt "ton login" $password = Read-Host -Prompt "ton mot de passe" function Process_cmd_user { Param($Target, $login, $password, $exec) $random = get-random #ici, c'est mon fichier cmd en local sur les serveurs à lancer, je remplace donc par le chemin de mon cmd $cmd = "cmd /c $exec > C:\$random.txt" #Et ici, en gros, c'est le script qui va exectuer le cmd à distance $pwdscurestring = Convertto-SecureString -AsPlainText $password -Force $Credential = New-Object -typename System.Management.Automation.PSCredential -ArgumentList $login, $pwdscurestring $processid = Invoke-WmiMethod -class Win32_process -name Create -ArgumentList $cmd -ComputerName $Target -Credential $Credential -WarningAction SilentlyContinue -ErrorAction SilentlyContinue if ($processid -ne $null) { #là on attand que la commande soit OK do { $resultprocess = Get-WmiObject win32_process -ComputerName $Target | where {$_.processid -eq $processid.processid } sleep 1 } until ($resultprocess -eq $null) #là, création d'un fichier de log sur le serveur distant où se trouve le cmd à lancer (pas besoin de l'absolu) copy-item -path \\$Target\C$\$random.txt -destination .\ #get the log content create by the cmd $result=Get-Content .\$random.txt -encoding ascii #suppression du log distant remove-item \\$Target\C$\$random.txt remove-item .\$random.txt } else { $result = "" } return $result } #ici, l'appel de la fonction ci-dessus pour l'exemple bien sur a toi de l'adapté a ton script Process_cmd_user $ordi "domain\$login" $motDePasse "gpupdate /force"
tu trouvera ici les bases indispensables pour la programmation en powershell
Merci de votre aide. Je vais me débrouiller.
:)