场景:嵌入了 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-PSHostProcess
和 Enter-PSSession
是非常独立的机制。 Enter-PSHostProcess
通过命名管道进行通信,而 Enter-PSSession
使用 WinRM(有效地通过端口 5985/5986 使用 http(s)。如果您想通过 Enter-PSSession
交互式访问本地服务进程,我认为您不需要 Invoke-Command
或 Enter-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/