Powershell 远程配置文件
Posted
技术标签:
【中文标题】Powershell 远程配置文件【英文标题】:Powershell Remoting Profiles 【发布时间】:2011-02-28 10:14:31 【问题描述】:在本地计算机上使用Enter-PSSession
打开远程 PowerShell 会话时,如何在远程计算机上使用我的配置文件中的函数。
【问题讨论】:
有完整源代码的最终解决方案吗? 【参考方案1】:JonZ 和 x0n:
当您将 pssession 与默认会话配置一起使用时,不会运行任何配置文件脚本。
使用
Enter-PSSession
启动远程交互会话时,会加载远程配置文件。此外,仅加载了$pshome
中的机器级配置文件。
如果您希望预先配置会话(以加载自定义函数、管理单元、模块等),请将配置文件脚本添加到新的 会话配置(用于在启动脚本中初始化它们远程会话配置)。
Register-PSSessionConfiguration cmdlet 在本地计算机上创建并注册新的会话配置。使用Get-PSSessionConfiguration 查看现有会话配置。 Get-PSSessionConfiguration 和 Register-PSSessionConfiguration 都需要提升权限(使用“以管理员身份运行”选项启动 PowerShell)。
在目标计算机中,profile.ps1
包含您的所有功能:
Register-PSSessionConfiguration -Name WithProfile -StartupScript $PsHome\Profile.ps1
要使用此预配置会话,您需要从本地计算机键入:
Enter-PSSession -ComputerName $computername -ConfigurationName WithProfile
或
Enter-PSSession -ComputerName $computername -ConfigurationName WithProfile -Credential youradminuser@yourtargetdomain
(其中$computername
是您注册 pssession 配置的远程服务器的主机名)。
关于 PowerShell 远程处理的一个很好的来源是 Administrator's Guide to Powershell Remoting。
参考资料:Powershell Remoting: Use Functions loaded in Powershell remote Profile? http://jrich523.wordpress.com/2010/07/21/update-creating-a-profile-for-a-remote-session/
了解和使用 PowerShell 配置文件http://blogs.technet.com/b/heyscriptingguy/archive/2013/01/04/understanding-and-using-powershell-profiles.aspx
About_Profiles (Microsoft Docs) https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_profiles
六种不同的 Windows PowerShell 配置文件路径和用途
当前用户,当前主机 - 控制台 $Home[我的]Documents\WindowsPowerShell\Profile.ps1
当前用户,所有主机 $Home[我的]Documents\Profile.ps1
所有用户,当前主机 - 控制台 $PsHome\Microsoft.PowerShell_profile.ps1
所有用户,所有主机 $PsHome\Profile.ps1
当前用户,当前主机 - ISE $Home[我的]Documents\WindowsPowerShell\Microsoft.PowerShellISE_profile.ps1
所有用户,当前主机 - ISE $PsHome\Microsoft.PowerShellISE_profile.ps1
Windows PowerShell 配置文件http://msdn.microsoft.com/en-us/library/bb613488%28VS.85%29.aspx
此配置文件适用于所有用户和所有 shell。 %windir%\system32\WindowsPowerShell\v1.0\profile.ps1
此配置文件适用于所有用户,但仅适用于 Microsoft.PowerShell shell。 %windir%\system32\WindowsPowerShell\v1.0\ Microsoft.PowerShell_profile.ps1
此配置文件仅适用于当前用户,但会影响所有 shell。 %UserProfile%\My Documents\WindowsPowerShell\profile.ps1
此配置文件仅适用于当前用户和 Microsoft.PowerShell shell。 %UserProfile%\My Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1
PowerShell 核心配置文件 https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_profiles
此配置文件适用于所有用户和所有主机。 $env:ProgramFiles\PowerShell\6\profile.ps1
此配置文件适用于所有用户,但仅适用于当前主机。 $env:ProgramFiles\PowerShell\6\Microsoft.PowerShell_profile.ps1
此配置文件仅适用于当前用户,但会影响所有主机。 $env:USERPROFILE\Documents\PowerShell\profile.ps1
此配置文件仅适用于当前用户和 Microsoft.PowerShell shell。 $env:USERPROFILE\Documents\PowerShell\Microsoft.PowerShell_profile.ps1
【讨论】:
"此外,仅加载 $pshome 中的机器级配置文件。"这在某个时候发生了变化吗?对于 Windows 8.1 和 WIdoes Server 2012,Enter-PSSession 不在目标计算机上运行任何 Powershell 配置文件。 @GreenstoneWalker - 我也看到了。使用 Win 2008 R2 / PS 3.0 服务器。 如果您不想依赖特定的 Windows 版本或语言,请使用:[Environment]::GetFolderPath('MyDocuments')
【参考方案2】:
杰森, 就我而言,当我远程连接到另一台计算机时,我想让我的 Powershell 配置文件跟随我。
我创建了一个包装函数 Remote,它接受一个计算机名,创建一个会话,将您的配置文件加载到会话中,并使用 enter-pssession。
下面是代码:
function Remote($computername)
if(!$Global:credential)
$Global:credential = Get-Credential
$session = New-PSSession -ComputerName $computername -Credential $credential
Invoke-Command -FilePath $profile -Session $session
Enter-PSSession -Session $session
您可以修改 Invoke-Command -FilePath 参数以获取您喜欢的任何文件。
【讨论】:
这可行,但 PowerShell 有一些错误使其无法正常工作。首先,没有办法等待“Enter-PSSession -Session”,这意味着一旦您调用此语句,您就会在同一个窗口中生成一个新进程,而无需等待脚本中的自旋锁定,直到用户键入退出。 Invoke-command -session,并行运行而不是串行运行......所以它是一个竞争条件......最好用另一种方法做到这一点,并且永远不要使用“New-Session”......如果微软有一种模式可以确保每个调用命令被串行执行... @pico,这不适用于脚本。它应该在 linux 主机上使用 ssh 模拟。此外,Invoke-Command 同步运行,不是竞态条件。请注意,我只使用了一次 New-Session,然后在同一个对象上使用 Invoke 和 Enter。您需要多个会话才能获得并发。 j.ps1 内容:$id = (New-Guid).Guid; $sleep = Get-Random -Min 1 -Max 10; "Job $id sleep-time: $sleep"
0..5 | % "$id : $_";sleep $sleep
测试脚本$session = New-PSSession;
0..10 | % Invoke-Command -FilePath "j.ps1" -Session $session
结果为序列号。【参考方案3】:
看看这个
http://jrich523.wordpress.com/2010/07/08/creating-a-profile-for-a-remote-session/
它是创建远程配置文件的一种解决方法。
【讨论】:
【参考方案4】:你不能。使用 enter-pssession 启动远程交互会话时,会加载远程配置文件。此外,仅加载 $pshome 中的机器级配置文件。如果您希望远程功能可用,您必须在远程会话配置的启动脚本中初始化它们。查看远程服务器上的 get/set-pssessionconfiguration。
【讨论】:
这些事情的处理方式是否发生了变化?我使用的是 powershell 5.1,并且我在 C:\Windows\System32\WindowsPowerShell\v1.0\ 中创建了一个 profile.ps1,只是为了设置一个别名,该别名在本地使用 shell 时有效。但是当使用 Enter-PSSession 连接到那台机器时,别名不起作用... @Alex 也许您可能需要在服务器端重新启动 WinRM 服务?重新启动应该可以做到,但如果这有点重,那么“restart-service winrm”应该可以工作。或者,正如你所说,事情可能已经改变了......【参考方案5】:还有另一种在远程会话中使用配置文件的方法:
-
将所选配置文件复制到文档文件夹中的远程服务器。例如:
Copy-Item -Path $profile.CurrentUserAllHosts -Destination \\computername\C$\Users\MyAccountName\Documents
-
输入 PSSession
Enter-PSSession -ComputerName ComputerName
-
点源您的个人资料
. .\Profile.ps1
此解决方案的缺点:
您必须将您的个人资料复制一次到您想要拥有个人资料的所有计算机上 每次进入 PSSession 时都必须点源配置文件此解决方案的优点:
不需要函数,你只需像往常一样输入一个 PSSession 您不会通过更改默认会话配置来更改所有用户的个人资料(感谢Jeffery Hicks for the tip about the dot sourcing)
【讨论】:
以上是关于Powershell 远程配置文件的主要内容,如果未能解决你的问题,请参考以下文章
如何通过 Powershell 和 PSSessionConfiguration 远程连接到 Exchange 服务器
Powershell远程在Azure A7虚拟机执行Java JVM失败
PowerShell远程管理02——Powershell远程管理的几种方式