web-dev-qa-db-ja.com

Windows Server 2003ですべてのユーザーのクォータファイルを見つける方法は?

クォータによって制限されたディスク内のいくつかのフォルダを使用している150人のユーザーがいるWindowsServer 2003R1があります。古いファイルを削除するようにユーザーに依頼していますが、どのファイルが自分のものであるかわからないため、削除することができます。フォルダまたはディスク内のユーザーごとに所有されているファイルのリストを表示するにはどうすればよいですか?これを実現するために、Windows 7または8またはその他の(Linux?)PCから使用できるWindows管理ツールはありますか?

3
Radolino

ファイルを表示してアカウントを所有する簡単な方法は、コマンドプロンプトでdirコマンドの-qパラメーターを使用することです。より選択的な表示は、次の方法で実行できます。

dir /q | find "Administrator"

管理者アカウントが所有するすべてのファイル(存在する場合)に続いて各フォルダー名を表示するには、次のようにコマンドをパイプします。

dir /q /s | findstr "Administrator Directory"

別の解決策は、Windowsエクスプローラーを使用することです。列を右クリックして、Ownerを表示することを選択します。

[所有者]列が表示されたら、所有者でファイルを並べ替えることができます。ファイルを選択すると、選択したファイルの合計サイズが下部パネルに表示されます。

検索ボックス(右上)にクエリowner:<user-name>(たとえば、owner:administrator)を入力して、ユーザーが所有するファイルのみを表示することもできます。

1
harrymc

クォータ内のファイルは、ファイルの所有者によって決定されます。クォータ使用量は、ユーザー「domain\username」が所有するすべてのファイルの合計です。これを念頭に置いて、誰がスペースを悪用しているか、誰がクォータに何を持っているかなどを確認する最良の方法は、すべてのファイルをサイズ、所有者、最終使用日で列挙することです。

この情報を取得してCSVにエクスポートすることで、Excelでファイルをグループ化して、大きすぎるもの、未使用のもの、必要以上に100万個のファイルを持っている人を確認できます。

同様のタスクを実行する必要があるときは、次の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
Fazer87