当您可能打算使用变量时,您使用字符串 。改变这个:"struserfolder"
struserfolder
oshell.run ("icacls G:\userhome\"+ struserfolder +"\*.* /setowner domainname\" _
+ "struserfolder" + " /t")
进入这个:
oshell.run "icacls G:\userhome\"+ struserfolder +"\*.* /setowner domainname\" _
+ struserfolder + " /t"
此外,您必须用空格引用参数。缺少引号可能是阻止第二个命令工作的原因,因为icacls
试图将所有者设置为domainname\Domain
而不是domainname\Domain Admins
. 这应该这样做:
oshell.run "icacls G:\userhome\" + struserfolder _
+ "\*.* /setowner ""domainname\Domain Admins"""
顺便说一句,您为什么要两次更改所有者?任何对象都只能有一个所有者,如果您将域管理员组设置为文件夹中顶级对象的所有者,您将不会获得任何东西。
如果您想授予域管理员访问用户主目录的权限,请将所有者更改为本地管理员组(域管理员自动成为该组的成员)并将文件夹的完全控制权授予管理员、系统和用户。然后将更改的权限沿目录树传播:
path = Chr(34) & "G:\userhome\" & struserfolder & Chr(34)
oshell.run "icacls " & path & " /setowner Administrators /t /c"
oshell.run "icacls " & path & " /grant Administrators:(OI)(CI)F " _
& "SYSTEM:(OI)(CI)F domainname\" & struserfolder & ":(OI)(CI)F"
oshell.run "icacls " & path & " /reset /t /c"
编辑:该Run
方法返回执行命令的退出状态,当事情没有按预期工作时,它可能会给你一些指示:
rc = oshell.run("icacls " & path & " /setowner Administrators /t /c", 0, True)
WScript.Echo "icacls returned with exit code " & rc & "."
一个问题可能是默认情况下Run
是异步的(参数bWaitOnReturn
默认为False
),即调用立即返回,而命令 ( icacls
) 仍在后台运行。这可能会导致后续命令尝试更改尚未获得所有权的对象的权限。
比返回码更有帮助的通常是命令的输出。但是,按照您执行命令的方式,不会显示命令窗口,即使显示了,它也会在命令完成后立即自动关闭。不过,您可以强制命令窗口在命令完成后变得可见并保持打开状态。
oshell.run "%COMSPEC% /k icacls " & path & " /setowner Administrators /t /c" _
, 1, True
当然,您通常不希望在生产中使用它,但在调试脚本时它非常有用。
另一种选择是完全避免Run
并通过该Exec
方法运行命令。这样您就可以访问已创建进程的StdOut和StdErr :
Set icacls = oshell.Exec("icacls " & path & " /setowner Administrators /t /c")
Do While icacls.Status = 0
WScript.Sleep 100
Loop
WScript.Echo "icacls returned with exit code " & icacls.ExitCode & "."
WScript.Echo icacls.StdOut.ReadAll & icacls.StdErr.ReadAll