嗨,BD。事实上,有一个办法可以使用脚本来确定文件的所有者,虽然可以理解您为何无法自己找到该信息。毕竟,有两种主要的脚本编写界面用以管理文件:Script Runtime 的 FileSystemObject 和 WMI 类别 CIM_DataFile。由于这两种界面都不包含用以确定文件所有权的属性或方法,因此逻辑结论为:“噢,我想您们根本就办不到这一点。”
但您知道如何通过编写脚本来实现:事情总可以办到,即便具体的方法与您所预料的不尽相同。在这种情况下,需要同时结合使用 WMI 的 Win32_LogicalFileSecuritySetting 类别和 Win32_LogicalFileOwner 关联类别来确定文件所有权。正如您可能预料的,LogicalFileSecuritySetting 类别会获取文件的安全信息。但是,它无法告诉您文件所有者的名称。这时 Win32_LogicalFileOwner 类别将发挥作用:其将取得所有者的 SID(安全识别符)并将其中转给 Win32_SID 类别。然后,Win32_SID 类别可以查找并报告所有者名称和域。
昏了吗?这不怪您;关联类别并不那么直观。但是,幸好不必了解关联类别的工作原理;只要确认其确实有用就行了。例如,这里有一个脚本可报告文件 C:/Scripts/My_script.vbs 的所有者:
On Error Resume Next
strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!//" & strComputer & "/root/cimv2")
strFile = "C:/Scripts/My_script.vbs"
Set colItems = objWMIService.ExecQuery _
("ASSOCIATORS OF {Win32_LogicalFileSecuritySetting='" & strFile & "'}" _
& " WHERE AssocClass=Win32_LogicalFileOwner ResultRole=Owner")
For Each objItem in colItems
Wscript.Echo objItem.ReferencedDomainName
Wscript.Echo objItem.AccountName
Next
看起来有点疯狂,但确实管用。倘若需要获得其他文件的所有者信息,又该怎么办呢?没有问题:只要将 strFile 变量的值设为相关文件的完整路径就行了。
不要让名称误导了您:这两个类别还可用以确定文件夹的所有者。例如,该脚本将报告文件夹 C:/Scripts 的所有者:
On Error Resume Next
strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!//" & strComputer & "/root/cimv2")
strFile = "C:/Scripts"
Set colItems = objWMIService.ExecQuery _
("ASSOCIATORS OF {Win32_LogicalFileSecuritySetting='" & strFile & "'}" _
& " WHERE AssocClass=Win32_LogicalFileOwner ResultRole=Owner")
For Each objItem in colItems
Wscript.Echo objItem.ReferencedDomainName
Wscript.Echo objItem.AccountName
Next