考虑下面的这个例子,我在这里创建一个受约束的管理端点。我的目标是在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在限制会话中不起作用。
答案 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'}
Grtx, BvZanten