Udostępnij za pośrednictwem


"No enough quota" lors de l'éxécution d'un script dans une session powershell distante

Powershell permet l'éxécution de script sur des machines distantes via diverses commandes powershell : invoke-command, enter-pssession,...

Pour éviter que ces scripts distants ne saturent et n'utilisent toutes les ressources de la machine, des quotas sont assignés à ces sessions distantes. Certains de ces quotas sont implémentés via des Jobs Windows.

Par exemple les quotas MaxProcessesPerShell et MaxMemoryPerShellMB qui limitent le nombre maximum de processus concurrents dans cette session et la taille mémoire maximum utilisable par l'ensemble des processus de la session.

L'atteinte d'une de ces limites peut donner lieu à des erreurs diverses et variées (et pas toujours très facilement interprétables !) .

Ces limites doivent être alors augmentées à 2 niveaux (sur la machine cible) :

  • Limite globale imposée à l’ensemble des shells (Plugin) (dans WSMAN:\localhost\shell )
  • Limite pour le shell concerné (par exemple pour le plugin Powerhell 64 bits,  WSMAN:\localhost\Plugin\microsoft.powershell\Quotas )

Pour que ces modifications soient effectives, il faut redémarrer le service winrm.

Par exemple, pour limiter:

  • la mémoire utilisée par la session Powershell à 2GB 
  • le nombre maximum de processus dans la session à 30,

le script powershell suivant peut-être utilisé sur le serveur cible:

Set-item WSMAN:\localhost\shell\MaxMemoryPerShellMB 2048
Set-item WSMAN:\localhost\Plugin\microsoft.powershell\Quotas\MaxMemoryPerShellMB 2048
Set-item WSMAN:\localhost\shell\MaxProcessesPerShell 30
Set-item WSMAN:\localhost\Plugin\microsoft.powershell\Quotas\MaxProcessesPerShell 30
Restart-service WINRM

L'exemple suivant illustre l'erreur remontée lorsque l'on atteint la limite sur le nombre de processus. Le script 1.vbs ayant pour but de lancer une instance de notepad.

Le processus WsnProvhost.exe héberge la session remote Powershell. En examinant, les propriétés du processus avec Process Explorer (Sysinternals), on peut vérifier dans l'onglet "Job" les limites assignées au Job.