在vbscript中使用icacls更改子文件夹的所有者

在vbscript中使用icacls更改子文件夹的所有者,vbscript,Vbscript,我有一个超过700个用户的网络,我想创建一个脚本,可以将主文件夹的所有者更改为域管理员,将子文件夹更改为用户自己 这是我可以在我的大学的帮助下创造的,但由于某些原因,这不起作用。谁能帮帮我吗。谢谢 Set objFSO = CreateObject("Scripting.FileSystemObject") Set objFile = objFSO.OpenTextFile("G:\Userhome\userdirlist.txt", 1) Set oShell = WScript.Cr

我有一个超过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

当您可能打算使用变量时,可以使用字符串
。更改此项:

oshell.run ("icacls G:\userhome\"+ struserfolder +"\*.* /setowner domainname\" _
  + "struserfolder" + " /t")
顺便说一句,你为什么要两次更换店主?任何对象只能有一个所有者,如果将域管理员组仅作为文件夹中顶级对象的所有者,则不会获得任何收益

如果要授予域管理员访问用户主目录的权限,请将所有者更改为本地管理员组(域管理员自动成为该组的成员),并将文件夹的完全控制权授予管理员、系统和用户。然后将更改的权限传播到目录树:

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"

Edit:方法
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
调用的返回值。还可以尝试通过而不是运行来执行命令,这样您就可以从
StdOut
StdErr
读取命令,或者通过
oshell.Run“%COMSPEC%/k icacls…”1运行命令,1,True
使
cmd
窗口可见,并在命令完成后保持打开状态。无论如何,您应该同步运行这些命令(第三个参数设置为
True
),这样您的命令才能有序运行,并且不会相互干扰。我不确定我是否理解您的意思,请给我一个示例。我的大学(帮助我创建脚本的人)本周休假,hahaExit代码87表示您的参数不正确。哪个语句产生此错误以及实际语句是什么样子的?rc=oshell.run(“icacls G:\userhome\”+struserfolder+“*.*./setowner domainname\“+”struserfolder“+”/t”)此语句给出退出代码87
rc = oshell.run("icacls " & path & " /setowner Administrators /t /c", 0, True)
WScript.Echo "icacls returned with exit code " & rc & "."
oshell.run "%COMSPEC% /k icacls " & path & " /setowner Administrators /t /c" _
  , 1, True
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