2013-03-29 106 views
1

我有超過700個用戶的網絡,我想創建一個腳本,可以將主文件夾的所有者更改爲域管理員,並將子文件夾更改爲用戶自己。在vbscript中使用icacls更改子文件夾的所有者

這是我可以在我的大學幫助下創建的,但由於某些原因,這不起作用。任何人都可以幫助我。謝謝。

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 

回答

0

您使用"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方法運行命令。您可以訪問所創建的進程的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 
+0

謝謝您的回答安斯加爾, – hawar

+0

喜安斯加爾, 現在還沒有wroking,我什麼都看不到發生。沒有區別。 – hawar

+0

它究竟如何「不工作」?檢查「運行」調用的返回值。也可以嘗試通過['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'),這樣你的命令就可以按順序運行並且不會相互干擾。 –

相關問題