l'accès à un firewall distant, sais-tu si cette méthode est applicable?
Je ne pratique pas le remote scripting, mais j'ai vu ceci :
http://msdn2.microsoft.com/en-us/library/aa366439.aspx
je ne sais pas si ça fait avancer le schmilblik :-)
l'accès à un firewall distant, sais-tu si cette méthode est applicable?
Je ne pratique pas le remote scripting, mais j'ai vu ceci :
http://msdn2.microsoft.com/en-us/library/aa366439.aspx
je ne sais pas si ça fait avancer le schmilblik :-)
l'accès à un firewall distant, sais-tu si cette méthode est applicable?
Je ne pratique pas le remote scripting, mais j'ai vu ceci :
http://msdn2.microsoft.com/en-us/library/aa366439.aspx
je ne sais pas si ça fait avancer le schmilblik :-)
"Robby" wrote in message
news:Jacques,
J'ai fait le fichier unique, en effet toutes les infos sont dedans mais
je ne sais pas quelles ordinateurs ca concerne.
Pourrias-tu m'aider ?
Encore merci,
Tu peux ajouter du texte avant et/ou après l'exécution de psexec, soit en
redirigant chaque ligne vers le fichier de sortie, soit en encadrant les
commandes par $(...) et en redirigeant l'ensemble vers le fichier. Je te
donne un exemple avec cette dernière méthode. Pour faciliter la
lisibilité, j'écris la suite de commandes sur plusieurs lignes:
get-content postes.txt | foreach {
$(
"$_ :"
psexec $_ netsh firewall show portopening
"=" * 67
) | out-file ports.txt -append
}
Il y aurait également moyen d'utiliser la méthode de Jean (accès au
firewall via l'objet COM). Même si l'objet COM n'est pas directement
attaquable à distance (du moins je ne vois pas comment, mais mes
connaissances en la matière sont limitées je l'avoue) il est toujours
possible d'utiliser la même technique que ci-dessus, c'est-à-dire faire
exécuter la tâche à distance via psexec.
L'avantage de la solution de Jean est qu'avec un minimum d'adaptation elle
pourrait te permettre de stocker les infos de manière un peu plus
exploitable qu'un simple fichier texte, par exemple sous la forme d'un
fichier CSV ou en XML, de manière à pouvoir reprendre les infos dans Excel
ou toute autre appli pour les analyser. On pourrait également le faire
dans le script ci-dessus en décortiquant la sortie de netsh, mais c'est un
peu plus compliqué.
L'inconvénient de la solution de Jean est qu'elle est écrite en
PowerShell. Hé oui, ça peut être un inconvénient ;-) : si tu veux
l'exécuter sur tous les postes il faut au préalable installer PowerShell
sur ces mêmes postes. Evidemment, on peut sans doute traduire tout ça en
VBScript.
Mais bon, si la solution ci-dessus te convient, pas de souci.
Jacques
"Robby" <fabrice@discussions.microsoft.com> wrote in message
news:uHxuouPgHHA.3412@TK2MSFTNGP02.phx.gbl...
Jacques,
J'ai fait le fichier unique, en effet toutes les infos sont dedans mais
je ne sais pas quelles ordinateurs ca concerne.
Pourrias-tu m'aider ?
Encore merci,
Tu peux ajouter du texte avant et/ou après l'exécution de psexec, soit en
redirigant chaque ligne vers le fichier de sortie, soit en encadrant les
commandes par $(...) et en redirigeant l'ensemble vers le fichier. Je te
donne un exemple avec cette dernière méthode. Pour faciliter la
lisibilité, j'écris la suite de commandes sur plusieurs lignes:
get-content postes.txt | foreach {
$(
"$_ :"
psexec \$_ netsh firewall show portopening
"=" * 67
) | out-file ports.txt -append
}
Il y aurait également moyen d'utiliser la méthode de Jean (accès au
firewall via l'objet COM). Même si l'objet COM n'est pas directement
attaquable à distance (du moins je ne vois pas comment, mais mes
connaissances en la matière sont limitées je l'avoue) il est toujours
possible d'utiliser la même technique que ci-dessus, c'est-à-dire faire
exécuter la tâche à distance via psexec.
L'avantage de la solution de Jean est qu'avec un minimum d'adaptation elle
pourrait te permettre de stocker les infos de manière un peu plus
exploitable qu'un simple fichier texte, par exemple sous la forme d'un
fichier CSV ou en XML, de manière à pouvoir reprendre les infos dans Excel
ou toute autre appli pour les analyser. On pourrait également le faire
dans le script ci-dessus en décortiquant la sortie de netsh, mais c'est un
peu plus compliqué.
L'inconvénient de la solution de Jean est qu'elle est écrite en
PowerShell. Hé oui, ça peut être un inconvénient ;-) : si tu veux
l'exécuter sur tous les postes il faut au préalable installer PowerShell
sur ces mêmes postes. Evidemment, on peut sans doute traduire tout ça en
VBScript.
Mais bon, si la solution ci-dessus te convient, pas de souci.
Jacques
"Robby" wrote in message
news:Jacques,
J'ai fait le fichier unique, en effet toutes les infos sont dedans mais
je ne sais pas quelles ordinateurs ca concerne.
Pourrias-tu m'aider ?
Encore merci,
Tu peux ajouter du texte avant et/ou après l'exécution de psexec, soit en
redirigant chaque ligne vers le fichier de sortie, soit en encadrant les
commandes par $(...) et en redirigeant l'ensemble vers le fichier. Je te
donne un exemple avec cette dernière méthode. Pour faciliter la
lisibilité, j'écris la suite de commandes sur plusieurs lignes:
get-content postes.txt | foreach {
$(
"$_ :"
psexec $_ netsh firewall show portopening
"=" * 67
) | out-file ports.txt -append
}
Il y aurait également moyen d'utiliser la méthode de Jean (accès au
firewall via l'objet COM). Même si l'objet COM n'est pas directement
attaquable à distance (du moins je ne vois pas comment, mais mes
connaissances en la matière sont limitées je l'avoue) il est toujours
possible d'utiliser la même technique que ci-dessus, c'est-à-dire faire
exécuter la tâche à distance via psexec.
L'avantage de la solution de Jean est qu'avec un minimum d'adaptation elle
pourrait te permettre de stocker les infos de manière un peu plus
exploitable qu'un simple fichier texte, par exemple sous la forme d'un
fichier CSV ou en XML, de manière à pouvoir reprendre les infos dans Excel
ou toute autre appli pour les analyser. On pourrait également le faire
dans le script ci-dessus en décortiquant la sortie de netsh, mais c'est un
peu plus compliqué.
L'inconvénient de la solution de Jean est qu'elle est écrite en
PowerShell. Hé oui, ça peut être un inconvénient ;-) : si tu veux
l'exécuter sur tous les postes il faut au préalable installer PowerShell
sur ces mêmes postes. Evidemment, on peut sans doute traduire tout ça en
VBScript.
Mais bon, si la solution ci-dessus te convient, pas de souci.
Jacques
"Robby" wrote in message
news:Jacques,
J'ai fait le fichier unique, en effet toutes les infos sont dedans mais
je ne sais pas quelles ordinateurs ca concerne.
Pourrias-tu m'aider ?
Encore merci,
Tu peux ajouter du texte avant et/ou après l'exécution de psexec, soit en
redirigant chaque ligne vers le fichier de sortie, soit en encadrant les
commandes par $(...) et en redirigeant l'ensemble vers le fichier. Je te
donne un exemple avec cette dernière méthode. Pour faciliter la
lisibilité, j'écris la suite de commandes sur plusieurs lignes:
get-content postes.txt | foreach {
$(
"$_ :"
psexec $_ netsh firewall show portopening
"=" * 67
) | out-file ports.txt -append
}
Il y aurait également moyen d'utiliser la méthode de Jean (accès au
firewall via l'objet COM). Même si l'objet COM n'est pas directement
attaquable à distance (du moins je ne vois pas comment, mais mes
connaissances en la matière sont limitées je l'avoue) il est toujours
possible d'utiliser la même technique que ci-dessus, c'est-à-dire faire
exécuter la tâche à distance via psexec.
L'avantage de la solution de Jean est qu'avec un minimum d'adaptation elle
pourrait te permettre de stocker les infos de manière un peu plus
exploitable qu'un simple fichier texte, par exemple sous la forme d'un
fichier CSV ou en XML, de manière à pouvoir reprendre les infos dans Excel
ou toute autre appli pour les analyser. On pourrait également le faire
dans le script ci-dessus en décortiquant la sortie de netsh, mais c'est un
peu plus compliqué.
L'inconvénient de la solution de Jean est qu'elle est écrite en
PowerShell. Hé oui, ça peut être un inconvénient ;-) : si tu veux
l'exécuter sur tous les postes il faut au préalable installer PowerShell
sur ces mêmes postes. Evidemment, on peut sans doute traduire tout ça en
VBScript.
Mais bon, si la solution ci-dessus te convient, pas de souci.
Jacques
"Robby" <fabrice@discussions.microsoft.com> wrote in message
news:uHxuouPgHHA.3412@TK2MSFTNGP02.phx.gbl...
Jacques,
J'ai fait le fichier unique, en effet toutes les infos sont dedans mais
je ne sais pas quelles ordinateurs ca concerne.
Pourrias-tu m'aider ?
Encore merci,
Tu peux ajouter du texte avant et/ou après l'exécution de psexec, soit en
redirigant chaque ligne vers le fichier de sortie, soit en encadrant les
commandes par $(...) et en redirigeant l'ensemble vers le fichier. Je te
donne un exemple avec cette dernière méthode. Pour faciliter la
lisibilité, j'écris la suite de commandes sur plusieurs lignes:
get-content postes.txt | foreach {
$(
"$_ :"
psexec \$_ netsh firewall show portopening
"=" * 67
) | out-file ports.txt -append
}
Il y aurait également moyen d'utiliser la méthode de Jean (accès au
firewall via l'objet COM). Même si l'objet COM n'est pas directement
attaquable à distance (du moins je ne vois pas comment, mais mes
connaissances en la matière sont limitées je l'avoue) il est toujours
possible d'utiliser la même technique que ci-dessus, c'est-à-dire faire
exécuter la tâche à distance via psexec.
L'avantage de la solution de Jean est qu'avec un minimum d'adaptation elle
pourrait te permettre de stocker les infos de manière un peu plus
exploitable qu'un simple fichier texte, par exemple sous la forme d'un
fichier CSV ou en XML, de manière à pouvoir reprendre les infos dans Excel
ou toute autre appli pour les analyser. On pourrait également le faire
dans le script ci-dessus en décortiquant la sortie de netsh, mais c'est un
peu plus compliqué.
L'inconvénient de la solution de Jean est qu'elle est écrite en
PowerShell. Hé oui, ça peut être un inconvénient ;-) : si tu veux
l'exécuter sur tous les postes il faut au préalable installer PowerShell
sur ces mêmes postes. Evidemment, on peut sans doute traduire tout ça en
VBScript.
Mais bon, si la solution ci-dessus te convient, pas de souci.
Jacques
"Robby" wrote in message
news:Jacques,
J'ai fait le fichier unique, en effet toutes les infos sont dedans mais
je ne sais pas quelles ordinateurs ca concerne.
Pourrias-tu m'aider ?
Encore merci,
Tu peux ajouter du texte avant et/ou après l'exécution de psexec, soit en
redirigant chaque ligne vers le fichier de sortie, soit en encadrant les
commandes par $(...) et en redirigeant l'ensemble vers le fichier. Je te
donne un exemple avec cette dernière méthode. Pour faciliter la
lisibilité, j'écris la suite de commandes sur plusieurs lignes:
get-content postes.txt | foreach {
$(
"$_ :"
psexec $_ netsh firewall show portopening
"=" * 67
) | out-file ports.txt -append
}
Il y aurait également moyen d'utiliser la méthode de Jean (accès au
firewall via l'objet COM). Même si l'objet COM n'est pas directement
attaquable à distance (du moins je ne vois pas comment, mais mes
connaissances en la matière sont limitées je l'avoue) il est toujours
possible d'utiliser la même technique que ci-dessus, c'est-à-dire faire
exécuter la tâche à distance via psexec.
L'avantage de la solution de Jean est qu'avec un minimum d'adaptation elle
pourrait te permettre de stocker les infos de manière un peu plus
exploitable qu'un simple fichier texte, par exemple sous la forme d'un
fichier CSV ou en XML, de manière à pouvoir reprendre les infos dans Excel
ou toute autre appli pour les analyser. On pourrait également le faire
dans le script ci-dessus en décortiquant la sortie de netsh, mais c'est un
peu plus compliqué.
L'inconvénient de la solution de Jean est qu'elle est écrite en
PowerShell. Hé oui, ça peut être un inconvénient ;-) : si tu veux
l'exécuter sur tous les postes il faut au préalable installer PowerShell
sur ces mêmes postes. Evidemment, on peut sans doute traduire tout ça en
VBScript.
Mais bon, si la solution ci-dessus te convient, pas de souci.
Jacques
Jacques,
Je refaits un test avec plusieurs PCs,
mais voila que le script reste bloqué sur un ordi et il ne continu pas.
pourrais t-on forcer le script à derouler si il bloque sur un pc ?
Jacques,
Je refaits un test avec plusieurs PCs,
mais voila que le script reste bloqué sur un ordi et il ne continu pas.
pourrais t-on forcer le script à derouler si il bloque sur un pc ?
Jacques,
Je refaits un test avec plusieurs PCs,
mais voila que le script reste bloqué sur un ordi et il ne continu pas.
pourrais t-on forcer le script à derouler si il bloque sur un pc ?
"Robby" wrote in message
news:Jacques,
Je refaits un test avec plusieurs PCs,
mais voila que le script reste bloqué sur un ordi et il ne continu pas.
pourrais t-on forcer le script à derouler si il bloque sur un pc ?
La commande psexec a un paramètre -n qui permet de donner un délai maximal
pour l'établissement de la connexion avec la machine distante. Je n'ai pas
testé, mais tu peux peut-être t'en servir pour résoudre ce problème.
Si ça ne suffit pas, peux-tu donner plus de détails sur l'étape à laquelle
le script bloque?
Jacques
"Robby" <fabrice@discussions.microsoft.com> wrote in message
news:OtzjINagHHA.2332@TK2MSFTNGP04.phx.gbl...
Jacques,
Je refaits un test avec plusieurs PCs,
mais voila que le script reste bloqué sur un ordi et il ne continu pas.
pourrais t-on forcer le script à derouler si il bloque sur un pc ?
La commande psexec a un paramètre -n qui permet de donner un délai maximal
pour l'établissement de la connexion avec la machine distante. Je n'ai pas
testé, mais tu peux peut-être t'en servir pour résoudre ce problème.
Si ça ne suffit pas, peux-tu donner plus de détails sur l'étape à laquelle
le script bloque?
Jacques
"Robby" wrote in message
news:Jacques,
Je refaits un test avec plusieurs PCs,
mais voila que le script reste bloqué sur un ordi et il ne continu pas.
pourrais t-on forcer le script à derouler si il bloque sur un pc ?
La commande psexec a un paramètre -n qui permet de donner un délai maximal
pour l'établissement de la connexion avec la machine distante. Je n'ai pas
testé, mais tu peux peut-être t'en servir pour résoudre ce problème.
Si ça ne suffit pas, peux-tu donner plus de détails sur l'étape à laquelle
le script bloque?
Jacques
J'ai essayé avec -n 90, mais ca reste bloqué.
le script se lance:
il y a une ligne "connecting nomdel'ordi "qui s'affiche rapidement et
ensuite elle disparait, alors normalement elle reste affichée pendant
quelques secondes ~90 le temps qu'elle fasse sa requette.
ensuite le script ne se termine jamais, je suis obligé de faire ctrl-c.
Vois-tu ?
J'ai essayé avec -n 90, mais ca reste bloqué.
le script se lance:
il y a une ligne "connecting nomdel'ordi "qui s'affiche rapidement et
ensuite elle disparait, alors normalement elle reste affichée pendant
quelques secondes ~90 le temps qu'elle fasse sa requette.
ensuite le script ne se termine jamais, je suis obligé de faire ctrl-c.
Vois-tu ?
J'ai essayé avec -n 90, mais ca reste bloqué.
le script se lance:
il y a une ligne "connecting nomdel'ordi "qui s'affiche rapidement et
ensuite elle disparait, alors normalement elle reste affichée pendant
quelques secondes ~90 le temps qu'elle fasse sa requette.
ensuite le script ne se termine jamais, je suis obligé de faire ctrl-c.
Vois-tu ?
"Robby" wrote in message
news:J'ai essayé avec -n 90, mais ca reste bloqué.
le script se lance:
il y a une ligne "connecting nomdel'ordi "qui s'affiche rapidement et
ensuite elle disparait, alors normalement elle reste affichée pendant
quelques secondes ~90 le temps qu'elle fasse sa requette.
ensuite le script ne se termine jamais, je suis obligé de faire ctrl-c.
Vois-tu ?
Pas bien, non. As-tu la ligne "Starting psexec service on nomdel'ordi"
après la connexion?
As-tu vérifié que le PC est bien accessible en dehors de tout script, par
un simple ping ou par un psexec lancé en manuel?
Pour contrer ce genre de blocage de manière automatique, il faut changer
de tactique dans la façon de dérouler le script. Une tactique parmi
d'autres peut consister à créer une instance de la classe
System.Diagnostics.Process, la faire exécuter la requête pour un poste et
surveiller son temps d'exécution. Si le process met plus de x secondes
avant de rendre la main, on le termine de force et on passe au suivant.
C'est très faisable, mais là maintenant je n'ai pas le temps de faire un
premier jet. Je regarderai demain (jeudi) dans l'après-midi, à moins que
quelqu'un ait une réponse efficace d'ici là.
Jacques
"Robby" <fabrice@discussions.microsoft.com> wrote in message
news:egangrbgHHA.588@TK2MSFTNGP06.phx.gbl...
J'ai essayé avec -n 90, mais ca reste bloqué.
le script se lance:
il y a une ligne "connecting nomdel'ordi "qui s'affiche rapidement et
ensuite elle disparait, alors normalement elle reste affichée pendant
quelques secondes ~90 le temps qu'elle fasse sa requette.
ensuite le script ne se termine jamais, je suis obligé de faire ctrl-c.
Vois-tu ?
Pas bien, non. As-tu la ligne "Starting psexec service on nomdel'ordi"
après la connexion?
As-tu vérifié que le PC est bien accessible en dehors de tout script, par
un simple ping ou par un psexec lancé en manuel?
Pour contrer ce genre de blocage de manière automatique, il faut changer
de tactique dans la façon de dérouler le script. Une tactique parmi
d'autres peut consister à créer une instance de la classe
System.Diagnostics.Process, la faire exécuter la requête pour un poste et
surveiller son temps d'exécution. Si le process met plus de x secondes
avant de rendre la main, on le termine de force et on passe au suivant.
C'est très faisable, mais là maintenant je n'ai pas le temps de faire un
premier jet. Je regarderai demain (jeudi) dans l'après-midi, à moins que
quelqu'un ait une réponse efficace d'ici là.
Jacques
"Robby" wrote in message
news:J'ai essayé avec -n 90, mais ca reste bloqué.
le script se lance:
il y a une ligne "connecting nomdel'ordi "qui s'affiche rapidement et
ensuite elle disparait, alors normalement elle reste affichée pendant
quelques secondes ~90 le temps qu'elle fasse sa requette.
ensuite le script ne se termine jamais, je suis obligé de faire ctrl-c.
Vois-tu ?
Pas bien, non. As-tu la ligne "Starting psexec service on nomdel'ordi"
après la connexion?
As-tu vérifié que le PC est bien accessible en dehors de tout script, par
un simple ping ou par un psexec lancé en manuel?
Pour contrer ce genre de blocage de manière automatique, il faut changer
de tactique dans la façon de dérouler le script. Une tactique parmi
d'autres peut consister à créer une instance de la classe
System.Diagnostics.Process, la faire exécuter la requête pour un poste et
surveiller son temps d'exécution. Si le process met plus de x secondes
avant de rendre la main, on le termine de force et on passe au suivant.
C'est très faisable, mais là maintenant je n'ai pas le temps de faire un
premier jet. Je regarderai demain (jeudi) dans l'après-midi, à moins que
quelqu'un ait une réponse efficace d'ici là.
Jacques
Pour contrer ce genre de blocage de manière automatique, il faut changer
de tactique dans la façon de dérouler le script. Une tactique parmi
d'autres peut consister à créer une instance de la classe
System.Diagnostics.Process, la faire exécuter la requête pour un poste et
surveiller son temps d'exécution. Si le process met plus de x secondes
avant de rendre la main, on le termine de force et on passe au suivant.
Pour contrer ce genre de blocage de manière automatique, il faut changer
de tactique dans la façon de dérouler le script. Une tactique parmi
d'autres peut consister à créer une instance de la classe
System.Diagnostics.Process, la faire exécuter la requête pour un poste et
surveiller son temps d'exécution. Si le process met plus de x secondes
avant de rendre la main, on le termine de force et on passe au suivant.
Pour contrer ce genre de blocage de manière automatique, il faut changer
de tactique dans la façon de dérouler le script. Une tactique parmi
d'autres peut consister à créer une instance de la classe
System.Diagnostics.Process, la faire exécuter la requête pour un poste et
surveiller son temps d'exécution. Si le process met plus de x secondes
avant de rendre la main, on le termine de force et on passe au suivant.
"Jacques Barathon [MS]" wrote in message
news:%
<...>Pour contrer ce genre de blocage de manière automatique, il faut changer
de tactique dans la façon de dérouler le script. Une tactique parmi
d'autres peut consister à créer une instance de la classe
System.Diagnostics.Process, la faire exécuter la requête pour un poste et
surveiller son temps d'exécution. Si le process met plus de x secondes
avant de rendre la main, on le termine de force et on passe au suivant.
Bon, voici un script assez peu élaboré et difficile à tester en l'absence
d'une situation analogue à la tienne. Dis-moi si ça marche:
--- get-ports.ps1 ---
param (
[string]$computerlist,
[string]$logfile,
[int]$timeout = 120
)
get-content $computerlist | foreach {
"$_ :" >> $logfile
$ps = new-object System.Diagnostics.Process
$ps.StartInfo.FileName = "psexec.exe"
$ps.StartInfo.Arguments = "netsh $_ firewall show portopening"
$ps.StartInfo.UseShellExecute = $false
$ps.StartInfo.RedirectStandardOutput = $true
$ps.Start() > $null
while (!$ps.HasExited) {
$ps.StandardOutput.ReadLine() >> $logfile
if ([datetime]::now -gt $ps.StartTime.AddSeconds($timeout)) {
$ps.Kill()
}
}
"=" * 67 >> $logfile
}
--- fin ---
Tu dois lancer le script en précisant le nom du fichier qui contient la
liste des postes, un timeout en secondes (120 par défaut) et le nom du
fichier dans lequel il faut stocker le résultat. Par exemple:
PS> .get-ports postes.txt ports.txt 90
Comme je le disais, je n'ai pu tester que sur des postes qui répondent
normalement (ou alors avec des noms de machines inexistants auquel cas
psexec rend la main rapidement). A toi de voir si ça permet de débloquer
ta situation.
Si ça ne marche pas avec tes postes, c'est sans doute parce que la ligne
"$ps.StandardOutput.ReadLine() >> $logfile" bloque en attendant un retour.
Il faudra alors gérer différemment la redirection dans un fichier, par
exemple en l'incluant dans le process $ps lui-même.
Jacques
"Jacques Barathon [MS]" <jbaratho@online.microsoft.com> wrote in message
news:%23gQ3O9ggHHA.1240@TK2MSFTNGP04.phx.gbl...
<...>
Pour contrer ce genre de blocage de manière automatique, il faut changer
de tactique dans la façon de dérouler le script. Une tactique parmi
d'autres peut consister à créer une instance de la classe
System.Diagnostics.Process, la faire exécuter la requête pour un poste et
surveiller son temps d'exécution. Si le process met plus de x secondes
avant de rendre la main, on le termine de force et on passe au suivant.
Bon, voici un script assez peu élaboré et difficile à tester en l'absence
d'une situation analogue à la tienne. Dis-moi si ça marche:
--- get-ports.ps1 ---
param (
[string]$computerlist,
[string]$logfile,
[int]$timeout = 120
)
get-content $computerlist | foreach {
"$_ :" >> $logfile
$ps = new-object System.Diagnostics.Process
$ps.StartInfo.FileName = "psexec.exe"
$ps.StartInfo.Arguments = "netsh \$_ firewall show portopening"
$ps.StartInfo.UseShellExecute = $false
$ps.StartInfo.RedirectStandardOutput = $true
$ps.Start() > $null
while (!$ps.HasExited) {
$ps.StandardOutput.ReadLine() >> $logfile
if ([datetime]::now -gt $ps.StartTime.AddSeconds($timeout)) {
$ps.Kill()
}
}
"=" * 67 >> $logfile
}
--- fin ---
Tu dois lancer le script en précisant le nom du fichier qui contient la
liste des postes, un timeout en secondes (120 par défaut) et le nom du
fichier dans lequel il faut stocker le résultat. Par exemple:
PS> .get-ports postes.txt ports.txt 90
Comme je le disais, je n'ai pu tester que sur des postes qui répondent
normalement (ou alors avec des noms de machines inexistants auquel cas
psexec rend la main rapidement). A toi de voir si ça permet de débloquer
ta situation.
Si ça ne marche pas avec tes postes, c'est sans doute parce que la ligne
"$ps.StandardOutput.ReadLine() >> $logfile" bloque en attendant un retour.
Il faudra alors gérer différemment la redirection dans un fichier, par
exemple en l'incluant dans le process $ps lui-même.
Jacques
"Jacques Barathon [MS]" wrote in message
news:%
<...>Pour contrer ce genre de blocage de manière automatique, il faut changer
de tactique dans la façon de dérouler le script. Une tactique parmi
d'autres peut consister à créer une instance de la classe
System.Diagnostics.Process, la faire exécuter la requête pour un poste et
surveiller son temps d'exécution. Si le process met plus de x secondes
avant de rendre la main, on le termine de force et on passe au suivant.
Bon, voici un script assez peu élaboré et difficile à tester en l'absence
d'une situation analogue à la tienne. Dis-moi si ça marche:
--- get-ports.ps1 ---
param (
[string]$computerlist,
[string]$logfile,
[int]$timeout = 120
)
get-content $computerlist | foreach {
"$_ :" >> $logfile
$ps = new-object System.Diagnostics.Process
$ps.StartInfo.FileName = "psexec.exe"
$ps.StartInfo.Arguments = "netsh $_ firewall show portopening"
$ps.StartInfo.UseShellExecute = $false
$ps.StartInfo.RedirectStandardOutput = $true
$ps.Start() > $null
while (!$ps.HasExited) {
$ps.StandardOutput.ReadLine() >> $logfile
if ([datetime]::now -gt $ps.StartTime.AddSeconds($timeout)) {
$ps.Kill()
}
}
"=" * 67 >> $logfile
}
--- fin ---
Tu dois lancer le script en précisant le nom du fichier qui contient la
liste des postes, un timeout en secondes (120 par défaut) et le nom du
fichier dans lequel il faut stocker le résultat. Par exemple:
PS> .get-ports postes.txt ports.txt 90
Comme je le disais, je n'ai pu tester que sur des postes qui répondent
normalement (ou alors avec des noms de machines inexistants auquel cas
psexec rend la main rapidement). A toi de voir si ça permet de débloquer
ta situation.
Si ça ne marche pas avec tes postes, c'est sans doute parce que la ligne
"$ps.StandardOutput.ReadLine() >> $logfile" bloque en attendant un retour.
Il faudra alors gérer différemment la redirection dans un fichier, par
exemple en l'incluant dans le process $ps lui-même.
Jacques