Получить размер профиля пользователя в vbscript
Я пытаюсь получить размер локального профиля пользователя с помощью VBScript. Я знаю каталог профиля (обычно "C:\Users\blah").
Следующий код не работает для большинства профилей (ошибка "Отказано в доступе" 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
5 ответов
Как вы сказали, у вас есть ошибка в разрешении. Имеет ли учетная запись, под которой работает этот скрипт, на самом деле разрешения на просмотр этих папок профиля пользователя и вычисление размера? Если вы не можете просмотреть его вручную с помощью Проводника, ваш сценарий не будет работать лучше.
Спасибо за это!!
Я думал, что столкнусь с какой-нибудь дурацкой проблемой 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
Остальное зависит от тебя!
Еще раз спасибо, Майкл.
Я создал скрипт для получения профилей локальных пользователей и их размера со всех компьютеров с Windows XP и Windows 7 в Active Directory. Сценарий можно найти здесь:
@ Райан Болджер
Вы явно упускаете смысл этого сценария. vbscript имеет ограничения на специальные папки, вне зависимости от того, можете ли вы получить доступ к этой папке или нет через Проводник. Например, у вас может быть доступ к папке "Мои документы", но в vbscript, который считается специальной папкой, и вам будет отказано в доступе, независимо от того, какой у вас уровень администратора, даже если это ваша собственная папка.
Если вы хотите использовать PowerShell, этот вариант тоже подойдет, хотя он специально написан для размера папки "Мои документы": http://gallery.technet.microsoft.com/ScriptCenter/en-us/149ef544-a34a-4896-b6c3-b09491757f04