Comment faire pour importer personnalisé module PowerShell dans la session à distance?
Je suis en développement personnalisé module PowerShell, que je voudrais utiliser dans le contexte d'une session à distance sur un autre ordinateur. Le code suivant (qui, évidemment, ne fonctionne pas) explique ce que je suis en train de réaliser:
import-module .\MyCustomModule.psm1
$session = new-pssession -computerName server01
invoke-command -session $session -scriptblock {
<# use function defined in MyCustomModule here #>
}
La première question est de savoir si il est possible de tout pour arriver à ce scénario? Je veux dire, je voudrais seulement mon module personnalisé à être physiquement présent sur ma machine, pas sur le serveur distant.
J'ai trouvé ce fil, mais je n'ai pas gérer à travail - il ne permet pas la création d'une session à distance de la machine en arrière au niveau local. Sans doute, je pose la configuration des limites mentionné quelque part dans les commentaires de ce thread... d'Ailleurs, l'auteur a mentionné les conséquences de performance qui est critique pour ma solution...
Si c'est possible, alors comment?
La version de PowerShell est actuellement pas une contrainte si la solution n'est disponible que dans PS 3.0 - je peux vivre avec cela.
- Doublon avec stackoverflow.com/questions/2830827/... ?
- Je ne crois pas que cela est pris en charge à droite de la boîte. Vous devez utiliser un hack comme ils ont essayé. Puis-je vous demander pourquoi vous ne pouvez pas il suffit d'installer le module sur l'ordinateur distant? C'est la solution intelligente.
- eh bien, oui, il est assez proche. Cependant, je n'ai pas réussi à faire la solution il y a le travail, et je suis le référencement de ce thread explicitement pour indiquer que j'ai essayé l'option, et en demandant des solutions de rechange 🙂
- l'idée était d'utiliser toutes les machines disponibles pour effectuer certains scénarios de déploiement, sans que rien ne doit être installé sur une machine distante. Mais si le scénario n'est pas pris en charge, nous aurons à vivre avec cette...
- Pourquoi ne pas placer le module dans un lieu public, démarrez votre scriptblock avec
Import-Module \\fileserver\folders\modulefolder
? Assurez-vous qu'il est signé numériquement ou utiliser quelque chose commeSet-ExecutionPolicy -ExecutionPolicy Bypass -Scope Process
avant de les importer pour ignorer les avertissements? - Est-il vraiment besoin d'être un module? Je suis tout à fait pour les modules mais
Invoke-Command -FilePath
transporter un seul fichier de script à la machine distante pour l'exécution. Bien sûr, si le fichier de script tente de point source ou appeler d'autres fichiers de script, ils doivent être sur la machine distante parce que Invoke-Command de ne pas les copier, il y a automatiquement. - hmm, oui... je veux dire, non... 🙂 Vous avez foiré mon PowerShell univers avant qu'il a commencé à devenir mature! Il n'a pas à être un module à moins que nous parlons de l'évolutivité et bien structuré, modulaire et facile à réutiliser le code. Mais je comprends votre point, et je pèse le pour et le contre dans mon cas particulier. En fait, je suis en train de (premier prototypage, à l'époque) la création d'une infrastructure de déploiement de notre application, et une séparation des fonctions de l'utilitaire et les applets de commande dans des modules semblait la voie à suivre pour moi. Comment voulez-vous aborder la tâche? Est-il fiable pour exiger des pré-requis sur une cible?
- Au risque de jouer avec votre PowerShell univers un peu plus, est-il une raison fonctions ne peuvent pas être évolutif, bien structuré, modulaire et facile à réutiliser sans être mis dans un module?
- Ils peuvent! Merci pour le commentaire, @mjolinor - en fait, j'ai essayé les deux variantes et ils ont tous deux le droit de vivre. J'ai choisi les modules, après un peu de discussion avec les développeurs. Je vais essayer de résumer ça dans ma réponse ci-dessous
Vous devez vous connecter pour publier un commentaire.
Il y avait quelques commentaires à la question, et j'ai passé un certain temps à étudier les diverses manières d'aborder le problème.
Pour commencer, ce que j'ai d'abord demandé n'est pas possible. Je veux dire, si vous allez au module, alors le module doit être physiquement présent sur une machine cible pour être en mesure de
Import-Module
dans la session à distance.Pour résumé ma question plus loin, je suis en train de créer une réutilisables PowerShell-cadre fondé sur le produit des déploiements. Ça va être un push-manière déploiements, ce qui signifie que nous encourageons les gens à exécuter des scripts sur un ordinateur local à déployer à une certaine distance du serveur. Aussi loin que je me suis renseignée sur la zone, il y a deux moyens possibles, qui sont amicaux au sens commun.
Modules approche
Le processus à suivre:
*.psm1
)PSModulePath
variable d'inclure les nouveaux modules de localisationInvoke-Command -Session $s -ScriptBlock {...}
Import-Module CustomModule
- il va rechercher leCustomModule
sur une machine distante et évidemment trouverezAvantages
Les éléments suivants sont les raisons d'aimer cette approche pour:
Inconvénients
Il est important de prendre en considération:
xcopy
à partir du dossier partagé. En outre, le mécanisme de livraison devrait soutenir upgrade /downgrade et (de préférence) multi-installations d'instance, mais c'est plus lié à ma tâche que de en général, le problèmeScripts approche
Le processus à suivre:
Invoke-Command -Session $s -FilePath .\myscript.ps1
pour charger les fonctions définies dans un script pour la session à distanceInvoke-Command -Session $s -ScriptBlock {...}
et se référer à vos fonctions personnalisées - ils seront là dans une sessionAvantages
Suivantes sont de bons points de cette approche:
Inconvénients
Sûr, ce n'est pas idéal:
Enfin, je dois dire que la machine distante doit encore être préparé pour l'accès distant. C'est ce que je veux dire:
Set-ExecutionPolicy Unrestricted
Enable-PSRemoting
Voici une autre approche: Recréer le module dans une session à distance, sans avoir à copier les fichiers.
J'ai fait aucune tentative pour faire face à des dépendances entre les modules, mais cela semble fonctionner ok pour la simple autonome des modules. Il s'appuie sur le module est disponible dans les locaux de la session, ce qui la rend la détermination des exportations plus facile, mais avec un peu de travail supplémentaire qu'il serait aussi travailler avec un fichier de module.
Je ne crois pas que cela est pris en charge à droite de la boîte, sans aucun "hacks". La smart move serait probablement de mettre le module sur un lieu public comme un serveur de fichiers et l'importer sur le serveur quand vous en avez besoin. Ex:
Ce sujet de faire scriptblock de votre fonction personnalisée et l'envoyer à terget serveurs à l'aide de
Invoke-command
Merci pour ce fil, il a été utile....
Mais j'ai réécrit la fonction.
Être conscient, que du néant la fonction d'origine de ce post ou ce réécrit la fonction inclut le module de données du manifeste. Si vous ne pouvez pas compter sur les vérifications de version du module.