首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >批处理文件中的icacls变量

批处理文件中的icacls变量
EN

Server Fault用户
提问于 2015-04-22 01:11:59
回答 3查看 5.5K关注 0票数 1

我正在将用户移动到一个新的域、文件服务器和用户名格式。我试图编写一个简单的DOS批处理来复制数据并设置权限。X:映射到旧服务器,E:是新服务器上的本地驱动器。输入文件只是OldUserName,NewUserName的CSV列表。CSV文件是State.users.csv。(批处理将状态拆分,以便在新服务器上的路径中使用)。

批处理文件:

代码语言:javascript
复制
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命令将在以下情况下死亡:

代码语言:javascript
复制
(CI)F was unexpected at this time.
        ICACLS "E:\Ohio\User\%d" /grant "Domain Admins":(OI)(CI)F /Inheritance:r

甚至从来没有运行过机器拷贝?(所有的icacl都被注释掉了,机器人拷贝工作得很好。)

然而,我在测试过程中输出的行与正确替换的变量相呼应:

代码语言:javascript
复制
(
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可以按预期工作。

我试过单引号,单引号围绕双引号。我在机器人复制命令中添加了引号,它工作得很好(无论是单一的还是双的)。

为了我的理智,我拿出了(CI),然后它在F上完全消失了。

不管有没有EnableDelayedExpansion,我都试过了,没有运气。

我也删除了/F的第一个。同样的结果。

而不是REM,我使用回波,我仍然得到错误"(CI)F是意外的……“!

我复制并粘贴到一个新文件,尝试将其编码为ANSI和UTF-8,查看了所有隐藏字符(在ICACLS和“E:.”之间找到了一个TAB。在第一个问题上,但用空格代替是没有帮助的)。我用的是Notepad++

我将它粘贴到一个新文件中,用UTF-8编码将其保存为文本文件,然后从cmd行重命名为.bat .

我不知道为什么变量扩展对Robocopy很好,但是Icacls却不工作(当它不是REM的时候)。

我在这里错过了什么?

EN

回答 3

Server Fault用户

发布于 2015-07-29 12:39:52

我发现我需要将cmd /c添加到icacls命令的开头。

我的批处理文件如下所示:

代码语言:javascript
复制
for /f "tokens=*" %%i in (%1) do (
        cmd /c "icacls.exe F:\home\%%i /grant %%i:(oi)(ci)(m)"
    )
)

这对我来说很好。

票数 1
EN

Server Fault用户

发布于 2015-04-22 09:14:06

对副本使用不同的变量集,对于ICACLS使用其他变量集。自从几年前,Robocopy就不是MS了,ICACLS使用了不同的变量--你只需要一个不同的if。您还可以使用power shell包装ICACLS变量,这使一切变得更加容易http://tomandersonpro.net/ntfs-permissions-with-powershell/

票数 0
EN

Server Fault用户

发布于 2016-12-28 08:09:39

使用这个:https://stackoverflow.com/a/6478753

代码语言:javascript
复制
for /f "tokens=*" %%i in (%1) do (
        icacls.exe "F:\home\%%i" /grant "%%i:(oi)(ci)(m)"
    )
)
票数 0
EN
页面原文内容由Server Fault提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://serverfault.com/questions/684511

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档