При настройке дисковых квот необходимо решить, как система будет реагировать на попытки пользователей занять больше места, чем им отведено. Если пользователь пытается создать файл, который выходит за рамки отведенного ему дискового пространства, обычно он получает сообщение «Недостаточно свободного места на диске». Система не позволит пользователю записать дополнительную информацию на диск, пока он не удалит другие файлы. Дисковые квоты основаны на принадлежности файлов пользователю и поэтому не зависят от физического расположения на диске. Другими словами, если пользователь просто перемещает файл из одной папки в другую, суммарный объем используемого пространства не меняется.

Когда пользователь достигает предела своей квоты, он может только удалить файлы или физически переместить их на другой том, находящийся в ведении другого пользователя. С точки зрения системы квот, сжатие (или разархивирование) файлов не влияет на количество занимаемого дискового пространства, а, значит, не влияет на количество свободного места. Дисковые квоты основаны на размере несжатых файлов.

Дисковые квоты прозрачны для большинства программ. Когда пользователь достигает предела своей квоты, диск просто выглядит заполненным, поэтому программы выдают ошибки и начинают исполнять коды обработки ошибок. Дисковые квоты также прозрачны для пользователей. Когда пользователь спрашивает, сколько осталось места на диске, система выдает ему только доступность его квоты, вне зависимости от того, спрашивает он это через интерфейс операционной системы или через сценарий.

Для установки дисковых квот обычно используется редактор групповых политик. Однако можно установить некоторые настройки вручную - например, разрешить или запретить управление дисковыми квотами - не используя соответствующую политику. Также можно задействовать COM-компоненты в сценариях, чтобы определить использование сотрудником его квоты, и создать отчет в формате HTML.

Задание квот вручную

Чтобы контролировать квоты вручную, не используя политику, достаточно просто открыть окно «Мой компьютер», щелкнуть правой кнопкой мыши на нужном томе NTFS и выбрать «Свойства». На вкладке «Квоты» можно установить разные параметры. Существует три подхода к управлению квотами:

  • Можно отменить квоты, убрав галочку "Включить управление квотами".
  • Можно разрешить квоты, но не навязывать их, выбрав "Включить управление квотами" и отключив "Не выделять место на диске при превышении квоты". Если выбрать такой подход, система будет отслеживать использование дискового пространства, но не будет выдавать сообщений об ошибках или запрещать запись на диск из-за нарушений квоты.
  • Можно разрешить и навязать квоты, выбрав оба параметра: "Включить управление квотами" и "Не выделять место на диске при превышении квоты".

На вкладке «Квоты» есть и режим слежения за квотами. Отключив «Не выделять место на диске при превышении квоты» и выбрав один из параметров протоколирования, можно следить за квотами. В этом случае пользователи, вообще говоря, могут превышать свои квоты. При такой настройке система никогда не запрещает доступ к диску, вместо этого она регулярно предоставляет отчеты об использовании дискового пространства по каждому пользователю. Другими словами, в этом режиме система дисковых квот ограничивается записью событий и не выполняет блокирующих операций.

Можно также использовать одновременно и слежение за квотами и ограничение по ним. Для этого необходимо выбрать «Не выделять место на диске при превышении квоты» вместе с одним из параметров протоколирования. Можно настроить систему так, чтобы она добавляла очередную запись в файл журнала каждый раз, когда пользователь пытается занять места больше, чем ему отведено.

Включение дисковых квот создает дополнительную нагрузку на сервер и незначительно снижает производительность файловых серверов. Хороший способ уменьшить эффект от введения квот на производительность системы - вводить квоты избирательно. Когда квоты включены, можно задействовать средства аудита Windows 2000 чтобы следить за использованием диска и протоколировать операции с ним. В этом случае вы будете точно знать, как именно пользователи расходуют дисковое пространство, и сможете решать, когда и где использовать систему с включенными квотами. Можно применять общепринятые форматы файлов, такие как файлы Microsoft Excel (.xls) для передачи результатов аудита в другие приложения или другим менеджерам.

Программное определение дисковых квот

