Powershell – Подсчет свободного места на дисках

Наиболее часто возникающая у многих проблема: «Закончилось свободное место на жестком диске.»
Каждый хотя бы раз с ней сталкивался и по разному решал эту проблему, но малый процент задумывался о предупреждении её.
Если в вашем подчинении находится десяток-другой компьютеров то пройтись по ним и посмотреть и посмотреть на состояние дисков не составит труда. а если компьютеров больше ста, например 500 или 600 или 1000 и больше?
Предлагаю рассмотреть скрипт который собирает данные о свободном месте на дисках.
Получить данные о свободном месте на нескольких компьютерах довольно легко, в WMI есть класс Win32_LogicalDisk и одним из его атрибутов является freespace.
Powershell – наше все…
Им то мы и воспользуемся. Нужно немного времени и терпения.
Итак.
1. готовим файл hostlist.txt вот такого содержания
host1 host2 host3
2. Создаем powershell-скрипт
На выходе получаем табличку в которой будет указано имя хоста, буква диска, размер и свободное место.
Если результат необходимо отправить в файл слегка меняем скрипт.
При необходимости готовый отчет можно отправить администратору на email.
Похожие статьи
Информация об авторе
|
|
Сергей Мариничев. Вы можете присоединиться ко мне в Facebook или в Twitter. |
А также бесплатно подписаться по E-mail и получать актуальную информацию в числе первых.
Вы можете оставить комментарий.

