如何托管Powershell脚本或应用程序,以便可以通过WSManConnectionInfo访问它?(如Office 365)

goo*_*ate 19 c# powershell cmdlets powershell-remoting runspace

我知道连接到远程运行空间的唯一方法包括以下参数

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

要么

   WSManConnectionInfo connectionInfo = 
     new WSManConnectionInfo(false, "localhost", 5985, "/wsman", "http://schemas.microsoft.com/powershell/Microsoft.Powershell", credential);
Run Code Online (Sandbox Code Playgroud)
  • 如何设置我自己的自定义Powershell对象,以便通过HTTP公开它?

  • 使用的正确参数是什么以及如何设置它们?

bri*_*ist 20

这有几个部分,所以我将分别解释它们然后将它们组合在一起.

隐含的远程教育

Exchange正在使用Implicit Remoting.

它的工作方式是为远程机器建立PSSession,然后将远程实例提供的一些命令导入到您自己的命令中.

这是使用Import-Module -Session $session或完成的Import-PSSession.

你可以在Powershell中为自己尝试这个.使用未安装Active Directory RSAT的工作站(没有ActiveDirectory powershell cmdlet),然后连接到执行的计算机(让我们调用它DC1):

$s = New-PSSession -ComputerName DC1
Invoke-Command -Session $s -ScriptBlock { Import-Module ActiveDirectory }
Import-PSSession -Session $s -Module ActiveDirectory
Run Code Online (Sandbox Code Playgroud)

将调用限制Import-PSSession为仅一个模块允许您仅导入这些cmdlet.此时,您将能够执行Get-ADComputer,例如,就好像它在本地可用,即使正在进行实际调用DC1.

会话配置

进行PowerShell远程连接时,您将连接到会话配置.如果您未指定一个,则连接到一个名为Microsoft.PowerShell.要查看计算机上定义的所有配置,请致电Get-PSSessionConfiguration.您可能会看到其他一些,例如,Microsoft.PowerShell32是一种连接到32位PowerShell会话的方法.

要连接到特定配置,请使用New-PSSession -ConfigurationNameNew-PSSession -ConnectionUri.

定义会话配置

您可以在会话配置中指定很多内容; powershell的版本,位数,预先导入的模块,您可以预先定义函数和代码,可以防止语言功能可用等.

此答案提供了有关如何创建自己的配置的良好概述.

您还可以将配置信息放在程序集中,这对于您尝试执行的操作非常有用.

在模块中包装代码

正如您所见,Import-PSSession如果它存在于模块中,则更容易导入您想要的代码.因此,您应确保通过模块公开cmdlet.

您在评论中说过要在C#中编写cmdlet.这不是我所做的,但本文似乎提供了有关如何在C#中创建PowerShell模块的详细说明.

这是我现在做的事情(那篇文章很好).在C#中编写cmdlet隐含地已经是一个模块.实际上,您可以使用它Import-Module来加载已编译的.NET程序集,无论它是否包含任何PowerShell cmdlet.

例如,如果您创建了一个公共类并将其编译为DLL,那么您可以Import-Module MyAssembly.dll在PowerShell会话中使用该类.

在C#中定义cmdlet意味着包括对System.management.Automationfrom Cmdlet或from继承的类的引用,然后创建一个继承自或的类PSCmdlet.

建议定义模块清单,但在技术上是可选的,就像使用脚本模块一样.

然而,我没有在程序集中包含会话配置信息(但是?),也没有看到如何执行此操作的参考.

把它带到一起

步骤应该大致类似于:

  1. 编译模块并使其在远程端可用,以便可以从该机器上的本地会话导入PowerShell.
  2. 创建一个新的PSSession配置文件,并指定-AssembliesToLoad或者-ModulesToImport(或两者都必要),或者在程序集本身中指定配置信息(这里可能是首选).
  3. 在机器上注册配置.
  4. 在客户端,您希望将其提供给PowerShell,因此您只需创建会话,然后导入它:
    $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
Run Code Online (Sandbox Code Playgroud)

简化它?

你不必须建立在远程端自定义配置.只要您的模块可用于远程计算机上的任何PowerShell会话,您就可以跳过会话配置步骤,然后您将执行以下操作:

$s = New-PSSession -ComputerName RemoteMachine
Invoke-Command -Session $s -ScriptBlock { Import-Module MyModule }
Import-PSSession -Session $s -Module MyModule
Run Code Online (Sandbox Code Playgroud)

但是您可能希望使用会话配置进行额外的自定义和控制,这取决于您.这就是交换的方式,但对你的目的而言可能有点过分.