远程登录PS后无法访问我在profile.ps1文件里定义的function.


PowerShell交流中心分类: 远程管理远程登录PS后无法访问我在profile.ps1文件里定义的function.
0
jason279 asked 10 年 ago

我在一台机器的$pshome/profile.ps1文件里定义了一些function,在这台机器上通过powershell访问正常,可是当我从另一台机器远程登录这个机器的powershell后,在远程访问这个命令就提示找不到,完整错误信息为:
[10.30.147.30]: PS P:\Users\administrator\Documents> get-configsite
The term ‘get-configsite’ is not recognized as the name of a cmdlet, function, script file, or oper
able program. Check the spelling of the name, or if a path was included, verify that the path is co
rrect and try again.
+ CategoryInfo :
+ FullyQualifiedErrorId : CommandNotFoundException
想问下是因为远程登录的时候不会加载profile.ps1文件吗?该如何解决这个问题?谢谢。

2 Answers
2
Best Answer
Mooser Lee 管理员 answered 10 年 ago

默认profile是不能被远程回话加载的。
你可以在server 端注册一个PSSessionConfiguration

Register-PSSessionConfiguration -Name 'withmyProfile' -StartupScript 'd:\youProfile.ps1'

在client端,远程连接时指定configuration,即可。

New-PSSession -ComputerName pstips.net -ConfigurationName withmyProfile

答案补充:

测试环境:

远程机器:windows 7

本地机器:windows 8.1

在远程机器上查看,当前远程会话配置:

PS> Get-PSSessionConfiguration

Name                      PSVersion  StartupScript        Permission
----                      ---------  -------------        ----------
microsoft.powershell      2.0        			  BUILTIN\Administrators AccessAll...
Microsoft.PowerShell32    2.0

我的是64位机器,所以默认配置为第一个:

尝试设置:

PS> Set-PSSessionConfiguration -Name 'microsoft.powershell' -StartupScript "$pshome\profile.ps1"

确认
是否确实要执行此操作?
对目标“名称: microsoft.powershell”执行操作“Set-PSSessionConfiguration”。
[Y] 是(Y)  [A] 全是(A)  [N] 否(N)  [L] 全否(L)  [S] 挂起(S)  [?] 帮助 (默认值为“Y”): y


   WSManConfig: Microsoft.WSMan.Management\WSMan::localhost\Plugin\microsoft.powershell\InitializationParameters

ParamName            ParamValue
---------            ----------
startupscript        C:\Windows\System...

确认
是否确实要执行此操作?
对目标“名称: WinRM”执行操作“"Restart-Service"”。
[Y] 是(Y)  [A] 全是(A)  [N] 否(N)  [L] 全否(L)  [S] 挂起(S)  [?] 帮助 (默认值为“Y”): y
警告: 正在等待服务“Windows Remote Management (WS-Management) (winrm)”完成停止...

查看配置:

PS> Get-PSSessionConfiguration -Name 'microsoft.powershell' | select -ExpandProperty StartupScript
C:\Windows\System32\WindowsPowerShell\v1.0\profile.ps1

配置正确。
接下来在profile.ps1文件中输入:

$test='variable in pshome\profile.ps1'

接下来在客户端机器上验证设置是否会生效:

PS> Enter-PSSession -ComputerName 'home-win7' -Credential mosser
[home-win7]: PS C:\Users\mosser\Documents> $test
variable in pshome\profile.ps1

变量已经默认被加载了,说明配置成功。

jason279 replied 10 年 ago

我在网上搜索了,说远程会话会加载$pshome下的profile文件,这个也不会加载的吗?你说的方法我也在网上找到了,我的需求是在连接的时候不用指定configurationName的,能有办法做到吗,也就是说让他默认都自动加载。我在远程电脑上试了另一种方法,就是把放在profile.ps1里的function都单独做成一个一个的.ps1文件,文件名就为function的名字,然后放到system32下面,这样做可以访问,不过就是会有很多重复的代码,而且还不能覆盖系统提供的get-childitem这个命令。不知道有没有什么解决办法?

jason279 replied 10 年 ago

刚才又在网上搜到可以通过设置 $PSSessionConfigurationName来设置default session configuration,然后我在电脑里设置了值为$pshome+’\profile.ps1’,可是我在远程启了powershell之后发现profile.ps1并没有被加载。而只有我显示的像你说的那样注册一个configuration name才可以,是我哪里没有设置对吗?原文链接为:http://technet.microsoft.com/zh-cn/library/hh849741(v=wps.620).aspx

Mooser Lee 管理员 replied 10 年 ago

估计你没有配置正确,请看上面的答案补充。

jason279 replied 10 年 ago

已经可以了,非常感谢。也同时谢谢strikene的回复。

0
strikene answered 10 年 ago

使用  Set-PSSessionConfiguration 命令尝试修改默认配置试试