Comment héberger un script ou une application Powershell pour qu'il soit accessible via WSManConnectionInfo? (comme bureau 365)

les seuls moyens que je connaisse pour me connecter à un espace d'exécution distant incluent les paramètres suivants

   WSManConnectionInfo connectionInfo = 
     new WSManConnectionInfo(false, "localhost", 80, "/Powershell", "http://schemas.microsoft.com/powershell/Microsoft.Exchange", credential);

ou

   WSManConnectionInfo connectionInfo = 
     new WSManConnectionInfo(false, "localhost", 5985, "/wsman", "http://schemas.microsoft.com/powershell/Microsoft.Powershell", credential);
  • comment configurer mon propre objet Powershell personnalisé pour que je puisse l'exposer via HTTP?

  • Quels sont les bons paramètres à utiliser et comment les configurer?

19
demandé sur random65537 2012-03-27 17:03:42

1 réponses

il y a plusieurs pièces à cela, donc je vais les expliquer séparément et puis les rassembler.

Remoting Implicite

Exchange utilise Remoting Implicite.

la façon dont cela fonctionne est que vous établissez une PSSession vers une machine distante, puis importez certaines des commandes disponibles à partir de l'instance distante dans la vôtre.

Ceci est fait en utilisant Import-Module -Session $session ou Import-PSSession.

vous pouvez essayer ceci pour toi-même purement dans Powershell. Utilisez une station de travail qui n'a pas l'Active Directory RSAT installé (n'a pas l'ActiveDirectory powershell cmdlets), puis connectez-vous à une machine qui le fait (appelons-le DC1):

$s = New-PSSession -ComputerName DC1
Invoke-Command -Session $s -ScriptBlock { Import-Module ActiveDirectory }
Import-PSSession -Session $s -Module ActiveDirectory

Restreindre l'appel à Import-PSSession à un seul module vous permet d'importer seulement ces cmdlets. À ce stade, vous serait en mesure d'exécuter Get-ADComputer par exemple, comme si c'étaient disponibles localement, même si l'appel est fait sur DC1.

Configurations De Session

lorsque vous faites une connexion à distance powershell, vous vous connectez à une configuration de session. Si vous n'en spécifiez pas un, vous vous connectez à un appelé Microsoft.PowerShell. Pour voir toutes les configurations sont définies sur une machine, appeler Get-PSSessionConfiguration. Vous pourriez en voir d'autres, par exemple Microsoft.PowerShell32 est un moyen de se connecter à une session powershell 32 bits.

pour se connecter à une configuration spécifique, utilisez New-PSSession -ConfigurationName ou New-PSSession -ConnectionUri.

Définition Des Configurations De Session

Vous pouvez spécifier un beaucoup de choses dans une configuration de session; la version de powershell, le bitness, quels modules sont pré-importés, vous pouvez pré-définir des fonctions et du code, vous pouvez prévenir caractéristiques linguistiques de la disponibilité, etc.

Cette réponse fournit un bon aperçu de la façon de créer votre propre configuration.

Vous pouvez aussi mettre informations de configuration à l'intérieur d'un assemblage, ce qui fonctionnerait bien pour ce que vous essayez de faire.

Emballage Code en Modules

Comme vous l'avez vu avec Import-PSSession il est plus facile d'importer juste le code que vous voulez s'il existe dans un module. Par conséquent, vous devez vous assurer que votre cmdlet est exposé à travers un module.

vous avez dit dans un commentaire que vous vouliez écrire votre cmdlet en C#. Ce n'est pas quelque chose que j'ai fait, mais cet article semble fournir des instructions détaillées sur comment créer un Module PowerShell en C#.

C'est maintenant quelque chose que j'ai fait (et cet article est bon). Écrire un cmdlet en C# est, implicitement, déjà un module. En fait, vous pouvez utiliser Import-Module pour charger un ensemble compilé.net, qu'il contienne ou non des cmdlets PowerShell.

Par exemple, si vous avez créé une classe publique et compilé dans une DLL, vous pouvez le faire Import-Module MyAssembly.dll et cette classe est maintenant disponible dans votre session PowerShell.

définir le cmdlet en C # signifie inclure une référence à System.management.Automation et ensuite créer une classe qui hérite de Cmdlet ou PSCmdlet.

définir le Manifeste du module est recommandé mais techniquement optionnel, tout comme c'est le cas avec un module de script.

Je n'ai cependant pas inclus les informations de configuration de session dans une assemblée (encore?), et je n'ai pas vu de référence pour savoir comment faire.

L'apporter Ensemble

Les étapes doit à peu près ressembler à ceci:

  1. compiler le module et le rendre disponible sur l'extrémité distante, de sorte qu'il puisse être importé à powershell à partir d'une session locale sur cette machine.
  2. créer un nouveau fichier de configuration de PSSession, et spécifier -AssembliesToLoad ou -ModulesToImport (ou les deux si nécessaire), ou spécifiez les informations de configuration dans l'assemblage lui-même (probablement préférable ici).
  3. Enregistrer le configuration sur la machine.
  4. côté client, vous vouliez le mettre à disposition de PowerShell, donc vous vouliez simplement créer la session, puis l'importer:
    $s = New-PSSession -ComputerName RemoteMachine -ConfigurationName MyConfig
    # The configuration was defined in such a way 
    # that your module will already be imported in the remote session.
    Import-PSSession -Module MyModule

le Simplifier?

Vous n'avez pas créer une configuration personnalisée du côté distant. Aussi longtemps que votre module est disponible pour n'importe quelle session powershell sur la machine distante, vous pouvez sauter les étapes de configuration de la session, et alors vous pourriez juste faire:

$s = New-PSSession -ComputerName RemoteMachine
Invoke-Command -Session $s -ScriptBlock { Import-Module MyModule }
Import-PSSession -Session $s -Module MyModule

mais vous pouvez vouloir la personnalisation et le contrôle supplémentaires que vous avez en utilisant une configuration de session, donc c'est à vous de décider. Comment change t-il, mais c'est peut-être exagéré pour vos besoins.

20
répondu briantist 2017-10-05 21:14:14