Давайте рассмотрим альтернативный подход. Он основан на применении COM-компонентов, чтобы избирательно извлекать информацию об использовании диска и генерировать код HTML для создания отчетов в Web. В Windows 2000 и более поздних версиях Windows предоставляет объект DiskQuotaControl, который позволяет управлять квотами на данном томе. Используя этот компонент, можно программным путем установить пределы квот по умолчанию, включить или выключить систему квот на томе и решать, предоставить или нет дополнительное пространство пользователям, превышающим квоту.

Перед тем, как начать работу с COM-объектом, необходимо убедиться, что квоты в системе включены или хотя бы были включены когда-то раньше. Если запустить сценарий, который использует компонент DiskQuotaControl на диске, на котором никогда не включались квоты, он не вернет ничего, кроме нуля. При включении квоты системе нужно время, чтобы обновить статистику использования диска по каждому пользователю.

Чтобы создать экземпляр объекта DiskQuotaControl, используйте функцию CreateObject языка VBScript с программным идентификатором (ProgID) Microsoft.DiskQuota.1, как показано во фрагменте А листинга 1. Первое, что надо сделать с объектом DiskQuotaControl - инициализировать дисковый том, квоты на котором необходимо обработать. Для этого воспользуйтесь методом Initialize, чтобы определить и открыть дисковый том, как показано в коде фрагмента А. У метода Initialize два параметра. Первый параметр - строковое значение, полный путь к тому, который вы хотите проинициализировать. Обычно эта строка - корень диска NTFS. Второй параметр - логическое значение, которое определяет режим чтения/записи на том. Если передать значение истина (true), то том будет доступен для чтения/записи; если передать значение ложь (false), том будет доступен только для чтения. После того, как метод Initialize будет выполнен, вы присоединяетесь к системе дисковых квот нужного тома.

Что делать дальше, зависит от ваших нужд. В рамках этой статьи давайте рассмотрим два способа определения и вывода использования диска для каждого пользователя. Листинг 1 содержит код, который определяет и выводит использование диска, в то время как Листинг 2 содержит код, который определяет использование диска и создает HTML-отчет на основе этой информации.

Отображение использования дисковых квот

Объект DiskQuotaControl позволяет установить глобальные свойства тома, которые будут применены ко всем пользователям. Чтобы установить свойства квоты для конкретного пользователя, задействуйте объект DIDiskQuotaUser. Этот объект показывает учетные записи всех пользователей с квотами в виде элементов списка. Каждый элемент списка - объект DIDiskQuotaUser. Как и с любым списком на основе COM-объектов, можно использовать инструкцию For Each…Next для перечисления всех его членов. Код фрагмента B листинга 1 производит перебор по пользователям в списке и создает строку, которая содержит имя пользователя и объем занимаемого им пространства. Свойство LogonName объекта DIDiskQuotaUser возвращает имя пользователя и доступно только для чтения. Свойство QuotaUsed содержит количество использованного данным сотрудником дискового пространства в байтах. Тип значения, возвращаемого этим свойством, - Double. Как я уже упоминал выше, сжатие диска не влияет на систему дисковых квот. Следовательно, значение, возвращаемое свойством QuotaUsed, всегда отражает количество дискового пространства, которое потребуется несжатым файлам.

Если информация по квотам нужна только для отчетности, вам, скорее всего, не понадобится точное число байтов, занятых пользователем. Соответственно, значение, которое вернет QuotaUsed, будет иметь точность сверх необходимого и, что хуже, будет неудобочитаемым. Чтобы получить более приемлемое число, код фрагмента B листинга 1 использует функцию Round (округление) Vbsript, чтобы преобразовать количество байт в количество мегабайт. Функция Round использует заданное количество десятичных знаков (два знака в примере), чтобы округлить число в сторону увеличения или уменьшения.

Код в листинге 1 предназначен для работы на NTFS-томе C. Чтобы адаптировать его под свою систему, следует изменить первый аргумент метода Initialize в коде фрагмента A так, чтобы выбирался тот том, с которым вы хотите работать.

Подготовка отчета в формате HTML

В Листинге 1 содержится информация о занимаемом пользователями дисковом пространстве, но едва ли можно сказать, что она хорошо отформатирована или легко читаема. С незначительными усилиями можно написать код так, чтобы информация об использовании диска была представлена в виде HTML. HTML - несложный описательный язык, но только до тех пор, пока ваши нужды остаются относительно простыми. Задача форматирования информации в столбцы и применения нескольких разметочных правил довольно проста и не требует использования специального инструмента генерации отчетов.

