Powershell - вызов icacls с включенными в параметры паратезами
Я довольно новичок в Powershell, но у меня большой опыт работы с VBScript и Python. Я пытаюсь быть хорошим администратором Windows и больше разбираюсь в Powershell. Итак, вот что я пытаюсь сделать: Родительская папка содержит десятки подпапок, которые называются именами пользователей AD (например, Users\username1, Users\username2, где Users - родительская папка). Я хочу просмотреть каждое имя папки, разобрать имя подпапки и передать его icacls для применения разрешений на основе имени пользователя. Я сделал мультилинер, потому что у меня были проблемы с трубопроводом. Это то, что я имею после попытки нескольких разных подходов:
$root_folder = "c:\temp\test"
$cmd1 = "icacls "
$cmd2 = " /grant cm\"
$cmd3 = ":`(OI`)`(CI`)F"
$paths_collection = get-childitem $root_folder | foreach-object -process {$_.FullName}
foreach ($path in $paths_collection)
{$string = $path.split("\");$last = $string[-1];$command = $cmd1 + $path +$cmd2 +$last +$cmd3;invoke-expression $command}
Изначально все было не так грубо, но я начал разбивать его на части, когда столкнулся с проблемами.
ПРОБЛЕМА - в $cmd3 (OI)(CI) не входит чисто в выражение invoke. Если я изменю $cmd3 на просто ":F", это сработает, но я должен установить наследование, используя ошибочные параметры. ПОЖАЛУЙСТА ПОМОГИ. Я весь день ломал голову над этим. На самом деле не удалось найти ничего, что конкретно касалось этой проблемы (пробовали обратные пометки, ссылались на $command как '$command' и т. Д.)
ОШИБКА. Термин "OI" не распознается как имя командлета, функции, файла сценария или работоспособной программы. Проверьте правильность написания имени или, если путь был указан, проверьте правильность пути и повторите попытку. В строке:1 символ:56 + icacls C:\temp\test\garthwaitm / предоставить домен \ user1: (OI<<<<) (IO) F + CategoryInfo: ObjectNotFound: (OI: String) [], CommandNotFoundException + FullyQualifiedErrorId: CommandNotFoundException
3 ответа
Просто чтобы добавить к этому старому вопросу, в PowerShell 3.0 теперь вы можете использовать -%, чтобы сказать PowerShell прекратить обработку чего-либо еще в строке, чтобы вы могли использовать что-то вроде этого:
icacls.exe $ path -% /grant "Все:(OI)(CI)(F)"
Я думаю, что вы излишне усложняете это.
Получить echoargs.exe
от расширений Powershell Community.
Посмотрите, что вы хотели:
PS >.\EchoArgs.exe /grant $path "cm\$last" ":(OI)(CI)F"
Arg 0 is </grant>
Arg 1 is <c:\test>
Arg 2 is <cm\user>
Arg 3 is <:(OI)(CI)F>
Затем вызовите его с помощью команды, которую вы хотите:
&icacls /grant $path "cm\$last" ":(OI)(CI)F"
Кстати, вы можете использовать Split-Path
чтобы получить $last
, И использовать select -expand fullname
вместо foreach-object -process {$_.FullName}
Вы пытались использовать цитаты вокруг $command
например, Invoke-Expression "$command"
? Другие методы предотвращения обработки скобок обсуждаются здесь: http://msdn.microsoft.com/en-us/library/cc281841.aspx