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

Другие вопросы по тегам