Назад | Перейти на главную страницу

переменные icacls в пакетном файле

Я перемещаю пользователей в новый домен, файловый сервер и формат имени пользователя. Я пытаюсь написать простой пакет DOS для копирования данных и установки разрешений. X: сопоставлен со старым сервером, а E: является локальным диском на новом сервере. Входной файл - это просто CSV-список OldUserName, NewUserName. Файл CSV - State.users.csv. (Пакет разделяет состояние для использования в пути на новом сервере).

Пакетный файл:

SETLOCAL EnableDelayedExpansion     

FOR /F "delims=. tokens=1" %%a in ("%1") DO SET Site=%%a

FOR /F "delims=, tokens=1-2" %%c in (%1) do (
    ROBOCOPY X:\Users\%%c E:\%Site%\User\%%d /E /Z
    ICACLS "E:\%Site%\User\%%d" /grant "Domain Admins":(OI)(CI)F /Inheritance:r
    ICACLS "E:\%Site%\User\%%d" /grant "SYSTEM":(OI)(CI)F
    ICACLS "E:\%Site%\User\%%d" /grant "CREATER OWNER":(OI)(CI)F
    ICACLS "E:\%Site%\User\%%d" /grant "%%d":(OI)(CI)F
    IF NOT "%2"=="" RENAME X:\Users\%%c ZZZ-%%c
)

ENDLOCAL

При запуске команда icacls умирает с:

(CI)F was unexpected at this time.
        ICACLS "E:\Ohio\User\%d" /grant "Domain Admins":(OI)(CI)F /Inheritance:r

и никогда даже не запускает робокопию ...? (Со всеми закомментированными icacls, robocopy работает нормально.)

Тем не менее, строки, которые я удалил во время тестирования, перекликаются с правильно замененными переменными:

(
rem ROBOCOPY X:\Users\MDuffy E:\Ohio\User\Steve.Hrsk /E /Z
rem ICACLS "E:\Ohio\User\Steve.Hrsk" /grant "Domain Admins":(OI)(CI)F /Inheritance:r
rem ICACLS "E:\Ohio\User\Steve.Hrsk" /grant "SYSTEM":(OI)(CI)F
rem ICACLS "E:\Ohio\User\Steve.Hrsk" /grant "CREATER OWNER":(OI)(CI)F
rem ICACLS "E:\Ohio\User\Steve.Hrsk" /grant "Steve.Hrsk":(OI)(CI)F
IF NOT "" == "" RENAME X:\Users\MDuffy ZZZ-MDuffy
)

Я могу скопировать и вставить эти строки (за исключением REM, конечно) в командной строке, и icacls работает должным образом.

Я пробовал одинарные кавычки, одинарные кавычки вокруг двойных кавычек. Я добавил кавычки к команде robocopy, и она отлично работает (с одинарными или двойными).

Ради здравого смысла я удалил (CI), а затем он умирает на F для Full.

Я пробовал с EnableDelayedExpansion и без него, не повезло.

Я также удалил первый FOR / F. Те же результаты.

Вместо REM я использовал ECHO и ВСЕ ЕЩЕ получаю сообщение об ошибке «(CI) F было неожиданным ...» !!

Я скопировал и вставил в новый файл, попробовал закодировать его как ANSI и UTF-8, просмотрел все скрытые символы (нашел TAB между ICACLS и «E: ...» на первом, но заменил его пробелом. не помогло). [Я использую Блокнот ++]

Я вставил его в новый файл, сохранил как текстовый файл с кодировкой UTF-8, а затем переименовал его в .bat из строки cmd ....

Я не знаю, почему расширение переменных отлично работает для Robocopy, но не для Icacls (когда оно не отключено).

Что мне здесь не хватает?

Я обнаружил, что мне нужно добавить cmd /c к началу icacls команда.

Мой командный файл выглядит так:

for /f "tokens=*" %%i in (%1) do (
        cmd /c "icacls.exe F:\home\%%i /grant %%i:(oi)(ci)(m)"
    )
)

У меня это отлично работает.

Использовать это: https://stackoverflow.com/a/6478753

for /f "tokens=*" %%i in (%1) do (
        icacls.exe "F:\home\%%i" /grant "%%i:(oi)(ci)(m)"
    )
)

Используйте другой набор переменных для копирования и другие для ICACLS. Robocopy не был MS пару лет назад, и ICACLS использует другие переменные - вам просто нужен другой if. Вы также можете использовать оболочку Power для обертывания переменных ICACLS, что упрощает все http://tomandersonpro.net/ntfs-permissions-with-powershell/ .