จะค้นหาไฟล์โควต้าของผู้ใช้ทุกคนใน Windows Server 2003 ได้อย่างไร


3

ฉันมี Windows Server 2003 R1 ที่มีผู้ใช้ 150 คนโดยใช้บางโฟลเดอร์ในดิสก์ที่ จำกัด ด้วยโควต้า ฉันขอให้ผู้ใช้ลบไฟล์เก่า แต่เกิดขึ้นว่าพวกเขาไม่ทราบว่าไฟล์ใดเป็นของตนเองเพื่อให้สามารถลบได้ ฉันจะดูรายการด้วยไฟล์ที่เป็นเจ้าของต่อผู้ใช้ในโฟลเดอร์หรือดิสก์ได้อย่างไร? มีเครื่องมือการจัดการ Windows ที่ฉันสามารถใช้จาก Windows 7 หรือ 8 หรืออะไรก็ตาม (linux?) pc เพื่อให้บรรลุสิ่งนี้?


สวัสดี Rob คุณกำลังมองหาพื้นที่ทั้งหมดที่ใช้ต่อผู้ใช้ (ตามไฟล์ที่เป็นเจ้าของ) หรือไม่?
Fazer87

สวัสดี Fazer87 ไม่ฉันกำลังมองหาไฟล์ที่เป็นส่วนหนึ่งของใบเสนอราคาของผู้ใช้ ฉันมีสิทธิ์อย่างเต็มที่ในการทำสิ่งที่ฉันต้องการ แต่ฉันไม่สามารถจัดการเพื่อช่วยผู้ใช้ที่เห็นว่าพวกเขาไม่มีพื้นที่เหลือ (โควต้าที่ใช้ 100%) โดยปกติแล้วพวกเขาไม่รู้ว่าไฟล์อะไรเป็นของพวกเขาและฉันไม่สามารถช่วยพวกเขาได้!
Radolino

สำเนาซ้ำที่เป็นไปได้ใน Serverfault: serverfault.com/questions/195945/…
Thomas Weller

คำตอบ:


1

วิธีง่ายๆในการแสดงไฟล์และการเป็นเจ้าของบัญชีคือการใช้-qพารามิเตอร์ของdir คำสั่งใน Command Prompt การเลือกแสดงผลที่มากขึ้นสามารถทำได้ผ่าน:

dir /q | find "Administrator"

ในการแสดงแต่ละชื่อโฟลเดอร์ตามด้วยไฟล์ทั้งหมด (ถ้ามี) ที่เป็นของบัญชีผู้ดูแลระบบให้ไพพ์คำสั่งดังนี้:

dir /q /s | findstr "Administrator Directory"

ทางออกก็คือผ่านทาง Windows Explorer: Ownerคลิกขวาที่คอลัมน์และเลือกที่จะแสดง

เมื่อคอลัมน์เจ้าของปรากฏขึ้นใครสามารถจัดเรียงไฟล์ตามเจ้าของ การเลือกไฟล์จะแสดงขนาดรวมของไฟล์ที่เลือกในแผงด้านล่าง

หนึ่งยังสามารถแสดงไฟล์เท่านั้นที่เป็นเจ้าของโดยผู้ใช้โดยการป้อนในการค้นหากล่อง (บนขวา) แบบสอบถามตัวอย่างเช่นowner:<user-name>owner:administrator


ฉันพยายาม dir / q ด้วยชื่อผู้ใช้ของฉันและไม่พบอะไรเลย AccessEnum ค้นหากลุ่มและไม่ใช่ผู้ใช้ (หรือฉันหายไป)
Radolino

ลองdir /qโดยไม่ต้อง findstr เพื่อดูชื่อที่แน่นอนของบัญชีเจ้าของ ฉันได้ลบ AccessEnum ออกจากคำตอบของฉันเนื่องจากจะแสดงเฉพาะไฟล์ที่สิทธิ์แตกต่างจากโฟลเดอร์แม่ (เครื่องมือความปลอดภัย) คำถาม: เกิดอะไรขึ้นกับการใช้ Windows Explorer คลิกขวาที่คอลัมน์หนึ่งและเลือกที่จะแสดงเจ้าของ
harrymc

Nice tip (คอลัมน์ที่หนึ่ง) ฉันไม่รู้ว่ามันมีอยู่จริง! แต่อย่างไรก็ตามฉันต้องได้รับรายชื่อพร้อมไฟล์ต่อบัญชีผู้ใช้ และ dir / q | ค้นหา "myaccount" ไม่ส่งคืนอะไรเลย
Radolino

