web-dev-qa-db-ja.com

vbscriptでユーザープロファイルのサイズを取得する

VBScriptを使用してユーザーのローカルプロファイルのサイズを取得しようとしています。プロファイルのディレクトリ(通常は「C:\ Users\blah」)を知っています。

次のコードは、ほとんどのプロファイルでは機能しません(Permission Deniedエラー800A0046)。

Dim folder
Dim fso

Set fso = WScript.CreateObject("Scripting.FileSystemObject")
Set folder = fso.GetFolder("C:\Users\blah")
MsgBox folder.Size    ' Error occurs here

これを行う別の方法はありますか?

更新:
さらに深く掘り下げましたが、サイズを取得したいディレクトリの一部のサブフォルダまたはファイルに対するアクセス許可が拒否された場合、アクセス許可拒否エラーが発生することがわかりました。ユーザープロファイルの場合、管理者グループでさえアクセスする権限を持たないシステムファイルが常にいくつかあります。

これを回避するために、通常の方法(上記)でフォルダーサイズを取得しようとする関数を作成しました。エラーが発生すると、アクセスが拒否されたフォルダーサイズを無視して、フォルダーのサブディレクトリに再帰します(ただし、残りのフォルダ)。

Dim fso
Set fso = WScript.CreateObject("Scripting.FileSystemObject")

Function getFolderSize(folderName)
    On Error Resume Next

    Dim folder
    Dim subfolder
    Dim size
    Dim hasSubfolders

    size = 0
    hasSubfolders = False

    Set folder = fso.GetFolder(folderName)
    ' Try the non-recursive way first (potentially faster?)
    Err.Clear
    size = folder.Size
    If Err.Number <> 0 then     ' Did not work; do recursive way:
        For Each subfolder in folder.SubFolders
            size = size + getFolderSize(subfolder.Path)
            hasSubfolders = True
        Next

        If not hasSubfolders then
            size = folder.Size
        End If
    End If

    getFolderSize = size

    Set folder = Nothing        ' Just in case
End Function
3
Cameron

あなたが言ったように、あなたは許可拒否エラーを持っています。このスクリプトが実行されているアカウントには、実際にこれらのユーザープロファイルフォルダーをトラバースしてサイズを計算する権限がありますか? Explorerを使用して手動で表示できない場合、スクリプトはそれ以上うまくいきません。

1
Ryan Bolger

これをありがとう!

許可が許可されているように見える2008年の奇抜な問題に遭遇すると思いましたが、許可されていません...

ごみ箱の物理的なサイズをチェックし、ユーザーまたは管理者に表示されるものと比較するスクリプトのコードが必要です。

これまでのところ、すべてのサーバーで2ギガから8ギガの失われたファイルが見つかりました。

コードのうなり声は単純です:

Const RECYCLE_BIN = &Ha&

Set objShell = CreateObject("Shell.Application")
Set objFolder = objShell.Namespace(RECYCLE_BIN)
Set objFolderItem = objFolder.Self

Set RecycledObjects = objFolder.Items
For Each objItem in RecycledObjects
    TotalVisibleSize = TotalVisibleSize  + objItem.Size
Next


WriteLog "Obtaining size for C:\" & BinFolder, LOG_VERBOSE
WriteLog "Trying to get size", LOG_VERBOSE
TotalPhysicalSize = getFolderSize("c:\" & BinFolder)

if objFSO.FolderExists("d:\" & BinFolder) then
    WriteLog "Obtaining size for D:\" & BinFolder, LOG_VERBOSE
    TotalPhysicalSize = TotalPhysicalSize + getFolderSize("d:\" & BinFolder)
end if

後は君しだい!

マイケル、ありがとう。

1
Michael

ActiveDirectory内のすべてのWindows XPおよびWindows7マシンからローカルユーザープロファイルとそのサイズを取得するためのスクリプトを作成しました。スクリプトは次の場所にあります。

Active Directory:Active Directory内のすべてのコンピューターとユーザーのローカルプロファイルサイズを列挙するVBscript

1
dirk adamsky

@ライアン・ボルジャー

あなたは明らかにこのスクリプトの要点を見逃しています。 vbscriptには、エクスプローラーを介してそのフォルダーにアクセスできるかどうかに関係なく、特別なフォルダーに制限があります。たとえば、マイドキュメントフォルダにアクセスできる場合がありますが、vbscriptでは特別なフォルダと見なされ、自分のフォルダであっても、管理者レベルに関係なく拒否されたアクセス許可が与えられます。

0
Ben Kilp

これはマイドキュメントフォルダのサイズ用に特別に作成されていますが、PowerShellを使用する場合は、これも便利です: http://gallery.technet.Microsoft.com/ScriptCenter/en-us/149ef544-a34a -4896-b6c3-b09491757f04

0
Jordan W.