Сценарий в Листинге 2 запрашивает у Windows 2000 информацию об использовании диска, а затем записывает ее в файл HTML. Чтобы создать отчет HTML было проще, в коде используется свойство QuotaUsedText вместо QuotaUsed. QuotaUsedText возвращает строку, которая выражает объем занятого пространства в гигабайтах, мегабайтах или килобайтах (например, 6,78Гбайт, 443,56Mбайт, 4,89Kбайт). Возвращаемый текст соответствует информации, которая появляется в столбце Amount Used окна Quota Entries соответствующего тома. Вся информация, отображаемая в окне Quota Entries, имеет аналог в объектах DiskQuotaControl и DIDiskQuotaUser.

Сценарий инициализирует строку с тэгами HTML, необходимыми для того, чтобы создать страницу с таблицей. Как показывает код в Листинге 2, код создает таблицу с фоном цвета морских ракушек и границей шириной в один пиксель. Затем код создает два столбца - Logon Name и Amount Used. Если требуется создать три столбца, достаточно просто вставить строку … перед тем, как закрыть тэг . Обратите внимание, что элементы определяют только ячейку в заголовке таблицы. Сам тэг не представляет собой столбец.

К этому моменту уже установлена статичная структура HTML страницы. Остается только заполнить страницу необработанной информацией о квотах, как показано во фрагменте B листинга 2. В этом коде сценарий добавляет новую строку таблицы - новый элемент - для каждого пользователя, зарегистрированного в системе квот. Строка состоит из стольких ячеек - элементов , из скольких состоит уже объявленный заголовок. Столбец Amount Used, второй в таблице, выровнен по правому краю, так как состоит из строк, представляющих собой числа. В конце цикла закрываются основные тэги HTML и сохраняется страница. Теперь файл готов для публикации в сети, локального или удаленного просмотра через Web-браузер.

Программирование квот

Компонент DiskQuotaControl представляет собой доступный для сценариев эквивалент системы дисковых квот. Можно использовать его для выборочного получения необходимой информации от системы дисковых квот. Эта гибкость позволяет применять информацию о квотах в форме, соответствующей корпоративным стандартам или предпочтениям администратора. Несмотря на то, что Windows 2000 предоставляет мощную встроенную подсистему аудита, простой сценарий, как в листинге 2, может задействовать те же средства, что и вся остальная система, чтобы получать информацию о квотах, потом представить эту информацию в формате HTML или даже XML, либо в файле CSV (с разделением запятыми). Теперь вы можете строить собственную историю использования дискового пространства и создавать удобные для чтения отчеты.


Листинг 1. Задание и отображение использования дисковых квот
Dim vol
# НАЧАЛО ФРАГМЕНТА A
Set vol = CreateObject("Microsoft.DiskQuota.1")
vol.Initialize "C:", true
# КОНЕЦ ФРАГМЕНТА A

Dim quotaUser, results
results = ""
Dim spaceUsed
# НАЧАЛО ФРАГМЕНТА B
For Each quotaUser in vol
	spaceUsed = Round(quotaUser.QuotaUsed / (1024*1024), 2)
	results = results & _
		quotaUser.LogonName & vbTab & _
		"[" & spaceUsed & "]" & _
		vbCrLf
Next
# КОНЕЦ ФРАГМЕНТА B
MsgBox results

Листинг 2: Программа создания отчета по использованию диска в формате HTML
Dim vol
Set vol = CreateObject("Microsoft.DiskQuota.1")
vol.Initialize "C:", true

# НАЧАЛО ФРАГМЕНТА A
Dim html
html = ""
html = html & ""
html = html & ""
html = html & ""
html = html & ""
# КОНЕЦ ФРАГМЕНТА A# НАЧАЛО ФРАГМЕНТА B
For Each quotaUser in vol
	html = html & ""
	html = html & ""
	html = html & ""
	html = html & ""
Next
# КОНЕЦ ФРАГМЕНТА B
html = html & "
Logon NameAmount Used
" & quotaUser.LogonName & "" & quotaUser.QuotaUsedText & "
" Set fso = CreateObject("Scripting.FileSystemObject") Set f = fso.CreateTextFile ("disk usage report.htm") f.Write html f.Close