เป็นไปไม่ได้ที่ "dir / q" จะไม่ส่งคืนอะไรเลย คุณช่วยยกตัวอย่างdir /qคนเดียวได้โดยไม่ต้องไม่มี findstr
harrymc

1
โปรดป้อนคำสั่ง "dir / q" เพียงอย่างเดียวตามที่เขียนไว้ที่นี่ (6 ตัวอักษร) โดยไม่ต้องเพิ่ม findstr มิฉะนั้นสิ่งที่คุณกำลังทำคือการส่งออก dir ไปยังโปรแกรมอื่นที่เรียกว่า findstr Findstr ไม่ใช่พารามิเตอร์ของคำสั่ง dir แต่เป็นคำสั่งแยกต่างหาก หมายเหตุ: ใน Windows Explorer คุณสามารถเรียงลำดับโดยเจ้าของและเลือกไฟล์บางไฟล์เพื่อให้ได้ขนาดโดยรวมที่แผงด้านล่าง นอกจากนี้เมื่อเจ้าของแสดงคุณสามารถเขียนข้อความในกล่องค้นหา (ด้านบนขวา) owner:administratorเพื่อแสดงเฉพาะไฟล์ที่มีเจ้าของนั้น
harrymc

0

ไฟล์ในโควต้าจะถูกกำหนดโดยผู้ที่เป็นเจ้าของไฟล์ การใช้โควต้าคือผลรวมของไฟล์ทั้งหมดที่เป็นของผู้ใช้ "โดเมน \ ชื่อผู้ใช้" ด้วยวิธีนี้ในใจวิธีที่ดีที่สุดในการดูว่าใครละเมิดพื้นที่ใครมีอะไรบ้างในโควต้าและอื่น ๆ คือการแจกแจงไฟล์ทั้งหมดด้วยขนาดเจ้าของและวันที่ใช้ล่าสุด

ด้วยการรับข้อมูลนี้และส่งออกเป็น 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

ขอบคุณที่ตอบกลับ แต่สิ่งนี้จะช่วยฉันได้อย่างไร คุณกำลังโพสต์โค้ด "VBS" บางส่วนใช่ไหม ขออภัย แต่เรื่องนี้ออกไปเล็กน้อย ฉันไม่สามารถเห็นได้ว่าสิ่งนี้จะช่วยฉันได้อย่างไร
Radolino

คุณถามว่า "ฉันจะดูรายการที่เป็นเจ้าของต่อผู้ใช้ไฟล์ในโฟลเดอร์หรือดิสก์ได้อย่างไร" เรียกใช้สิ่งนี้และมันจะสร้างมุมมองนั้นให้คุณเนื่องจากไม่สามารถใช้งานได้ผ่านทางหน้าต่าง!
Fazer87

นอกเหนือจากนี้ - ไม่มีเครื่องมือที่ดีมากมายในการทำเช่นนี้ยกเว้นบางอย่างเช่น Treesize Pro - แต่สิ่งนี้จะให้ข้อมูลที่คุณต้องการในรูปแบบที่คุณสามารถใช้งานได้ทันที
Fazer87

ฉันเรียกใช้รหัสของคุณเป็นไฟล์ vbs และไม่มีรายงานอะไร ฉันต้องการเส้นทาง \ files ซึ่งเป็นของผู้ใช้แต่ละคนและกินโควต้าของเขา ฉันก็ไม่รู้เหมือนกันถ้า treesize ทำอย่างนั้น แต่ฉันจะเอามันไป (ทดลอง)
Radolino

1
มันไม่ใช่ "ปัญหา" แต่เป็นข้อกำหนด ลองนึกภาพว่าโควต้าของผู้ใช้เต็มและพวกเขาถามว่า "ฉันขอเนื้อที่เพิ่มได้ไหม" คำตอบคือ "ไม่โปรดลบบางอย่างออกจากไฟล์เก่าของคุณ" และพวกเขาตอบว่า "ฉันไม่มีไฟล์ใด ๆ เลยฉันลบไปแล้ว" ฉันผ่านโควต้าของพวกเขาและเห็นว่าเต็ม 95% และฉันไม่สามารถช่วยพวกเขาได้เพราะมันเป็นไดรฟ์เครือข่ายขนาดใหญ่ที่มีไฟล์หลายพันไฟล์ที่แชร์ในหมู่ผู้ใช้!
Radolino
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.