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
あなたが言ったように、あなたは許可拒否エラーを持っています。このスクリプトが実行されているアカウントには、実際にこれらのユーザープロファイルフォルダーをトラバースしてサイズを計算する権限がありますか? Explorerを使用して手動で表示できない場合、スクリプトはそれ以上うまくいきません。
これをありがとう!
許可が許可されているように見える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
後は君しだい!
マイケル、ありがとう。
ActiveDirectory内のすべてのWindows XPおよびWindows7マシンからローカルユーザープロファイルとそのサイズを取得するためのスクリプトを作成しました。スクリプトは次の場所にあります。
Active Directory:Active Directory内のすべてのコンピューターとユーザーのローカルプロファイルサイズを列挙するVBscript
@ライアン・ボルジャー
あなたは明らかにこのスクリプトの要点を見逃しています。 vbscriptには、エクスプローラーを介してそのフォルダーにアクセスできるかどうかに関係なく、特別なフォルダーに制限があります。たとえば、マイドキュメントフォルダにアクセスできる場合がありますが、vbscriptでは特別なフォルダと見なされ、自分のフォルダであっても、管理者レベルに関係なく拒否されたアクセス許可が与えられます。
これはマイドキュメントフォルダのサイズ用に特別に作成されていますが、PowerShellを使用する場合は、これも便利です: http://gallery.technet.Microsoft.com/ScriptCenter/en-us/149ef544-a34a -4896-b6c3-b09491757f04