1

我有一个拥有 700 多个用户的网络,我想创建一个脚本,可以将主文件夹的所有者更改为域管理员,将子文件夹的所有者更改为用户自己。

这是我可以在我的大学的帮助下创造的,但由于某种原因这不起作用。谁能帮助我。谢谢。

Set objFSO  = CreateObject("Scripting.FileSystemObject")

Set objFile = objFSO.OpenTextFile("G:\Userhome\userdirlist.txt", 1)

Set oShell  = WScript.CreateObject("WSCript.shell")

Do Until objFile.AtEndOfStream

    struserfolder = objFile.ReadLine

    oshell.run ("icacls G:\userhome\"+ struserfolder +"\*.*  /setowner domainname\" + "struserfolder" + " /t")
    oshell.run ("icacls G:\userhome\"+ struserfolder +"\*.*  /setowner domainname\Domain Admins")
Loop
4

1 回答 1

2

当您可能打算使用变量时,您使用字符串 。改变这个:"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方法运行命令。这样您就可以访问已创建进程的StdOutStdErr :

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
于 2013-03-29T18:40:28.010 回答