Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Powershell - utilisation variable

14 réponses
Avatar
Bruno GUERPILLON
Bonjour,

Je voudrais utiliser des variables mais j'ai quelques misères. Le script en
lui-même :

=================================================
$COMP1 = read-host "Nom de l'ordinateur : (si local, faites <Entrée>)"
IF ($COMP1) { $opt = "-computer $COMP1" }
Get-WmiObject -class WIN32_service $opt | format-table -Property Name,
Displayname -autosize -wrap
=================================================

Mais cela ne fonctionne pas, l'erreur :

=================================================
Get-WmiObject : Demande non valide
Au niveau de F:\_Systeme_Admin\powershell\getservice.ps1 : 3 Caractère : 14
+ Get-WmiObject <<<< -class WIN32_service $opt | format-table -Property
Name, Displayname -autosize -wrap
=================================================

Le problème que j'ai c'est que la subsitution de $opt ne se fait pas. Une
idée ?

Amicalement,

Bruno

10 réponses

1 2
Avatar
Michel Claveau
Je ne sais pas, mais ça marche avec ça :

$COMP1 = read-host "Nom de l'ordinateur : (si local, '.')"

Get-WmiObject -class WIN32_service -computername $COMP1 | format-table
-Property Name, Displayname -autosize -wrap






--
@-salutations

Michel Claveau
Avatar
Gilles LAURENT
"Bruno GUERPILLON" a écrit dans le message
de news:
| Bonjour,

Bonjour,

| Je voudrais utiliser des variables mais j'ai quelques misères. Le
| script en lui-même :
|
| ================================================ | $COMP1 = read-host "Nom de l'ordinateur : (si local, faites <Entrée>)"
| IF ($COMP1) { $opt = "-computer $COMP1" }
| Get-WmiObject -class WIN32_service $opt | format-table -Property Name,
| Displayname -autosize -wrap
| ================================================ |
| Mais cela ne fonctionne pas, l'erreur :
|
| ================================================ | Get-WmiObject : Demande non valide
| Au niveau de F:_Systeme_Adminpowershellgetservice.ps1 : 3
| Caractère : 14 + Get-WmiObject <<<< -class WIN32_service $opt |
| format-table -Property Name, Displayname -autosize -wrap
| ================================================ |
| Le problème que j'ai c'est que la subsitution de $opt ne se fait pas.
| Une idée ?
|
| Amicalement,
|
| Bruno

Il suffit d'exécuter la commande PowerShell disponible sous forme de
chaîne via la commandlet Invoke-Expression :
Invoke-Expression "Get-WMIObject -class Win32_Service $opt |
format-table"

--
Gilles LAURENT
http://glsft.free.fr
Avatar
Bruno GUERPILLON
Bonjour Gilles

Merci pour m'avoir eclairé sur Invoke-Expression.

Au final mon script (de départ) ressemble à ceci :

$COMP1 = read-host "Nom de l'ordinateur : (si local, faites <Entrée>)"
IF ($COMP1) { $opt = "-computer $COMP1" }
$command = "Get-WmiObject -class WIN32_service $opt | format-table -Property
Name, Displayname -autosize -wrap"
invoke-expression $command

Amicalement,

Bruno.


"Gilles LAURENT" a écrit dans le message de
news:%
"Bruno GUERPILLON" a écrit dans le message
de news:
| Bonjour,

Bonjour,

| Je voudrais utiliser des variables mais j'ai quelques misères. Le
| script en lui-même :
|
| ================================================ > | $COMP1 = read-host "Nom de l'ordinateur : (si local, faites <Entrée>)"
| IF ($COMP1) { $opt = "-computer $COMP1" }
| Get-WmiObject -class WIN32_service $opt | format-table -Property Name,
| Displayname -autosize -wrap
| ================================================ > |
| Mais cela ne fonctionne pas, l'erreur :
|
| ================================================ > | Get-WmiObject : Demande non valide
| Au niveau de F:_Systeme_Adminpowershellgetservice.ps1 : 3
| Caractère : 14 + Get-WmiObject <<<< -class WIN32_service $opt |
| format-table -Property Name, Displayname -autosize -wrap
| ================================================ > |
| Le problème que j'ai c'est que la subsitution de $opt ne se fait pas.
| Une idée ?
|
| Amicalement,
|
| Bruno

Il suffit d'exécuter la commande PowerShell disponible sous forme de
chaîne via la commandlet Invoke-Expression :
Invoke-Expression "Get-WMIObject -class Win32_Service $opt |
format-table"

--
Gilles LAURENT
http://glsft.free.fr




Avatar
Bruno GUERPILLON
Bonjour Michel,

Merci pour le tuyau. Finalement je vais utiliser Invoke-Expression (voir
réponse dans le thread).

Amicalement,

Bruno.


"Michel Claveau" <Enleverles a écrit dans le
message de news:
Je ne sais pas, mais ça marche avec ça :

$COMP1 = read-host "Nom de l'ordinateur : (si local, '.')"

Get-WmiObject -class WIN32_service -computername $COMP1 |
format-table -Property Name, Displayname -autosize -wrap






--
@-salutations

Michel Claveau




Avatar
Méta-MCI
Re !

Invoke-Expression sera TRES intéressant, le jour où on aura un PowerShell
comme serveur COM.
Cela permettra de faire (presque) n'importe quoi, depuis (presque) n'importe
quels langages ou applications.

@+

MCI
Avatar
Jacques Barathon [MS]
"Bruno GUERPILLON" wrote in message
news:
Bonjour Gilles

Merci pour m'avoir eclairé sur Invoke-Expression.

Au final mon script (de départ) ressemble à ceci :

