场景:嵌入了 Powershell 主机的 Windows 服务。单个运行空间在启动时分配。多dll解决方案。

要求:需要在运行的服务中访问 .NET 类。从本地 Powershell 实例使用

Enter-PSHostProcess -Name MyService

...给了我我想要的东西,因为我可以访问 .NET 类。
[MyNameSpace.MyClass]::CallStaticFunction()

问题:如何使用 Enter-PSSession 将这种 Powershell 行为提供给使用自定义端点的远程端点?从 Register-PSSessionConfiguration 我们可以指定一个 dll 但这将产生一个进程并且不会连接到正在运行的实例。对通过 HTTPS 或命名管道编写代理不感兴趣,但使用 Powershell 中提供的 native 功能来支持 .NET。

是否可以通过 PSSessions 扩展它?还是我们只需要先执行 Enter-PSSession 或 Invoke-Command ?

最佳答案

查看来源似乎 Enter-PSHostProcessEnter-PSSession 是非常独立的机制。 Enter-PSHostProcess 通过命名管道进行通信,而 Enter-PSSession 使用 WinRM(有效地通过端口 5985/5986 使用 http(s)。如果您想通过 Enter-PSSession 交互式访问本地服务进程,我认为您不需要 Invoke-CommandEnter-PSHostProcess

您可能已经这样做了,但是为了尝试一下,我启动了 Powershell.exe 和 Powershell_ise.exe,然后从前者使用此命令连接到后者:

get-process Powershell_ise | Enter-PSHostProcess

并且提示更改为包括 ISE 的 PID。为了确保静态方法按您的预期工作,我使用以下命令从 Powershell.exe 命令行中终止了 ISE:
[System.Environment]::exit(0)

Powershell 使用线程的默认安全描述符创建连接到的命名管道,这通常只允许访问 LocalSystem、Administrators 和运行进程的帐户。我的测试有效,因为两个进程都在同一个帐户下运行(我不需要管理员权限。)

然而,需要明确的是,Enter-PSHostProcess 没有规定连接到另一台机器上的进程。可以进行双跳,首先使用 Enter-PSSession 连接到机器,然后使用 Enter-PSHostProcess 连接到进程。

关于powershell - 通过 PSSessionConfiguration 文件获取 Enter-PSHostProcess 行为,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39376165/

10-13 07:49
查看更多