考虑下面的示例,在此示例中我将创建一个受约束的管理端点。我的目标是在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

鉴于此,我可以创建一个重现该问题的 session ,如下所示:
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在受限 session 中不起作用。

最佳答案

相反,您可以尝试使用:

Get-EventLog -log application -newest 5

关于powershell - 在New-PSSessionConfigurationFile的FunctionDefinition中使用时,选择对象CmdLet失败,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29682983/

10-13 07:49