$COMP1 = read-host "Nom de l'ordinateur : (si local, faites <Entrée>)"
IF ($COMP1) { $opt = "-computer $COMP1" }
$command = "Get-WmiObject -class WIN32_service $opt |
format-table -Property Name, Displayname -autosize -wrap"
invoke-expression $command


Je profite d'une brève éclaircie dans ces quelques semaines un peu
mouvementées pour apporter un bémol à cette solution à priori très tentante,
et à fortiori efficace. La commandelette invoke-expression est à manipuler
avec beaucoup de précautions dans un contexte comme celui-ci où une partie
du contenu est déterminée par la saisie de l'utilisateur. On est alors dans
un magnifique exemple d'injection de code. Imaginez que l'utilisateur, ou
très taquin ou un brin maladroit, saisisse le texte suivant lorsque le
script le lui demande le nom de l'ordinateur:

| %{$_.StopService()}

Le résultat (non testé mais à peu près garanti pur beurre) est un arrêt
immédiat de tous les services du poste. Et ceci n'est évidemment qu'un
exemple, "the sky is your limit"...

Il vaut donc mieux réserver invoke-expression à des contextes où le contenu
de la commande à exécuter peut être protégé soit par la fourniture des
éléments de texte uniquement en interne depuis le script, soit par un
contrôle très strict du texte apporté par des sources extérieures.

Dans ce cas précis, la solution de Michel (lecture de $comp1, utilisation de
$comp1 comme valeur passée au paramètre -computername) est de TRES LOIN la
plus sûre.

Jacques

Avatar
Gilles LAURENT
"Jacques Barathon [MS]" a écrit dans le
message de news:

| Je profite d'une brève éclaircie dans ces quelques semaines un peu
| mouvementées pour apporter un bémol à cette solution à priori très
| tentante, et à fortiori efficace. La commandelette invoke-expression
| est à manipuler avec beaucoup de précautions dans un contexte comme
| celui-ci où une partie du contenu est déterminée par la saisie de
| l'utilisateur. On est alors dans un magnifique exemple d'injection de
| code. Imaginez que l'utilisateur, ou très taquin ou un brin
| maladroit, saisisse le texte suivant lorsque le script le lui demande
| le nom de l'ordinateur:
|
|| %{$_.StopService()}
|
| Le résultat (non testé mais à peu près garanti pur beurre) est un
| arrêt immédiat de tous les services du poste. Et ceci n'est
| évidemment qu'un exemple, "the sky is your limit"...
[...]

En effet, je vous l'accorde, il peut y avoir un risque d'injection de
code malveillant. Cependant, le risque est présent uniquement si le
script s'exécute sous une autorité différente de celle de l'utilisateur,
ce qui, je pense, est rarement le cas d'un script Powershell
d'administration. Ci-dessous un lien vers un article fort intéressant :
http://blogs.msdn.com/powershell/archive/2006/11/23/protecting-against-malicious-code-injection.aspx

"Code injection attacks become attacks once they cross a trust boundary.
If they don't cross a trust boundary, they are just a complicated and
buggy way of doing what a user could already do." - Lee Holmes -
PowerShell Team

Quoi qu'il en soit, la commandlet Invoke-Expression est à manipuler avec
précaution, tout comme Execute et ExecuteGlobal en VBScript d'ailleur
;-)

--
Gilles LAURENT
http://glsft.free.fr
Avatar
Michel Claveau
Bonsoir !


la solution de Michel est de TRES LOIN la plus...


Combien te dois-je ? Un panaché, ça ira ?







--
@-salutations

Michel Claveau

Avatar
Jacques Barathon [MS]
"Gilles LAURENT" wrote in message
news:
"Jacques Barathon [MS]" a écrit dans le
message de news:
<...>

En effet, je vous l'accorde, il peut y avoir un risque d'injection de
code malveillant. Cependant, le risque est présent uniquement si le
script s'exécute sous une autorité différente de celle de l'utilisateur,
ce qui, je pense, est rarement le cas d'un script Powershell
d'administration. Ci-dessous un lien vers un article fort intéressant :
http://blogs.msdn.com/powershell/archive/2006/11/23/protecting-against-malicious-code-injection.aspx

"Code injection attacks become attacks once they cross a trust boundary.
If they don't cross a trust boundary, they are just a complicated and
buggy way of doing what a user could already do." - Lee Holmes -
PowerShell Team


L'avis de Lee est tout à fait juste, mais il parle "d'attaque". Je n'allais
pas jusque là. Evidemment, dans mon exemple j'ai un peu trop forcé le trait
pour représenter une faute de frappe ou une simple confusion dans ce qui est
demandé, mais je voulais attirer votre attention sur une source importante
de comportements imprévisibles voire destructeurs en cas d'erreur.

Surtout que dans ce cas précis, l'utilisation d'invoke-expression est
totalement inutile, l'objectif initial de Bruno étant simplement de passer
une valeur variable à un paramètre qui, lui, est toujours le même. On est
donc assez loin des cas où on a besoin de construire une expression à la
volée. Et finalement, pourquoi faire compliqué et risqué quand on peut faire
simple et sûr?

Quoi qu'il en soit, la commandlet Invoke-Expression est à manipuler avec
précaution, tout comme Execute et ExecuteGlobal en VBScript d'ailleur
;-)


Tout à fait Gilles. :-)

Jacques

Avatar
Jacques Barathon [MS]
"Michel Claveau" <Enleverles wrote in message
news:
Bonsoir !

la solution de Michel est de TRES LOIN la plus...


Combien te dois-je ? Un panaché, ça ira ?


Ah oui, un panaché je veux bien! Et en terrasse s'il te plaît! :-)

Jacques


1 2