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