在New-PSSessionConfigurationFile的FunctionDefinition中使用时,Select-Object CmdLet失败

时间:2015-04-16 18:21:45

标签: powershell

考虑下面的这个例子,我在这里创建一个受约束的管理端点。我的目标是在Get-EventLog CmdLet上创建一个“代理”功能。此示例按预期工作,直到我添加 | Select-Object -First 5 。当我这样做时,我收到以下错误消息:“找不到与参数名称'First'匹配的参数。为什么呢?

$getAppEventLog = {
    #this throws an error, see below
    get-eventlog -log application | Select-Object -First 5 

    #this works
    #get-eventlog -log application    
}

New-PSSessionConfigurationFile -Path c:\PSScripts\panos.pssc `
                               -Description 'Delegation EndPoint Repro' `
                               -ExecutionPolicy Restricted `
                               -SessionType RestrictedRemoteServer `
                               -LanguageMode FullLanguage `
                               -FunctionDefinitions @{Name="Get-AppEventLog";ScriptBlock=$getAppEventLog; Options="AllScope"}

Unregister-pssessionconfiguration -name EventLogManagement -force
Test-PSSessionConfigurationFile -Path c:\PSScripts\panos.pssc
Register-PSSessionConfiguration -Path 'c:\PSScripts\panos.pssc' `
                                -Name EventLogManagement `
                                -ShowSecurityDescriptorUI `
                                -AccessMode Remote `
                                -Force

Enter-PSSession -ComputerName localhost -ConfigurationName EventLogManagement
Get-AppEventLog
Select-Object : A parameter cannot be found that matches parameter name 'First'.
At line:2 char:51
+     get-eventlog -log application | Select-Object -First 5
+                                                   ~~~~~~
    + CategoryInfo          : InvalidArgument: (:) [Select-Object], ParameterBindingException
    + FullyQualifiedErrorId : NamedParameterNotFound,Select-Object

PowerShell信息

PS C:\Windows\system32> $PSVersionTable

Name                           Value                                                                                                                                                                                        
----                           -----                                                                                                                                                                                        
PSVersion                      4.0                                                                                                                                                                                          
WSManStackVersion              3.0                                                                                                                                                                                          
SerializationVersion           1.1.0.1                                                                                                                                                                                      
CLRVersion                     4.0.30319.34209                                                                                                                                                                              
BuildVersion                   6.3.9600.17400                                                                                                                                                                               
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0}                                                                                                                                                                         
PSRemotingProtocolVersion      2.2                                                                                                                                                                                          

在考虑了这个之后,我意识到问题可以以更简单的方式再现 - 没有函数定义。 当SessionType等于RestrictedServer时,可以使用以下两个Cmdlet:Get-Command和Select-Object。因此,我可以通过简单地执行以下内容来重现我的问题:

[localhost]: PS> Get-Command | Select-Object -first 1
A parameter cannot be found that matches parameter name 'first'.
    + CategoryInfo          : InvalidArgument: (:) [Select-Object], ParameterBindingException
    + FullyQualifiedErrorId : NamedParameterNotFound,Select-Object

鉴于此,我可以创建一个可以重现问题的会话,如下所示:

New-PSSessionConfigurationFile -Path c:\PSScripts\panos.pssc `
                               -Description 'Delegation EndPoint Repro' `
                               -ExecutionPolicy Restricted `
                               -SessionType RestrictedRemoteServer `
                               -LanguageMode FullLanguage


Unregister-pssessionconfiguration -name EventLogManagement -force
Test-PSSessionConfigurationFile -Path c:\PSScripts\panos.pssc
Register-PSSessionConfiguration -Path 'c:\PSScripts\panos.pssc' `
                                -Name EventLogManagement `
                                -ShowSecurityDescriptorUI `
                                -AccessMode Remote `
                                -Force

因此,我可以将原来的问题改为:在给定上述注册参数的情况下,为什么Select-Object Cmdlet在限制会话中不起作用。

3 个答案:

答案 0 :(得分:0)

相反,请你尝试使用:

Get-EventLog -log application -newest 5 

答案 1 :(得分:0)

使用SessionType RestrictedRemoteServer 时, Select-Object 功能与Default-SessionType中的功能不同:

  

RestrictedRemoteServer。仅包含以下代理函数:Exit-PSSession,Get-Command,Get-FormatData,Get-Help,Measure-Object,Out-Default和Select-Object。使用此cmdlet的参数向会话添加模块,函数,脚本和其他功能。

这个问题在这里描述了一些解决方法:Constrained PowerShell endpoints – Visible cmdlets, session types, and language modes

  

代理函数是围绕原始cmdlet的包装函数,用于修改cmdlet的功能,例如,通过添加或删除参数

答案 2 :(得分:0)

我遇到了同样的问题,创建了PS端点作为PSPKI模块的包装器。 PSPKI模块也使用Select-Object,给出相同的错误。

我的解决方案是更新我的端点.psrc文件,以包含Select-Object的AliasDefinition以指向FQDN Select-Object。

AliasDefinitions = @ {Name ='Select-Object'; Value ='Microsoft.PowerShell.Utility \ Select-Object'}

另请参阅:https://jamesone111.wordpress.com/2016/07/01/just-enough-admin-and-constrained-endpoints-part-2-startup-scripts/

Grtx, BvZanten