Powershell - вызов icacls с включенными в параметры паратезами - PullRequest
1 голос
/ 21 декабря 2011

Я довольно новичок в 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 / grant domain \ user1 :( OI <<<<) (IO) F + CategoryInfo: ObjectNotFound: (OI: String)[], CommandNotFoundException + FullyQualifiedErrorId: CommandNotFoundException </p>

Ответы [ 3 ]

3 голосов
/ 21 июля 2014

Просто чтобы добавить к этому старому вопросу, в PowerShell 3.0 теперь вы можете использовать -%, чтобы сказать PowerShell прекратить обработку чего-либо еще в строке, чтобы вы могли использовать что-то вроде этого:

icacls.exe $ path -% / grant "Все: (OI) (CI) (F)"

2 голосов
/ 21 декабря 2011

Я думаю, вы излишне усложняете это.

Получите echoargs.exe от Расширения сообщества Powershell .

Посмотрите, хотите ли вы что-то вроде ниже:

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}

0 голосов
/ 21 декабря 2011

Вы пробовали использовать кавычки вокруг $command, например Invoke-Expression "$command"? Другие методы предотвращения обработки скобок обсуждаются здесь: http://msdn.microsoft.com/en-us/library/cc281841.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...