2013-06-13 4 views
0

У меня есть сценарий powershell, который может быть вызван определенными пользователями. Скрипт работает с некоторыми повышенными разрешениями, поэтому мне нужно убедиться, что они не могут использовать его для обхода предполагаемого поведения. Одним из параметров сценария является строка, которая выступает в качестве аргументов для другого командлета.Вызов командлета с настраиваемыми аргументами

Таким образом, пользователь может поставить строку «-День 4 -Год 1989 месяц- 3»

то в моем сценарии, я хочу работать: Get-Date -День 4 -Год 1989 месяц- 3

Теперь я знаю, что я мог бы сделать это с помощью Invoke-Expression, но что бы оставить меня уязвимым для инъекции Powershell (т.е. пользователь может перейти в «-дня 4, сделай плохой материал»)

в качестве альтернативы, Я мог бы написать обертку для Get-Date, но это похоже на большую работу, поскольку командлет, который я на самом деле вызываю (это не Get-Date), имеет много разных параметров, и кажется, что много работы для переноса торговый центр. Нет аргументов, которые они могли бы назвать командлетом, который может нанести вред (поскольку это командлет Get-xxx).

Кто-нибудь знает способ вызова определенного командлета со строкой в ​​качестве аргументов?

+0

(http://blogs.technet.com/b/heyscriptingguy/archive [Может быть, функция прокси?] /2011/03/01/proxy-functions-spice-up-your-powershell-core-cmdlets.aspx) Все еще не уверен, что вы пытаетесь сделать. Можете ли вы предоставить образец/фрагмент вашего сценария? –

+0

Ближе всего я могу думать о том, что это встроенный аргумент splatting. http://technet.microsoft.com/en-us/magazine/gg675931.aspx – JohnL

+0

JohnL, это близко к тому, что я хочу. Мне нужно было бы преобразовать строку ''-Day 4-Year 1989 -Month 3'' в' $ p = @ {' day '=' 4 ';' year '=' 1989 ';' month '=' 3 '} '. Это не так сложно сделать, но мне интересно, есть ли способ сделать это автоматически. Если ничего лучше не появится, я думаю, я могу это использовать. – Horatiu

ответ

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 
    } 
} 

Read here и here научиться улучшать Validation

Смежные вопросы