題 如何在Windows Server 2003中查找每個用戶的配額文件?


我有一個Windows服務器2003 R1,有150個用戶使用受配額限制的磁盤中的某些文件夾。我要求用戶刪除舊文件,但碰巧他們不知道哪些文件是他們自己的,所以他們可以刪除它們。如何查看文件夾或磁盤中擁有的每個用戶文件的列表?是否有一個Windows管理工具,我可以從Windows 7或8或任何(Linux?)PC使用它來實現這一目標?


3
2018-03-11 09:58


起源


你好Rob,你在尋找每個用戶使用的總空間(基於擁有的文件)嗎? - Fazer87
嗨Fazer87,不,我正在尋找屬於用戶報價的文件。我有完全權限可以做我想做的任何事情,但我無法幫助那些看到他們沒有剩餘空間的用戶(配額使用100%)。通常他們不知道哪些文件是他們的,我無法幫助他們! - Radolino
Serverfault上可能重複: serverfault.com/questions/195945/... - Thomas Weller


答案:


顯示文件和擁有帳戶的簡單方法是使用 -q 的參數 dir 命令提示符中的命令。可通過以下方式進行更具選擇性的顯示:

dir /q | find "Administrator"

至 顯示每個文件夾名稱,後跟管理員帳戶擁有的所有文件(如果有),管道命令如下:

dir /q /s | findstr "Administrator Directory"

另一種解決方案是通過Windows資源管理器:右鍵單擊一列並選擇顯示 Owner

顯示“所有者”列後,可以由所有者對文件進行排序。 選擇文件將在底部面板中顯示所選文件的總大小。

通過在“搜索”框中輸入,還可以僅顯示用戶擁有的文件 (右上角)查詢 owner:<user-name>, 例如 owner:administrator


1
2018-06-27 11:38



我嘗試使用我的用戶名進行dir / q,但確實找不到任何內容。 AccessEnum也發現組而不是用戶(或者我遺漏了一些東西)。 - Radolino
嘗試 dir /q 沒有findstr可以查看擁有帳戶的確切名稱。我從我的答案中刪除了AccessEnum,因為它只顯示其權限與其父文件夾(安全工具)不同的文件。問題:使用Windows資源管理器有什麼問題,右鍵單擊列並選擇顯示所有者。 - harrymc
不錯的提示(第一欄)我不知道它存在!但是,我需要獲得一個包含每個用戶帳戶文件的列表。和dir / q |發現“myaccount”什麼都不返回。 - Radolino
“dir / q”無法返回任何內容。你能舉個例子嗎? dir /q 沒有沒有找到的人。 - harrymc
請完全按照此處所寫的那樣輸入命令“dir / q”(6個字符),而不添加findstr。否則你正在做的是將dir的輸出傳遞給另一個名為findstr的程序。 Findstr不是dir命令的參數,而是一個單獨的命令。注意:在Windows資源管理器中,您可以按所有者排序並選擇一些文件以獲得底部面板中的總大小。此外,一旦顯示所有者,您可以在搜索框(右上角)中寫入文本 owner:administrator 僅顯示具有該所有者的文件。 - harrymc


配額中的文件由誰擁有該文件確定。配額使用量是用戶“domain \ username”擁有的所有文件的總和。考慮到這一點,查看誰濫用空間,誰擁有配額等的最佳方式是枚舉所有文件的大小,所有者和上次使用的日期。

通過獲取此信息並導出為CSV,您可以將這些文件分組到excel中,看看什麼太大,太多未使用以及誰擁有超過應有的百萬個文件。

當我必須完成類似的任務時,我使用了一段VBS。這段腳本將提示您輸入一個基本文件夾,並將遞歸它下面的所有內容。完成後,將在腳本本身所在的同一文件夾中創建CSV:

on error resume next

' Flags for browse dialog
Const BIF_returnonlyfsdirs   = &H0001
Const BIF_dontgobelowdomain  = &H0002
Const BIF_statustext         = &H0004
Const BIF_returnfsancestors  = &H0008
Const BIF_editbox            = &H0010
Const BIF_validate           = &H0020
Const BIF_browseforcomputer  = &H1000
Const BIF_browseforprinter   = &H2000
Const BIF_browseincludefiles = &H4000

Const ForReading = 1
Const ForWriting = 2
Const ForAppending = 8

Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objDlg = WScript.CreateObject("Shell.Application")
Set objShell = CreateObject("WScript.Shell")
Set objNetwork = CreateObject("WScript.Network") 

'Get the Source Folder
' Use the BrowseForFolder method.
Set objStartFolder = objDlg.BrowseForFolder (&H0, _
    "Please select the FOLDER to report on.", BIF_editbox + BIF_returnonlyfsdirs)

' Here we use TypeName to detect the result.
If InStr(1, TypeName(objStartFolder), "Folder") > 0 Then
    sourceFolder = objStartFolder.ParentFolder.ParseName(objStartFolder.Title).Path
Else
    MsgBox "An error has occured: Unable to read destination folder"
End if

