如何托管Powershell脚本或应用程序使其';可以通过WSManConnectionInfo访问吗?(如Off

本文关键字:WSManConnectionInfo 可以通过 访问 Off 脚本 Powershell 何托管 应用程序 | 更新日期: 2023-09-27 18:29:11

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

   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公开它?

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

如何托管Powershell脚本或应用程序使其';可以通过WSManConnectionInfo访问吗?(如Off

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

隐式远程处理

Exchange正在使用隐式远程处理。

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

这是使用Import-Module -Session $sessionImport-PSSession来完成的。

您可以在Powershell中单独尝试。使用未安装Active Directory RSAT(没有Active Directory 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的版本,bitness,哪些模块是预先导入的,你可以预先定义函数和代码,你可以阻止语言功能可用,等等。

这个答案为如何创建自己的配置提供了一个很好的概述。

您还可以将配置信息放在程序集中,这将很好地适用于您尝试执行的操作

在模块中封装代码

正如您在Import-PSSession中看到的那样,如果模块中存在您想要的代码,那么只导入它会更容易。因此,应确保cmdlet通过模块公开。

你在评论中说你想用C#编写cmdlet 这不是我做过的事情,但本文似乎提供了关于如何在C#中创建PowerShell模块的详细说明

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

例如,如果您创建了一个公共类并将其编译到DLL中,则可以执行Import-Module MyAssembly.dll,并且该类现在可以在PowerShell会话中使用。

在C#中定义cmdlet意味着包括对System.management.Automation的引用,然后创建从CmdletPSCmdlet继承的类。

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

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

将其结合在一起

步骤大致如下:

  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

但是,您可能需要通过使用会话配置进行额外的自定义和控制,所以这取决于您自己。交换就是这样做的,但对于你的目的来说,这可能有些过头了。

相关文章:
  • 没有找到相关文章