场景:嵌入了Powershell主机的Windows服务。在启动时分配单个运行空间。多dll解决方案。
要求:需要在运行服务中访问.NET类。从使用
的本地Powershell实例Enter-PSHostProcess -Name MyService
...因为我可以访问.NET类,所以给了我我想要的内容。
[MyNameSpace.MyClass]::CallStaticFunction()
问题:如何使用Enter-PSSession将远程端点的Powershell行为提供给自定义端点?从Register-PSSessionConfiguration我们可以指定一个dll,但这会产生一个进程,不会连接到正在运行的实例。对通过HTTPS或命名管道编写代理不感兴趣,但使用Powershell for .NET支持中提供的本机功能。
是否可以通过PSSessions扩展此功能?或者我们只需要先做Enter-PSSession或Invoke-Command?
答案 0 :(得分:3)
查看来源似乎Enter-PSHostProcess
和Enter-PSSession
是非常独立的机制。 Enter-PSHostProcess
通过命名管道进行通信,而Enter-PSSession
使用WinRM(有效地使用http(s)通过端口5985/5986。我认为您不需要Enter-PSSession
或{{1如果您希望通过Invoke-Command
对本地服务流程进行交互式访问。
您可能已经这样做了,但是为了尝试这一点,我启动了Powershell.exe和Powershell_ise.exe,然后从前者使用此命令连接到后者:
Enter-PSHostProcess
并且提示已更改为包含ISE的PID。为了确保静态方法按预期工作,我使用以下命令从Powershell.exe命令行中杀死了ISE:
get-process Powershell_ise | Enter-PSHostProcess
Powershell使用线程的默认安全描述符创建连接到的命名管道,该管道通常只允许访问LocalSystem,管理员和运行该进程的帐户。我的测试工作正常,因为两个进程都在同一个帐户下运行(我不需要管理员权限)。
但是要清楚,[System.Environment]::exit(0)
没有规定连接到另一台机器上的进程。可以使用Enter-PSHostProcess
双跳,首先连接到计算机,然后使用Enter-PSSession
连接到流程。