19

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

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

或者

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

  • 使用哪些正确参数以及如何设置它们?

4

1 回答 1

20

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

隐式远程处理

Exchange 正在使用隐式远程处理

它的工作方式是你建立一个到远程机器的 PSSession,然后将远程实例中可用的一些命令导入你自己的。

这是使用Import-Module -Session $sessionor完成的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

将调用限制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.Automation,然后创建一个继承自Cmdlet或的类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

简化它?

您不必远程端创建自定义配置。只要您的模块可用于远程计算机上的任何 powershell 会话,您就可以跳过会话配置步骤,然后您只需执行以下操作:

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

但是您可能希望通过使用会话配置来获得额外的自定义和控制,这取决于您。这就是交换的方式,但对于您的目的而言,它可能是矫枉过正的。

于 2015-05-05T19:00:59.663 回答