您使用串"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"""
順便說一句,你爲什麼試圖改變業主兩次?任何對象只能擁有一個所有者,如果您使域管理員組成爲文件夾中頂級對象的所有者,則不會獲得任何收益。
如果您想讓域管理員訪問用戶的主目錄,請將所有者更改爲本地管理員組(域管理員自動成爲該組的成員),並將該文件夾的完全控制權授予管理員,SYSTEM和用戶。然後傳播變化的權限下的目錄樹:
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
)仍在後臺運行。這可能會導致後續命令嘗試更改未擁有所有權的對象的權限。
甚至比返回代碼更有用的是ususally命令的輸出。但是,執行命令的方式不會顯示命令窗口,即使是這樣,命令完成後也會自動關閉。不過,您可以強制命令窗口可見並在命令完成後保持打開狀態。
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
謝謝您的回答安斯加爾, – hawar
喜安斯加爾, 現在還沒有wroking,我什麼都看不到發生。沒有區別。 – hawar
它究竟如何「不工作」?檢查「運行」調用的返回值。也可以嘗試通過['Exec'](http://msdn.microsoft.com/en-us/library/ateytk4a%28v=vs.84%29.aspx)而不是'Run'執行命令,以便讀取'StdOut'和'StdErr',或者通過'oshell.run'%COMSPEC%/ k icacls ...「,1,True'運行該命令,這樣'cmd'窗口就可見並且在命令完成後保持打開狀態。無論如何你都應該同步運行這些命令(第三個參數設置爲'True'),這樣你的命令就可以按順序運行並且不會相互干擾。 –