2010-11-03 87 views
3

我想要從腳本中完成相當於here的描述。基本上,我想獲得文件的所有權,並將權限設置爲OWNER /完全控制。如何使用WMI更改文件權限?

在我看來,從VBS腳本使用WMI是最便攜的方式。也就是說,我想避免xcacls,icacls和其他需要下載的工具,或者僅在某些版本的Windows上受支持。

圍繞谷歌搜索後,我發現這個代碼取得所有權:

'connect to WMI namespace on local machine 
Set objServices = 
GetObject("winmgmts:{impersonationLevel=impersonate}") 
'get a reference to data file 
strFile = Wscript.Arguments(0) 
Set objFile = objServices.Get("CIM_DataFile.Name='" & strFile & "'") 
If objFile.TakeOwnership = 0 Then 
    Wscript.Echo "File ownership successfully changed" 
Else 
    Wscript.Echo "File ownership transfer operation" 
End If 

我仍然缺少的是設置權限,並讓它在相對路徑的工作件。

回答

3

由於您已在CIM_DataFile類中使用TakeOwnership,因此我假設您可以使用ChangeSecurityPermissions來更改權限,該權限位於同一個類中。

在使用它們之前,您可以使用GetAbsolutePathName將相對路徑轉換爲絕對路徑。

2

從110 1的答案以該提示,我用Google搜索周圍的一些更多的,並最終想出了這個:

此腳本查找當前用戶的SID,然後採取所有權和變化對argv中[指定的文件的權限0]僅對當前用戶進行完全控制。

Set objWMI = GetObject("winmgmts:{impersonationLevel=impersonate}") 

Function GetCurrentUserSID 
    ' Get user name ' 
    Set colComputer = objWMI.ExecQuery("Select * from Win32_ComputerSystem") 

    ' Looping over one item ' 
    For Each objComputer in colComputer 
     currentUserName = objComputer.UserName 
    Next 

    Set AccountSIDs = GetObject("Winmgmts:").InstancesOf("Win32_AccountSID") 
    For Each AccountSID In AccountSIDs 
     AccountKey = AccountSID.Element 
     Set objAccount = GetObject("Winmgmts:"+AccountKey) 
     strName = objAccount.Domain & "\" & objAccount.Name 
     If strName = currentUserName Then ' that's it 
      SIDKey = AccountSID.Setting 
      Set SID = GetObject("Winmgmts:" + SIDKey) 
      GetCurrentUserSID = SID.BinaryRepresentation 
      Exit For 
     End If 
    Next 
End Function 

Function LimitPermissions(path, SID) 
    Set objFile = objWMI.Get("CIM_DataFile.Name='" & path & "'") 

    Set Trustee = GetObject("Winmgmts:Win32_Trustee").SpawnInstance_ 
    Trustee.SID = SID 

    Set ACE = getObject("Winmgmts:Win32_Ace").Spawninstance_ 
    ACE.AccessMask = 2032127 ' Full Control 
    ACE.AceFlags = 3 
    ACE.AceType = 0 
    ACE.Trustee = Trustee 

    Set objSecDescriptor = GetObject("Winmgmts:Win32_SecurityDescriptor").SpawnInstance_ 
    objSecDescriptor.DACL = Array(ACE) 

    objFile.ChangeSecurityPermissions objSecDescriptor, 4 
End Function 

Function TakeOwnership(path) 
    Set objFile = objWMI.Get("CIM_DataFile.Name='" & path & "'") 
    TakeOwnership = objFile.TakeOwnership 
End Function 

' Main ' 

strFilename = Wscript.Arguments(0) 
Set fso = CreateObject("Scripting.FileSystemObject") 
path = fso.GetAbsolutePathName(strFilename) 

SID = GetCurrentUserSID 

TakeOwnership path 
LimitPermissions path, SID