'Ask to open the report now or just close
strMbox = MsgBox("Are youn sure you want to run the report of: " & sourceFolder & chr(13) & chr(10) & chr(13) & chr(10) & "If you continue this may take an exteneded period of time, a message will be displayed when complete, continue?",4,"Are you sure?")

if strMbox = 6 Then
    currentScriptPath = Replace(WScript.ScriptFullName, WScript.ScriptName, "") 
    reportFile = currentScriptPath & "File_Properties_Report.csv"

    'OpenTextFile(destination, forwriting, createnew, open as Unicode) 
    Set objReportFile = objFSO.OpenTextFile(reportFile, ForWriting, True, True)

    'Add headers
    objReportFile.Write("Path, Size(kb), Type, Created, Last Accessed, Last Modified, Owner"  & chr(13) & chr(10))

    'Run though file report process
    ReportFiles sourceFolder

    'Close the file 
    objReportFile.Close

    'Compete
    strMbox = MsgBox("Report Complete")
End if

Function ReportFiles(currentFolder)
   Dim objFolder, objFile, fileCollection, folderCollection, subFolder

   Set objFolder = objFSO.GetFolder(currentFolder)
   Set fileCollection = objFolder.Files

   For Each objFile In fileCollection

        'Get File Properties
        strFilePath = objFile.Path
        strFileName = objFile.Name
        strFileSize = objFile.Size / 1024
        strFileType = objFile.Type
        strFileDateCreated = objFile.DateCreated
        strFileDateLastAccessed = objFile.DateLastAccessed
        strFileDateLastModified = objFile.DateLastModified

        'Get File owner
        strFileOwnerDomain = ""
        strFileOwner = ""

        strComputer = "."
            Set objWMIService = GetObject("winmgmts:" _
            & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")

        if strFileType <> "Shortcut" or InStr(1,strFileName, "AlbumArt",1) = 0 or InStr(1,strFileName, "£",1) Then
            Set colItems = objWMIService.ExecQuery ("ASSOCIATORS OF {Win32_LogicalFileSecuritySetting=""" & Replace(strFilePath, "\", "\\") & """}" & " WHERE AssocClass=Win32_LogicalFileOwner ResultRole=Owner")

            For Each objItem in colItems
                strFileOwnerDomain =  objItem.ReferencedDomainName
                strFileOwner = objItem.AccountName
            Next
        End If

        objReportFile.Write(chr(34) & strFilePath & chr(34) & ", " _
                            &  Round(strFileSize,2) & ", " _
                            & chr(34) & strFileType & chr(34) & "," _
                            & strFileDateCreated & "," _
                            & strFileDateLastAccessed & "," _
                            & strFileDateLastModified & "," _
                            & chr(34) & strFileOwnerDomain & "\" & strFileOwner & chr(34) & "," _
                            & chr(13) & chr(10))    
    Next

    'Loop for each sub folder
    Set folderCollection = objFolder.SubFolders

    For Each subFolder In folderCollection
       ReportFiles subFolder.Path
   Next
End Function

如果您想要幫助您的用戶,我會在一夜之間運行,然後在第二天與用戶交談以確定他們可以減少/刪除的內容。

如果您只想要特定用戶的信息,您可以隨時告訴VBS只寫出類似於以下內容的匹配:

strTargetUser = "domain\person"
if strFileOwnerDomain & "\" & strFileOwner = strTargetUser then
objReportFile.Write(chr(34) & strFilePath & chr(34) & ", " _
                            &  Round(strFileSize,2) & ", " _
                            & chr(34) & strFileType & chr(34) & "," _
                            & strFileDateCreated & "," _
                            & strFileDateLastAccessed & "," _
                            & strFileDateLastModified & "," _
                            & chr(34) & strFileOwnerDomain & "\" & strFileOwner & chr(34) & "," _
                            & chr(13) & chr(10))  
end if

0
2018-06-27 11:24



謝謝你的回复,但這對我有什麼幫助?你發布了一些“VBS”代碼?對不起,這有點不合適了。我真的看不出這對我有什麼幫助。 - Radolino
您詢問“如何查看文件夾或磁盤中擁有的每個用戶文件的列表?”。運行它,它將生成您的視圖,因為它本身不能通過Windows! - Fazer87
除此之外 - 沒有那麼多好的工具可以做到這一點,除了像Treesize Pro之類的東西 - 而這將以你可以立即使用的格式提供你需要的信息 - Fazer87
我將您的代碼作為vbs文件執行,沒有任何報告。我需要屬於每個用戶的路徑\文件,並吃掉他的配額。另外我不知道如果樹木化那樣做,但我會試一試(試用)。 - Radolino
這不是一個“問題”,而是一個要求。想像一下,用戶的配額填滿了,他們問“我可以請更多空間”。答案是“不,請刪除舊文件中的內容”。他們回答“我沒有任何文件,我刪除了它們”。我通過他們的配額,看到它填滿了95%,我無法幫助他們,因為它是一個龐大的網絡驅動器,用戶共享數千個文件! - Radolino