Спасибо за скрипт=)
Возникает вопрос, есть ли возможность инфу, которая была получена, отправить на почту или sms средствами PoSh?
kopЦитировать
Конечно методики есть.
В ближайшее время я постараюсь описать процедуру отправки почты (доступна как авторизованная отправка так и анонимная).
Для обмена данными с SMS-ом предусмотрен формат IDMIF и NOIDMIF, этот вопрос так же будет затронут, но чуть позже.
adminЦитировать
Ок, спасибо, буду ждать с нетерпением.
kopЦитировать
Сергей, добрый день!
Возможно вы что-то подскажите, каким образом можно вывести информацию о свободном месте на сетевоим диске на сайт в локальной сети. Чтобы пользователи понимали, что документ не сохраняется из-за отсутсвия свободно пространства. Заранее спасибо
ЕвгенийЦитировать
Евгений.
Предположу что ОС у вас Windows 2003.
Если у вас установлено расширение R2 то вы можете использовать функционал Storage Monitoring and Reporting.
http://www.windowsnetworking.com/articles_tutorials/Storage-Monitoring-Reporting.html
Если у вас 2008 то там этот функционал зашит.
Вариант использования – генерировать отчеты и выкладывать их на IIS или при истечении квот отправлять письмо
Сергей МариничевЦитировать
Доброго времени суток.
Спасибо за скрипт.
Но есть небольшой вопрос.
Как сделать так чтобы подставляя «-computer 192.168.0.250″ (например)
еще добавить логи и пароль для доступа к этому компьютеру (хочу проверять свободное место в разных сетях)
АлександрЦитировать
Примерно так.
Добавляется только read-Host и Get-Credential
Сергей МариничевЦитировать
Ммм… read-host я не добавляю, пишу вручную 1 ip добавил -Credential (Get-Credential) да у меня запросило логин и пароль, если ввожу то все работает, а как реализовать это в авто режиме? ввод логина и пароля. Извините за навязчивость.
АлександрЦитировать
В авто никак.
Единственный вариант – запускать скрипт от пользователя у которого есть нужные полномочия.
Сергей МариничевЦитировать
Добрый день.
Немного переделал скрипт, чтоб выдавал инфу, если на сервере осталось меньше 5% свободного места
$i=Get-WMIObject Win32_LogicalDisk -filter «DriveType=3″ -computer (Get-Content servers.txt)| Where-Object -FilterScript{$_.freespace/$_.size -lt 5/100 }
$c=$i| Select SystemName,DeviceID,@{Name=»size»;Expression={«{0:N1}» -f($_.size/1gb)}},@{Name=»freespace»;Expression={«{0:N1}» -f($_.freespace/1gb)}}
на 2003 и ХП работает отлично, а на 7 и 2008 ругается на ошибку деления на ноль
ДмитрийЦитировать
ошибочка. скрипт работает если нет сидюков или дисков с нулевым сайзом, но если и поставить проверку на сайз=0 и т.о. исключить его из обработки, то все равно вываливаюсь с ошибкой деления на 0
Where-Object -FilterScript{$_.size -ne 0 -and $_.freespace/$_.size -lt 5/100 }
ДмитрийЦитировать
Не вижу ошибки и не могу предположить почему выдает деление на 0.
В скрипте указано что брать только Ficed диски
Деление на ноль можно обрабатывать через trap.
PS у вас powershell v2?
Сергей МариничевЦитировать
да, 2.0
Также, если в $i=Get-WMIObject Win32_LogicalDisk -computer (Get-Content servers.txt) | Select SystemName,DeviceID,@{Name=»size»;Expression={«{0:N1}» -f($_.size/1gb)}},@{Name=»freespace»;Expression={«{0:N1}» -f($_.freespace/1gb)}},@{Name=»freeproc»;Expression={«{0:N1}» -f(100*$_.freespace/$_.size)}}|Where-Object {$_.freeproc -lt 5 -and $_.freespace -gt 1}
$i
списке серверов оставить 1 сервер с диском проходящим для результата, то результат отобразит верно, но если в списке несколько серверов, то результаты непонятные… также если не подойдёт ни 1 из дисков, то отобразятся все
ДмитрийЦитировать
Ошибки не вижу. Вроде как выводит все корректно.
Остается предположить что надо с другого хоста попробовать
Сергей МариничевЦитировать
хм, с другого сработало корректно.
Окончательный вариант получился такого вида:
$i=Get-WMIObject Win32_LogicalDisk -filter «DriveType=3″ -computer (Get-Content C:\Backup_script\PowerShell\servers.txt)| Where-Object -FilterScript{$_.freespace -gt 1 -and $_.freespace/$_.size -lt 5/100 }
$r=$i| Select SystemName,DeviceID,@{Name=»size»;Expression={«{0:N1}» -f($_.size/1gb)}},@{Name=»freespace»;Expression={«{0:N1}» -f($_.freespace/1gb)}}
ForEach ($Info in $r)
{
Write-Host «sending mail»
$mail = New-Object System.Net.Mail.MailMessage
$mail.From = New-Object System.Net.Mail.MailAddress(«test@test.net»)
$mail.To.Add(«jabber@куданадо.ru»)
$mail.Subject = «Недостаточно свободного места.»;
$mail.Body = «На сервере » + $info.SystemName + » на диске » + $info.DeviceID + » недостаточно свободного места (менее 5%). Осталось: » + $info.FreeSpace + «Gb» + » из » + $info.size+»Gb»
$smtp = New-Object System.Net.Mail.SmtpClient
$smtp.host = «куданадо.ru»
$smtp.Send($mail)
}
Вот еще вопрос. Если компьютер не в домене, то как запустить с моей машины(доменной), но програмно указать другого пользователя? ну и в скрипте соответственно прописать домен.логин.пароль. Домен и логин то я нашел, а вот пароль нет
ДмитрийЦитировать
Интерактивно так
Get-WMIObject … -credential $cred
Если надо сохранить данные то вот так
1. сохраняем в файл
$credential.Password | ConvertFrom-SecureString | Set-Content $File
2. прочитать из файла
$credential = New-Object System.Management.Automation.PsCredential($user,$pwd)
$credential
3. использовать
Как то вот так. Надо проверить т.к. пишу по памяти
Сергей МариничевЦитировать