【问题标题】:Calling a cmdlet with custom arguments使用自定义参数调用 cmdlet
【发布时间】:2013-06-14 04:03:54
【问题描述】:

我有一个特定用户可以调用的 powershell 脚本。该脚本以一些提升的权限运行,因此我需要确保他们不能使用它来绕过预期的行为。脚本的一个参数是一个字符串,它充当另一个 cmdlet 的参数。

所以用户可能会提供字符串'-Day 4 -Year 1989 -Month 3'

然后在我的脚本中,我想运行:Get-Date -Day 4 -Year 1989 -Month 3

现在我知道我可以通过 Invoke-Expression 做到这一点,但这会使我容易受到 powershell 注入的影响(即:用户可以通过“-day 4; do-bad-stuff”)

或者,我可以为 Get-Date 编写一个包装器,但这似乎需要做很多工作,因为我实际调用的 cmdlet(它不是 Get-Date)有很多不同的参数,而且看起来很多努力把它们都包起来。他们没有可以在该 cmdlet 上调用可能造成伤害的参数(因为它是 Get-xxx cmdlet)。

有人知道用字符串作为参数调用特定 cmdlet 的方法吗?

【问题讨论】:

  • Maybe a proxy function? 仍然不确定您要做什么。你能提供你的脚本的样本/sn-p 吗?
  • 我能想到的最接近内置的是参数飞溅。 technet.microsoft.com/en-us/magazine/gg675931.aspx
  • JohnL,这与我想要的很接近。我需要将字符串'-Day 4 -Year 1989 -Month 3' 转换为$p = @{'day'='4';'year'='1989';'month'='3'}。这并不难做到,但我想知道是否有办法自动执行此行为。如果没有更好的表现,我想我可以使用它。

标签: powershell powershell-cmdlet


【解决方案1】:

使用参数验证:

Function Foo 
{ 
    Param( 
        [ValidateRange(1,31)] 
        [String] 
        $day 
    , 
        [ValidateRange(1900,2013)] 
        [Int] 
        $Year 
    , 
        [ValidateRange(1,12)] 
        [string] 
        $Month 
    ) 
    Process 
    { 
         Get-Date -Day $day -Year $year -Month $month 
    } 
}

阅读 herehere 以了解改进验证

【讨论】:

    猜你喜欢
    • 2013-03-16
    • 2011-05-07
    • 2013-04-26
    • 2011-05-17
    • 1970-01-01
    • 1970-01-01
    • 2011-04-05
    • 1970-01-01
    • 2012-02-29
    相关资源
    最近更新 更多