嗨,Scripting Guy!

Hey,Scripting Guy!

歡迎使用全新的 TechNet 專欄,Microsoft Scripting Guy 會在此為您解答有關系統管理指令碼的常見問題。您有關於系統管理指令碼方面的問題嗎?請將電子郵件傳送到 scripter@microsoft.com。我們無法保證能夠逐一回答每個問題,不過我們會盡力而為。

今天的問題:我要如何判斷檔案的擁有者?


我要如何判斷檔案的擁有者?

嗨,Scripting Guy!是否有使用指令碼判斷檔案擁有者的方法?

-- BD

BD,您好。事實上的確「有」使用指令碼來判斷檔案擁有者的方法,不過您必須瞭解為何有可能無法自行找出這項資訊。畢竟,在管理檔案時有用到 2 種主要的指令碼介面:指令碼執行時期的 FileSystemObject 以及 WMI 類別的 CIM_DataFile。既然這兩種介面都沒有包含判斷檔案擁有權的屬性或方法,合理的結論會是:「噢,我想您終究辦不到這點。」

不過您相當瞭解指令碼的奧妙:您可以完成許多工作,儘管這些工作不是以您可能預期的合理方式達成。在此情況下,您需要合併使用 WMI 的 Win32_LogicalFileSecuritySetting 類別,以及 Win32_LogicalFileOwner 關聯類別,才能判斷檔案的擁有權。如同您所預期的,LogicalFileSecuritySetting 類別會從檔案中抓取安全性資訊。然而,此類別卻無法告訴您檔案擁有者的名稱。此時 Win32_LogicalFileOwner 類別即可發揮功用:此類別會取得擁有者的 SID (安全性識別元),並將 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

如需詳細資訊

查看嗨,Scripting Guy!- 過往文件

 

回到頁首 回到頁首